避難経路マップを作る

防災をネタにGoogleMapのAPIを勉強している。今回は避難経路マップを作る。HTMLとJavaScriptのプログラミングが必要だが、Googleのサンプルをほぼそのまま使うので、コードを書く必要はほとんどない。

 

まず、近所の避難場所の情報を集めてくる。

住所があれば良いのだが、小学校名や施設の名前でも検索ができる。

次にGoogleMapAPIのページからサンプルを取ってくる。持っていない人はGoogleAPIのキーも手に入れる必要がある。

このページの最初のサンプルはプルダウンメニューから出発点と目的地を選ぶようになっている。このプルダウンメニューのデータを書き換える。valueに入っている値を避難場所の名前(例えば「○○小学校」)などに変更するだけでよい。このままでは車で移動するルートを検索してしまうので、travelMode: google.maps.TravelMode.DRIVINGtravelMode: google.maps.TravelMode.WALKINGに書き換える。

本来であればAとBの位置を割り出し、ルートを検索し、受け取ったデータを地図上に解釈するという手続きが必要なのだが、それはすべてAPIがやってくれる。ズーミングも自動で行われる。つまり、何のプログラミングも必要ないのである。

directionsDisplay.setPanel(document.getElementById(“directionsPanel”));という一文を加え、displayエリアのdiv(idをdirectionsPanelとする)を追加すると経路図も表示してくれる。

出発点の住所を入力できるようにしたければ、プルダウンメニューをテキストボックスに書き換えてやればよいだろう。

このプログラムでは最短距離が自動的に検索される。ユーザーが自分で経路を考えたい場合にはdirectionsDisplay = new google.maps.DirectionsRenderer();directionsDisplay = new google.maps.DirectionsRenderer({draggable:true});と書き換える。すると、経路が動かせるようになる。経路を動かすと自動的に所要時間が再計算される。これもAPIでやってくれるので、自分でプログラミングする必要はない。

map持ち運び可能なタブレット端末がある場合には現地のロケーションを使用することも可能。現地ロケーションを探す機能をジオ・ロケーションと呼ぶらしく、情報取得のサンプルはここから入手できる。ここで取得した値を単にstartに代入すればよいだけらしい。つまり文字列が住所なのか施設名なのかそれとも座標なのかはGoogleで勝手に判断してくれるようだ。

今回は避難経路地図を例題にして勉強したのだが、もちろんこの地図は会社案内の道順案内にも応用が聞く。トラベルモードにトランジット(TRANSIT)という選択肢があり、乗り換え案内にも対応しているらしいのだが、アメリカ国内だけの対応らしい。試しに経路検索したところ、ロスアンゼルスからサンフランシスコまでバスで行けという指示になった。その内に日本でも導入されるかもしれない。

GoogleMapでご近所の災害マップを作る

GoogleMapを使うと写真をマップ上で共有することができる。この仕組みを使うと様々な地図を手軽に作成できる。例えば、防災情報などを集めておくと「近所の災害マップ」を作れる。地域で共有すれば避難経路などを話し合うのに役立つかもしれない。もちろん、旅行の記録を保存したり、ラーメン屋マップを作る事もできるだろう。

最低限必要なものはGPS機能のついたスマホ作業ができるパソコンだ。プログラムが必要のない方法もあるが、JavaScriptとPHPの簡単な知識があればより高機能な地図を作る事もできるだろう。

まず、iPadやiPhotoなどのスマートフォンを使って近所の危険箇所の写真を撮影する。すると、自動的にGeocodeという位置情報が記録されている。ガラケーの場合、写真を撮影したら手動でGPSデータを付加する必要がある。こうした位置情報をGeoコードとかGeoタグと呼ぶ。

最も簡単な方法:Picasa Webを使う

picasaまず、Googleのアカウントを作る。次にPicasa Webに行きGoogleアカウントでログインする。次に右上にある歯車マークにマウスを合わせ[設定]を選択する。設定では[場所]にある二つのチェックボックスを選択しておく。すると写真についている位置情報がサービスに反映されるようになる。これを忘れるとPicasaにアップロードしたデータには位置情報が付加されず、手動で付け直さなければならなくなる。

iPhoneを持っている場合、Google+アプリをダウンロードし[設定]から[インスタントアップロード]をONにする。すると全ての写真がPicasa WebとGoogle Photoにアップロードされる。一度パソコンに取り込んでからアップロードすることもできる。PicasaではGPS機能のないデジカメで撮影した写真にも位置情報を追加することができる。

picasa2

Google+からアップロードした写真は「インスタントアップロード」という場所に保存されるので、アルバムを作り、何か名前をつけて保存する。パソコンから保存した写真はアルバムを作って管理しておく。写真には簡単な説明を付けることができる。写真の下にある[説明を追加]を選ぶと説明を付けることができる。

Picasa Webでアルバムを選択する。右端の[このアルバムへのリンク]に[メールやIMにリンクを貼り付け]という項目があるので、そこにあるURLをコピーする。マップを見るためには[マップを表示]をクリックする。

 

少し複雑な方法:KMLを使う

