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&amp;ALPHA=100&amp;</href>
			<viewRefreshMode>onStop</viewRefreshMode>
			<viewRefreshTime>3</viewRefreshTime>
			<viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;lookatLon=[lookatLon]&amp;lookatLat=[lookatLat]&amp;lookatRange=[lookatRange]&amp;lookatTilt=[lookatTilt]&amp;version=20080122</viewFormat>
		</Link>
	</NetworkLink>
	<NetworkLink>
		<name>DIRECT 70%</name>
		<visibility>0</visibility>
		<Link>
			<href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=0&amp;ALPHA=180&amp;</href>
			<viewRefreshMode>onStop</viewRefreshMode>
			<viewRefreshTime>3</viewRefreshTime>
			<viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;lookatLon=[lookatLon]&amp;lookatLat=[lookatLat]&amp;lookatRange=[lookatRange]&amp;lookatTilt=[lookatTilt]&amp;version=20080122</viewFormat>
		</Link>
	</NetworkLink>
	<NetworkLink>
		<name>DIRECT 90%</name>
		<visibility>0</visibility>
		<Link>
			<href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=0&amp;ALPHA=230&amp;</href>
			<viewRefreshMode>onStop</viewRefreshMode>
			<viewRefreshTime>3</viewRefreshTime>
			<viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;lookatLon=[lookatLon]&amp;lookatLat=[lookatLat]&amp;lookatRange=[lookatRange]&amp;lookatTilt=[lookatTilt]&amp;version=20080122</viewFormat>
		</Link>
	</NetworkLink>
	<NetworkLink>
		<name>Cache 70%</name>
		<visibility>0</visibility>
		<Link>
			<href>http://localhost/cgi-bin/cyber-earth.cgi?MODE=1&amp;ALPHA=180&amp;</href>
			<viewRefreshMode>onStop</viewRefreshMode>
			<viewRefreshTime>3</viewRefreshTime>
			<viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;lookatLon=[lookatLon]&amp;lookatLat=[lookatLat]&amp;lookatRange=[lookatRange]&amp;lookatTilt=[lookatTilt]&amp;version=20080122</viewFormat>
		</Link>
	</NetworkLink>
</Document>
</kml>


これが不透明度40%くらい。



こっちは70%くらい。
(一応最小限の引用だけどNGだったら消します)


ということで仕事探しながらの地図三昧だったりします。

*1:そう書くと簡単だけどGuacheの勉強からなので結構苦戦した。