2008 年 8 月 のアーカイブ

イーモバイルのサービスエリアを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キャリアのサービス提供エリアも同じことをする(調べたところ、全キャリアで画像によるサービスエリア表示をしていたので可能)。

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

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

初めてのジオキャッシングをやってみたよ

20080809

緯度経度で場所を指定され、その場所に行けばお宝がGETできるというゲーム、ジオキャッシングに挑戦してみた(+PeerCastで生中継)。

Yatsuomote mountain

西尾市の北東に位置する八ツ面山の山頂付近にあるキャッシュ。

20080809 西尾ジオキャッシング1 from Inagaki on Vimeo.
自転車で現場へ向かうまで

20080809 西尾ジオキャッシング2 from Inagaki on Vimeo.
八ツ面山でジオキャッシングをする!

The secret base of children

西尾市の市街にある西尾市歴史公園内のキャッシュ。

20080809 西尾ジオキャッシング3 from Inagaki on Vimeo.
八ツ面山のジオキャッシングの続きと歴史公園への移動(途中に寄ったコンビニでは編集をいれてます)

20080809 西尾ジオキャッシング4 from Inagaki on Vimeo.
歴史公園でジオキャッシング!

で。

残念ながら両方ともキャッシュの獲得ならず。本当に悔しい。

でも、経験したことのない・することのない機会を作ってくれるジオキャッシングというゲームは面白いね。西尾にこんなところがあったのかという発見だけでも、十分すぎるほどの収穫です。

次回やる場合は、スコップなどの掘る物・軍手・虫除けは必須。

さて、どこに行こうかな。

Xactiの自転車マウントを作ってみた

20080803_2 

PeerCastで葡萄さんの自転車配信を見てて、Xactiのマウントの作り方を訊いて、教えてもらったので、早速ホームセンターに行って、材料買って、作ってみた。

20080803_3

 使った材料
アルミ カナオレ GB ALA-60…315円
ミニカナグ LK12…136円×4
マゲイタ クロ NO.60…315円×1
キャップ(ボルト) 5×40…260円
キャップ(ボルト) 5×15…260円
スベリドメ…128円
自転車取り付け金具…以前のマウントであるベロムービーを流用
蝶ナット…家にあったもの

作り方

  1. 「アルミ ナカオレ」を「自転車取り付け金具」に15mmのボルトで固定
  2. L字型の「ミニカナグ」を「アルミ ナカオレ」に15mmのボルトで固定。2つをまとめて上下2ヵ所
  3. Xactiと「ミニカナグ」の接触部を「スベリドメ」で巻いて、万能ボンドでくっつける、極めつけにホットボンドで固定
  4. 「アルミ ナカオレ」にサイズ間違えて中途半端に人力で曲げた「マゲイタ クロ」を取り付ける(これ、あまり必要ない)
  5. 「アルミ ナカオレ」の穴に40mmのボルトを通して、「蝶ナット」で締め上げれば

    できあがり^^

    意外と簡単に、安価に、しっかりと固定できるようなマウントができたー。ちょっと走りに行ってくる

岡崎の花火

20080803

ヒドイ。

花火開始4時間前に来てるのに、ガムテープで四角を作った中に名前が書いてあるだけという無人の場所取りで花火の見られる場所は皆無。花火開始してから数分で4時間死守した席を明け渡し、自転車でいい場所を探すはめに。

少し遠くなってしまったけど、ショッピングセンターの駐車場で妥協し、無事に花火中継ライブができました、やったね^^v

    今回の反省点

  • イーモバイルの上り帯域が60kくらいしかでなかったので、ビットレートを60kほどで配信。映像は仕方ないとしても、音声に割くビットレートが10kくらいだとウニョウニョというノイズが酷い。
  • 途中でビットレートを上げたんだけど、なぜだか音声が調子悪い状況は変わらず ><、設定変える場合はWMEを再起動した方がいいかも。

GPSは終始うまくいったっぽい。家についたあともGPSのログを確認して、通った道を再確認できるし、本当におもしろい。自転車乗りはGPSロガー持つべし。
あとは、ノートの外部電源の確保とXactiのマウント部分を改善すれば、長距離の旅行もリアルタイムで配信できるかな。

jQuery Sparklinesはプチ便利

20080801

jQueryのプラグインで、ちょっとしたグラフを表示したいときに何も考えなくても配列あたえるだけで使えちゃうし、インラインの数値を読み取ってグラフ化もしてくれる。

だけど、軸のあるグラフを作りたいときには向かないね。ちょうど、海抜高度の連続をグラフ化しようとしてたんで、これ使ったんだけど、上限下限の幅を配列の最大値、最小値から計算しちゃうんで、相対的な高低しかわからなくなってしまって、ゆるやかな坂も急激な崖も連続して登っているかぎりは同じグラフになってしまう。という問題。

ソース見てrangeで幅を設定していたので、そこらへんをコード中で固定し、あとは最小値を配列の最後の値-rangeという具合にしたら、そこそこうまくいった。

どうせなら、オプションとして採用してもらえると楽なので作者にメールを送っておいた。英文メールを書くのは大学卒業して以来かもしれないw

Live GPS Tracking
http://inagaki.co.uk/misc/gps/

の右上で使ってます。