ケータイでグーグルマップが便利に見れたらなということで、「ここらで」を作成しましたが、やっぱり衛星写真も見たい。
ということで、ケータイで衛星写真を見る「そらから」を作成し、「ここらで」と連携させました。
ケータイで現在位置の衛星写真を見る事ができるのはちょっと「24」みたいな気分ですね。(もちろん今の衛星写真じゃないですが)
そらから
http://saya.s145.xrea.com/x/ggltile.cgi?lat=(緯度)&lon=(経度)&zoom=(ズーム)
5で拡大、0で縮小、1−9で移動、#で地図、*で衛星
ここらで
http://saya.s145.xrea.com/x/kkrd.cgi
GPSや簡易位置測定、キーワード、住所検索等で現在位置を表示後、「そらへ」を選択して、「ここらで」ボタンを押すと、中心位置を指定位置として「そらから」へジャンプ
「そらから」は、指定位置を含む衛星写真を見る事ができ、拡大/縮小や移動も可能です。ただし、Google Mapsのタイル画像をそのまま使っているので下記のような制約があります。
・指定位置が中心になりません。あくまでも指定位置を”含む”衛星写真を表示できるだけです。
・拡大・縮小も指定位置を含む画像として拡大・縮小します。
・移動はタイル画像の幅だけ経度緯度をシフトして表示します。
・衛星写真と地図を切り替える事ができるのですが、地図はPNG画像なので、ドコモの携帯では表示できません。
・Googleの仕様変更・その他の理由で表示できなくなる可能性があります。
経度緯度からタイル画像のURLを導くアルゴリズムは、現在は下記のような感じにしています。
my $rd = $pi / 180;
my $server = int(rand(4));
sub latlon2sat {
my ($lat,$lon,$zoom) = @_;
my $sat_url = “http://kh$server.google.com/kh?n=404&v=3&t=t”;
my $maxx = 2**$zoom;
my $x = int(lon2x($lon)*$maxx);
my $maxy = 2**$zoom;
my $y = int(lat2y($lat)*$maxy);
my $rx;
my $ry;
my $loc;
for(my $i = 0; $i < $zoom; $i++){ $rx = $x%2; $x = int($x/2); $ry = $y%2; $y = int($y/2); if($rx == 1){ if($ry == 1){ $loc = "s".$loc; }else{ $loc = "r".$loc; } }else{ if($ry == 1){ $loc = "t".$loc; }else{ $loc = "q".$loc; } } } return("$sat_url$loc"); } sub latlon2map { my ($lat,$lon,$zoom) = @_; my $map_url = "http://mt$server.google.com/mt?n=404&v=ap.41"; my $maxx = 2**$zoom; my $x = int(lon2x($lon)*$maxx); my $maxy = 2**$zoom; my $y = int(lat2y($lat)*$maxy); my $zm = 17-$zoom; return("$map_url&x=$x&y=$y&zoom=$zm"); } sub lat2y{ my($lat) = @_; my $phi = $rd*$lat; my $res = 0.5*log((1+sin($phi))/(1-sin($phi))); my $y = (1-$res/$pi)/2; return($y); } sub y2lat{ my($y) = @_; my $lat = -($pi/2)+(2*atan2(exp(-1.0*(2*$y-1)*$pi),1)); my $latdeg = $lat/$rd; return($latdeg); } sub lon2x{ my($lon) = @_; return(($lon+180)/360); } sub x2lon{ my($x) = @_; return($x*360-180); }