‘Google Maps’ タグのついている投稿

名古屋都心の廃線「南方貨物線」を大府駅から自転車で辿ってみた


大きな地図で見る

南方貨物線とコアラの謎

コアラがいる!!

Google Maps の航空写真でコアラを見つけたとき、興奮して上のような投稿をTwitterにしたのを覚えている。

そもそも、なんでこのコアラを見つけたかというと、Wikipediaで南方貨物線という名古屋の廃線に興味を抱き、Google Mapsの航空写真モードで線路跡を大府駅から辿っていったときに偶然見つけたのだ。

南方貨物線(なんぽうかもつせん)とは、日本国有鉄道(国鉄)が名古屋貨物ターミナル駅(1980年開設)から笠寺駅・大府駅を結ぶことを目的に建設を行い、途中でそれが中断された東海道本線の貨物支線(未成線)である。建設は輸送力の増強が目的であったため、日本鉄道建設公団でなく国鉄自身の手で行われた。

引用:南方貨物線 – Wikipedia より

このコアラはなんなのか?そして、南方貨物線を実際に辿って見てみたくなり、自転車で廃線沿いを走ってみることにした。

(さらに…)

Google Maps API V3 と Gears Geolocation API 使って Android のブラウザで現在位置情報を取得する

先日のGoogle Developer Day 2009 にて、GoogleさんからAndroid携帯である GDD Phone をいただいたので、早速Androidライフを楽しんでる毎日です。素敵なオモチャをありがとうございます!

ネイティブアプリの地図でGoogle Latitudeをいぢりたおしたりしてるんですが、地図大好きっ子としては自分で位置情報を活用したいところ。

そんな折、ジークルーの佐々木さんから

@shinagaki 自分が今日どこを歩いたかが履歴でMapに表示されるAndroidアプリって知らない?

って遠まわしに作れって言われた気がしたので、Android界隈の位置情報について調べてみる。

(さらに…)

Googleの逆ジオコーディングをためしてみた

ジオポの地図表示で住所を出したかったので逆ジオコーディング(緯度・経度から住所を取り出すこと)をGoogleのAPI使ってやってみました。

まず基本

Google MapsのAPIと違って、日本語での情報が少ない(マニュアル)けど、

http://maps.google.com/maps/geo?ll=35,135&output=xml&key=GOOGLE_MAPS_API_KEY&hl=ja&oe=UTF8

URLはこのサンプルみたいにして、HTTP GETでXMLが取得できる。

リクエストパラメーター
ll 緯度・経度(qでもいいと思う。違いがわからないよ><)
output xml、kml、cvs、json
key Google maps APIキー
hl 言語(日本語だとja、英語ならen)。住所記述方法にも影響
oe 文字エンコード
レスポンス(XMLをsimple_xmlでパースした場合)
$parsed_xml
->Response->Status->code
ステータスコード
$parsed_xml
->Response->Placemark
Arrayで結果が複数入る
以下 Placemark[0]が親とする  
AddressDetails[‘Accuracy’] 精度。後述
address 住所。言語によって記述方法が変化。日本語だと[県][市][町] って具合だけど、英語だと [Street], [City], [Prefecture]
あと、住所には国名が含まれる。
AddressDetails->Country
->CountryNameCode
国のコード。JP
AddressDetails->Country
->CountryName
日本
AddressDetails->Country
->AdministrativeArea
->AdministrativeAreaName
東京都
AddressDetails->Country
->AdministrativeArea
->Locality
->LocalityName
渋谷区
AddressDetails->Country
->AdministrativeArea
->Locality
->DependentLocality
->DependentLocalityName
渋谷
AddressDetails->Country
->AdministrativeArea
->Locality
->DependentLocality
->Thoroughfare
->ThoroughfareName
1丁目26
AddressDetails->Country
->AdministrativeArea
->Locality
->DependentLocality
->PostalCode
->PostalCodeNumber
日本だと取れない。アメリカだけかな?

基本的に詳細な住所ほど、先頭にくるのでPlacemark[0]を見れればokとか考えていたらハマった。

(さらに…)

イーモバイルのサービスエリアをGoogle Earthに重ねてみる

20080811  

携帯電話のサービスエリアって繋がるのが当然になってあまり気にしなくなっていたんだけど、イーモバイルはサービスエリアが都市部に限定されてるから、否が応でも気にしないと大変なことになる。

それで、イーモバイルのサイトにはEM モバイルブロードバンドサービスエリアとしてサービス提供地域が確認できるようになってるんだけど、Googleマップみたいにドラッグでスクロールできるわけでもなく、いまいちな使い勝手。
他にはPDFでもダウンロードできるようになってて、印刷するには丁度いいんだけど、サイト上で見られる提供地域よりも古い情報(2008年5月)となってるし、解像度がいまいち。

上の画像はサイトのPNG画像とPDFを比較してみた図。

そこで、サイトのPNG画像を取得してGoogle Earthにオーバーレイできればよくない?いいんじゃね!

ということで作ってみる。

イーモバイルの画像ファイルについての考察1

まず、重ね合わせる元となるPNG画像を取ってこないといけないんだけど、ファイル名の命名規則を調べて、効率的に取ってこないと駄目だよね。

イーモバイルサイトで表示サービスエリアの移動操作はJavaScriptを使ってるので、そのソースを見て、なんとなく動作を理解する。

