Cyber Earthをハックしてみる
地図好きとしては、前置きをダラダラ書きたくなる。
地図が好きだ。昔から地図ソフトをよく使ってた。MapFanとか電子地図帳Zとか。電子地図帳Zでズリズリできること、3D表示ができることに感動した。そしてMapionとかのWeb地図の出現。無料で使えることに驚いた。そして当然ながら常に最新の地図なのでよく使っていた。でも使い勝手はローカルにインストールした地図ソフトに負けていた。そしてGoogleMap。ローカルにインストールした地図ソフトが不要になった。ドラッグによる移動、ホイールによる拡大縮小。そして航空写真による地図の出現。Google Earthが最初だったかと思うが、すぐにインストールした。航空写真は荒くて日本は都心以外では使い物にならなかったが、世界中の航空写真を眺めて時間を浪費した。
そのGoogle Earthに足りないもの、それは地図だと思っていた。写真が不鮮明な地域だと顕著だった。道路とかは表示されたが地図として使うことはできなかった。オーバーレイでGoogle Mapのデータを重ねるものもがあって、それを使っていた。Google Mapのバージョンアップの度に更新したりしていた。でも何かが足りなかった。
で、見つけたのがCyber Earth。国土地理院の電子国土用データをオーバーレイするものだ。天下の国土地理院のあのデータだ。
だが問題もあった。作者は、ローカル環境にCGIをインストールして使って欲しい意図のようで、ソースコードも更改しているが、書かれている言語がGuacheというScheme系言語。自分としてはお宅サーバにインストールしたいのだが当時Debianにインストールできるものはバージョンが古く使えなかった。これに関してはオンライン版を公開してくれていたため、使うことはできていた。
他の問題として、オーバーレイが不透明度100%で表示されてしまうため、航空写真がまったく見えなくなるというものがあった。Google Mapのように、地図か航空写真かという選択しかなかった。でもオーバーレイは不透明度を任意に帰ることができる。50%にすれば両方を同時に見ることができるはず。なんとかできないかと頑張ったがGuacheのコードをPerlに移植する前に諦めていた。
この前のサーバアップデートで最新のGuacheが使えるようになり、思い出してインストールしてみた。動いた。ということでCyber Earthをハックした。*1
- キャッシュモードとダイレクトモードをGoogle Earth側で切り替えられるようにする
- 不透明度をGoogle Earth側で設定できるようにする
Cyber Earthオリジナルでは、キャッシュモードとダイレクトモードはCGIの環境で切り替えている。これをGoogle EarthからURLのパラメータで渡すことで、CGI側に手を入れずに簡単に切り替えられる。Google Earthでは緯度経度などのパラメータをGETリクエストで追加しており、それとの干渉があるかもと思われたが、さすがGoogle、URLを解釈した上でパラメータを追加しており、大丈夫だった。
次に不透明度だが、これはこれで問題があった。不透明度を指定するのは画像ファイル単位で、オーバレイ全体の不透明度は指定できないという仕様があった。画像単位で指定すれば済む話ではあったのだが。
ということでdiffってみる。
cyber-earth.cgi
28,29c28,29 < (define (direct-mode?) < (file-exists? *direct-mode-file*)) --- > ;(define (direct-mode?) > ; (file-exists? *direct-mode-file*)) 95c95 < (define (gen-one-overlay lev wsec ssec) --- > (define (gen-one-overlay lev wsec ssec mode alpha) 97a98 > (color ,(format #f "~2,'0xffffff" alpha)) 100c101 < (if (direct-mode?) --- > (if (< mode 1) 116a118,119 > (mode #f) > (alpha #f) 131a135,137 > (set! mode (string->number (cgi-get-parameter "MODE" param))) > (set! alpha (string->number (cgi-get-parameter "ALPHA" param))) > 200c206 < (gen-one-overlay lev wsec ssec))) --- > (gen-one-overlay lev wsec ssec mode alpha)))
で、cyber-earth.kmlをこんな感じにする。
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> <Document> <name>Cyber Earth Revo</name> <visibility>0</visibility> <open>1</open> <NetworkLink> <name>DIRECT 40%</name> <visibility>0</visibility> <Link> <href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=0&ALPHA=100&</href> <viewRefreshMode>onStop</viewRefreshMode> <viewRefreshTime>3</viewRefreshTime> <viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&lookatLon=[lookatLon]&lookatLat=[lookatLat]&lookatRange=[lookatRange]&lookatTilt=[lookatTilt]&version=20080122</viewFormat> </Link> </NetworkLink> <NetworkLink> <name>DIRECT 70%</name> <visibility>0</visibility> <Link> <href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=0&ALPHA=180&</href> <viewRefreshMode>onStop</viewRefreshMode> <viewRefreshTime>3</viewRefreshTime> <viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&lookatLon=[lookatLon]&lookatLat=[lookatLat]&lookatRange=[lookatRange]&lookatTilt=[lookatTilt]&version=20080122</viewFormat> </Link> </NetworkLink> <NetworkLink> <name>DIRECT 90%</name> <visibility>0</visibility> <Link> <href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=0&ALPHA=230&</href> <viewRefreshMode>onStop</viewRefreshMode> <viewRefreshTime>3</viewRefreshTime> <viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&lookatLon=[lookatLon]&lookatLat=[lookatLat]&lookatRange=[lookatRange]&lookatTilt=[lookatTilt]&version=20080122</viewFormat> </Link> </NetworkLink> <NetworkLink> <name>Cache 70%</name> <visibility>0</visibility> <Link> <href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=1&ALPHA=180&</href> <viewRefreshMode>onStop</viewRefreshMode> <viewRefreshTime>3</viewRefreshTime> <viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&lookatLon=[lookatLon]&lookatLat=[lookatLat]&lookatRange=[lookatRange]&lookatTilt=[lookatTilt]&version=20080122</viewFormat> </Link> </NetworkLink> </Document> </kml>
これが不透明度40%くらい。
こっちは70%くらい。
(一応最小限の引用だけどNGだったら消します)
ということで仕事探しながらの地図三昧だったりします。
*1:そう書くと簡単だけどGuacheの勉強からなので結構苦戦した。