GIS, Javascript |
LocaPointを見つけたらリンクします。デフォルトではGoogle Maps。Greasemonkeyの「User Script Commands」でリンク先を変更できます。(使うと不具合が出ます → 改善)
// ==UserScript==
// @name locapoint link
// @namespace http://d.hatena.ne.jp/arikui/
// @include *
// @exclude http://maps.google.co.jp/*
// ==/UserScript==
var mapURL = GM_getValue("url") || "http://maps.google.co.jp/";
var param = GM_getValue("param") || "q=%lat%,%lon%";
var r = /([A-Z][A-Z][0-9]\.[A-Z][A-Z][0-9]\.[A-Z][A-Z][0-9]\.[A-Z][A-Z][0-9])/g;
var w = window;
w.addEventListener("load", function(){
var text = document.body.innerHTML;
document.body.innerHTML = text.replace(r, function($0){
var lonlat = LocaPoint2LatLon($0);
var p = param.replace(/%lat%/g, lonlat.latitude).replace(/%lon%/g, lonlat.longitude);
return ["<a href='",mapURL,"?",p,"' title='lat,lon=",lonlat.latitude,",",lonlat.longitude,"'>",$0,"</a>"].join("");
});
}, false);
GM_registerMenuCommand("locapoint link", function(){
var url = prompt("map service URL", mapURL);
var prm = prompt([
"parameters",
"latitude : %lat%",
"longitude: %lon%"
].join("\n"), param);
url = (url)? url : mapURL;
prm = (prm)? prm : param;
GM_setValue("url", url);
GM_setValue("param", prm);
mapURL = url;
param = prm;
location.reload();
});
//Deocde
function LocaPoint2LatLon(locapoint){
var location = {
latitude: (
(locapoint.charCodeAt(0) - 65) * 1757600
+(locapoint.charCodeAt(1) - 65) * 67600
+(locapoint.charCodeAt(2) - 48) * 6760
+(locapoint.charCodeAt(8) - 65) * 260
+(locapoint.charCodeAt(9) - 65) * 10
+(locapoint.charCodeAt(10)- 48) * 1
) * 180 / 45697600 - 90,
longitude: (
(locapoint.charCodeAt(4) - 65) * 1757600
+(locapoint.charCodeAt(5) - 65) * 67600
+(locapoint.charCodeAt(6) - 48) * 6760
+(locapoint.charCodeAt(12)- 65) * 260
+(locapoint.charCodeAt(13)- 65) * 10
+(locapoint.charCodeAt(14)- 48) * 1
) * 360 / 45697600 - 180
};
return(location);
}
//Encode
function LatLon2LocaPoint(location){
var latitude_step = (location.latitude + 90) / 180 * 45697600;
var longitude_step = (location.longitude + 180) / 360 * 45697600;
var locapoint = String.fontCharCode(
latitude_step/1757600 % 26 + 65,
latitude_step/ 67600 % 26 + 65,
latitude_step/ 6760 % 10 + 48,
46,
longitude_step/1757600 % 26 + 65,
longitude_step/ 67600 % 26 + 65,
longitude_step/ 6760 % 10 + 48,
46,
latitude_step/260 % 26 + 65,
latitude_step/ 10 % 26 + 65,
latitude_step/ 1 % 10 + 48,
46,
longitude_step/260 % 26 + 65,
longitude_step/ 10 % 26 + 65,
longitude_step/ 1 % 10 + 48
);
return(locapoint);
}
サンプルコードがありますが、Javascriptのは間違ってるので注意。
サイト側で何らかのメニュー設定をページに定義しておいて、それをブラウザが読んでメニューとして表示する、みたいのがあれば面白いのにな。TOPページへのリンクとか、複雑な操作なんかも。表示をクライアントが設定できていい。