まず知っておかなければならないことが、
経度、緯度の表し方がいろいろとあるということです。
まず大きな違いが、日本測地系と世界測地系です。
同じ地点でも、この違いにより世界測地系の方が
南東におよそ450mずれた地点を表すことになります。
【参考】東京都庁の経度、緯度
日本測地系・・経度:139.69487、緯度:35.68627
世界測地系・・経度:139.69167、緯度:35.68949
それでは、それぞれの値を変換するにはどうすればいいでしょうか。
次のような式があります。変数の定義は次の通りです。
(ln:入力経度、la:入力緯度、lng:変換後経度、lat:変換後緯度)
日本→世界
lng = ln - la * 0.000046038 - ln * 0.000083043 + 0.010040;
lat = la - la * 0.00010695 + ln * 0.000017464 + 0.0046017;
世界→日本
lng = ln + la * 0.000046047 + ln * 0.000083049 - 0.010041;
lat = la + la * 0.00010696 - ln * 0.000017467 - 0.0046020;
次の違いが度表示、度分秒表示などによる違いです。
(時間の計算で「12分15秒→12.25分」などと同じような変換です)
【参考】東京都庁の経度、緯度
日本測地系(度)・・経度:139.69487、緯度:35.68627
日本測地系(度分秒)・・経度:139.41.41.53、緯度:35.41.10.57
JavaScriptでの変換プログラム例です。
Perl、PHPで使用したい場合は適宜変更してください。
度→度分秒(ddd.mm.ss.ss)
(innum:入力数値(ddd.ddd形式)、outnum:変換後数値)
EH = parseInt(innum);
EM = parseInt((innum-EH)*60);
ES = (innum-EH-(EM/60))*3600;
ESS = (Math.round(ES*10)/10);
if(EM<10){EM = "0"+EM;}
if(ESS<10){ESS = "0"+ESS;}
if((ESS+"").indexOf(".") == -1){ESS = ESS+".0";}
outnum = EH+'.'+EM+'.'+ESS;
度分秒(ddd.mm.ss.ss)→度
(innum:入力数値(ddd.nn.ss.ss形式)、outnum:変換後数値)
tmp_in = innum.split(".");
outnum = parseInt(tmp_in[0])+(((tmp_in[1]*60+parseInt(tmp_in[2])+tmp_in[3]/10)*1000)/3600000);
困ったことに現在の対応状況は
・Google Maps API 【世界測地系】 【度表示】
・mapionなど国内主要地図サイト 【日本測地系】 【度分秒表示】
・AUGPSケータイ 【どちらも可(datum、unit変数で指定)】
と、バラバラですので変換して統一する必要があります。
ということで、当サイトは、Google Maps API などで表示するデータも
すべて日本測地系、度分秒表示に変換して表示しています。
コメントする