Google Maps への緯度経度変換

各所で報じられているとおり Google Maps の表示可能範囲が世界規模に拡張され、とくに衛星モード(Satellite)では日本上空から撮影した写真も呼び出せるようになり、ぐっと楽しくなりました。…が、残念ながら通常の地図モード(Map)がまだ白地図状態なので、思い通りの場所の写真を呼び出すのはちょっと難しいようです。そこで、MapFan Web のリンク用 URL に組み込まれた緯度経度を Google Map 用に変換するワンライナー(?)を書いてみました。

#('35.39.19.2' '139.44.55.0') with: #(320e-5 -325e-5) collect: [: hms : delta |
   | value |
   value := hms asInteger.
   value := ((hms replaceAll: $. with: $:) asTime asSeconds + (hms last digitValue * 0.1) 
      / 1 hours asSeconds) asFloat fractionPart + delta + value.
   (value asScaledDecimal: 6) printString allButLast: 2]

やっていることは単純で、度.分.秒 を 度 に変換しているだけです。あと、“なんちゃって”ではありますが測地系補正っぽいこともしています。


まず、Google Maps で行きたい場所を MapFan Web で、検索機能を利用するなどして表示します(スポット名検索でスポットにヒットしてしまった場合は「この場所を中心とした地図ページへ」で改めて通常画面に移動します)。画面左上にある「リンク URL」中の MAP= で始まる部分が、呼び出した地図の中心部の経度、緯度に相当します。


http://www.mapfan.com/index.cgi?MAP=E139.44.55.0N35.39.19.2&ZM=10


この URL 中にあるピリオドで区切られた4つの数値が、それぞれ、経度( E が冠されているもの)、緯度(N が冠されているもの)です。E 、N を含めず、数値とピリオドだけをレシーバの配列リテラルの要素(文字列リテラル)に緯度、経度の順(MapFan Web とは逆順)にペーストしてスクリプト全体を選択後、print it (alt/cmd + p) します。すると次のような出力が得られます。

=>  #('35.658533' '139.745361')

この結果中の要素それぞれを Google Maps の URL 中の対応する場所にペーストすれば(小数点以下だけでよいでしょう)ほぼ MapFan Web で呼び出した場所を同じ位置の写真を呼び出せるはずです。


http://maps.google.com/maps?ll=35.658533,139.745361&t=k



は? 緯度経度それぞれをいちいちコピペするのはめんどくさいから URL を吐きださせろ? ごもっとも。w

confirm mapFanUrl mapFanLl googleLl googleUrl
confirm := PopUpMenu confirm: 'Did you copy MapFan URL\before coming here?' withCRs. confirm ifFalse: [^ self]. mapFanUrl := Clipboard clipboardText asString. mapFanLl := (mapFanUrl subStrings: #($? $&)) second findBetweenSubStrs: #('MAP=E' 'N'). googleLl := mapFanLl reverse with: #(320e-5 -325e-5) collect: [: hms : delta | | value | value := hms asInteger. value := ((hms replaceAll: $. with: $:) asTime asSeconds + (hms last digitValue * 0.1) / 1 hours asSeconds) asFloat fractionPart + delta + value. (value asScaledDecimal: 6) printString allButLast: 2]. googleUrl := String streamContents: [: stream | stream nextPutAll: 'http://maps.google.com/maps?ll='. googleLl do: [: degree | stream nextPutAll: degree] separatedBy: [stream nextPut: $,]. stream nextPutAll: '&t=k']. Clipboard clipboardText: googleUrl. PopUpMenu inform: 'Clipboard text has been replaced\with Google Maps URL.' withCRs. ^ googleUrl

MapFan Web で「リンクURL」をコピーしてからこのスクリプトを do it (alt/cmd + d) すると、クリップボード内のテキストが Google Maps の URL に置換されますので、そのまま WWW ブラウザ URL 入力欄にペーストすればOKです。


SqueakNihongo7 を含む、Squeak 3.7、3.8 で動きます。あと、Squeak システムが踏み台にしている OS のクリップボード(ペーストボード)との相性がありますが…(とりあえず Mac OS 9、OS X、Win XP ではだいじょうぶなようです)