どうやら、緯度・経度がファイル名に対応しているらしい。第一段階はこんな具合。

http://emobile.jp/area/area/map1/5236/5236.png
map1:ズーム(横幅)。map1は横幅160km。
5236:前の2桁が緯度の軸、後ろの2桁が経度の軸。んで、後から色々試してわかったんだけど、前の2桁は2/3でかけると緯度となり、後ろの2桁は100を足すと経度となる。
加えて画像ファイルの表示範囲は上下左右位置の画像ファイルと半分重なるようになっている。

画像が提供されないエリアについては、下のソースみたくJavaScriptでフラグが管理されてあるのでそれを読み取ってエクセルにマッピングしてみた。

    var inflag;
    inflag = 1;
    if (Mesh_1_XX <= 21) {
        inflag = 1;
    }
    else if (Mesh_1_XX <= 25) {
        if (Mesh_1_YY >= 36 && Mesh_1_YY <= 38) {
            inflag = 0;
        };
    }
    else if (Mesh_1_XX <= 27) {
        if (Mesh_1_YY >= 36 && Mesh_1_YY <= 40) {
            inflag = 0;
(以下省略)

20080811_2

これで、第一段階のKMLはPHPで生成して完成。

<?php

print '<?xml version="1.0" encoding="UTF-8"?>'."n";
print '<kml xmlns="http://earth.google.com/kml/2.2">'."n";
print '<Document>'."n";
print '	<name>emobile</name>'."n";

for($i=36;$i<=68;$i++){
	for($j=22;$j<=45;$j++){

		$inflag = 1;

		if ($j <= 21) {
			$inflag = 1;
		}elseif ($j <= 25) {
			if ($i >= 36 && $i <= 38) {
				$inflag = 0;
			};
		}elseif ($j <= 27) {
			if ($i >= 36 && $i <= 40) {
				$inflag = 0;
			};
		}elseif ($j <= 29) {
			if ($i >= 39 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 30) {
			if ($i >= 42 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 31) {
			if ($i >= 45 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 35) {
			if ($i >= 49 && $i <= 54) {
				$inflag = 0;
			};
		}elseif ($j <= 38) {
			if ($i >= 49 && $i <= 57) {
				$inflag = 0;
			};
		}elseif ($j <= 39) {
			if ($i >= 49 && $i <= 64) {
				$inflag = 0;
			};
		}elseif ($j <= 41) {
			if ($i >= 52 && $i <= 68) {
				$inflag = 0;
			};
		}elseif ($j <= 42) {
			if ($i >= 58 && $i <= 68) {
				$inflag = 0;
			};
		}elseif ($j <= 43) {
			if ($i >= 62 && $i <= 67) {
				$inflag = 0;
			};
		}elseif ($j <= 45) {
			if ($i >= 64 && $i <= 66) {
				$inflag = 0;
			};
		};

		if($inflag){
			continue;
		}

		print '	<GroundOverlay>'."n";
		print '		<name>emobile</name>'."n";
		print '		<Icon>'."n";
		print '			<href>http://emobile.jp/area/area/map1/'.$i.$j.'/'.$i.$j.'.png</href>'."n";
		print '		</Icon>'."n";
		print '		<LatLonBox>'."n";
		print '			<north>'.(($i+2)/3*2).'</north>'."n";
		print '			<south>'.($i/3*2).'</south>'."n";
		print '			<east>'.($j+2+100).'</east>'."n";
		print '			<west>'.($j+100).'</west>'."n";
		print '		</LatLonBox>'."n";
		print '	</GroundOverlay>'."n";
	}
}

print '</Document>'."n";
print '</kml>'."n";

?>

イーモバイルの画像ファイルについての考察2

第一段階では解像度になっとくできないので、第二段階(横幅40km)を取ってくることにする。

http://emobile.jp/area/area/map2/5236/52364D.png

52364D:前の4桁については第一段階と同じ、後ろの2文字は第一段階のエリアを16分割した場所を示す。

上を北にした地図表現だと次のような場所。

3C 3D 4C 4D
3A 3B 4A 4B
1C 1D 2C 2D
1A 1B 2A 2B

これさえわかれば、あとは同じなので、KMLにしてGoogle Earthで表示してみる。

死亡。

オーバーレイの画像をインターネットから取得して読み込んでいき、沖縄から九州まで時間をかけながら徐々に埋まっていくんだけど、福岡が見えないうちに動作が重たくなって、しまいにはGoogle Earthが落ちた。

よく考えれば、4000枚ものPNG画像をダウンロードしながら表示させるなんて無理ありすぎです。ごめんなさい。

それならば画像を合成してやればok

何度も画像をダウンロードしてるようだとイーモバイルに怒られるので、一旦ローカルに保存してから、それをPHPで16枚を1枚の画像に合成。

あとは第一段階のKMLを修正(重ね合わせの範囲が違うので)して、ようやくやりたいことができた!

20080811_3

発展としては、サービス提供エリアを画像認識でトレース→ベクトルデータに変換→SWFに。

イーモバイルだけじゃなく他の3キャリアのサービス提供エリアも同じことをする(調べたところ、全キャリアで画像によるサービスエリア表示をしていたので可能)。

全キャリアの重ね合わせをトグルできるようにして、キャリアごとにサービスエリアを比較できるようになっちゃう!!!

需要あるのかわかんないけど、勉強がてら近いうちにやってみたい。