KMLはいくつかの方法で作る事ができる。Picasa Webの場合[Google Eearthで表示]をクリックするとKMLをダウンロードできる。これをGoogle Mapに持ち込みマイマップに読み込ませるとオリジナルの地図が作成される。

googlemap
ご近所の呟きデータをKMLにまとめてGoogleMapで表示させた例

KMLは簡単なフォーマットなので手描き(あるいはプログラミングで自動的に作成)することもできる。Twitterの呟きにもGeoコードが付加されているものがあるので、GoogleMapに持ち込んで読み込ませることが可能だ。

最も複雑な方法:プログラミングする

GoogleMapAPIを使って地図を作成する。GoogleMapAPIを使うためにはAPIキーを取得する必要がある。APIキーは全てのGoogleサービスで共通。プロジェクトを作ってから必要なサービス(この場合はGoogleMap)を起動する仕組みになっている。

GoogleMapAPIのチュートリアルから適当なコードを拾って最初のマップを作る。Google検索すればチュートリアルがいくつも見つかるが、古いもの(verrsion 2)のコードが多く出回っており、使えない可能性がある。

写真にはEXIFと呼ばれる標準化されたフォーマットがあり、位置データも保存されている。

PHPを使い、写真から位置データを抜き出す。$exif = @exif_read_data( $img );というコードで簡単に抜き出せるが、ここから先が意外と大変だ。場所データが特殊な形をしており、そのままでは地図に使えない。10進法のデータを60進法に編集する必要がある。$data = convert_float( $gps[0] ) + ( convert_float($gps[1])/60 ) + ( convert_float($gps[2])/3600 ) ;というコードを書いてくれている人がいたので、それをそのまま使わせてもらった。南緯と西経はマイナスデータに置き換える必要があるらしい。return ( $ref==’S’ || $ref==’W’ ) ? ( $data * -1 ) : $data ;という式を使うそうだ。

写真からGeoコードを抜き出したら、これを使って地図のセンターポジションを設定する。例えばこんな感じ。

function initialize() {
var place = new google.maps.LatLng($lat,$lng);
var myOptions = {
zoom: 15,
center: place,
mapTypeId: google.maps.MapTypeId.ROADMAP
}

map = new google.maps.Map(document.getElementById(“map_canvas”), myOptions);

複数写真がある場合はそれぞれのGeoコードデータを読み込んだ上で次のように設定することができる。

<img style=”cursor: pointer;” src=”$img” alt=”” />

Googleのチュートリアルにはサーチボックスを使って住所からGeoコードを抽出するためのコードが掲載されている。これを使って、Geoコードを調べるミニアプリを作る事もできる。Geoコードを自動で集めてデータベースに収集するのは規約違反らしいので注意する必要がある。

GoogleMapとTwitterであなたの回り半径3kmで起こっていることを調べる

GoogleMapAPIを使ってみることにした。JavaScriptはよく分からないのだが、Googleが公開しているサンプルコードをそのままコピペしてみるときちんと動作した。GoogleMapはKMLというファイルを読みこんでレイヤー表示することができる。何かできないかなあと思って、以下の要領で試してみた。

  • まず、GoogleMapAPIを使って任意の場所の座標を調べる。
  • 次にTwitterAPIを使って任意の場所の周辺で呟かれたツイートを抽出した。式はhttps://api.twitter.com/1.1/search/tweets.json?count=100&geocode=35.6625031,139.73192029999996,2kmのように書く。これは六本木6丁目の周囲2kmで呟かれているツイートを抽出せよという意味だ。位置情報を示すデータはgeocodeと呼ばれる。
  • このデータをKMLというファイルに整形する。手作業でやるのは大変なので予めプログラミングして置くとよい。
  • このKMLファイルをGoogleMapに読み込ませて表示する。下記のような画面が得られた。
  • このプログラムはバージョン2でも3でも動作した。2はかなり昔に終っているバージョンのはずだが未だに動かしてくれているらしい。古いAPIを切り捨ててしまうサービス(例えばTwitterやFacebook)もあるので、有り難い限りだ。

googlemapKMLファイルはかなり強力にキャッシュされるらしい。頻繁に情報が更新されるデータなどに使うのはやめた方がよさそうだ。CData形式にしておくと、httpで始まるテキストには自動でリンクが貼られている。

場所付きのデータはかなり多く見つかった。最近流行っていると思われる、スマホを使って場所をチェックインするサービスが普及しているようだ。たいていのデータは「どこで買い物をした」とか「どこで食事をした」などといったたわいもないものだった。イベントなどがあれば参加者の反応を見る事ができて面白いのかもしれない。

意外に思われるかもしれないが、これらのツイートのほとんどが公開されており、誰でも利用することができる。個人情報とか守秘義務などを気にする人はGPS機能を切っておいた方がいいのかもしれない。

KMLファイルは手動で作る事もできるが、最近のスマホカメラ(iPhoneやiPadなど)には最初から場所のコードが添付されている。これをPicasaにアップロードする。PicasaにはKMLファイルを出力するオプションがあり、コメントなども付加することができるので、プログラミングなしで情報の共有地図を作る事も可能だ。災害情報を近所と共有したり、お薦めのお店マップを作ったりと様々に応用できそうだ。