2012年7月12日木曜日

PowerShell+Google Mapで旅行ルート地図を作成

PowerShell覚え書き

背景

先日昔行ったインド旅行のことを書いていたらついでに地図も作りたくなりました。

お題

場所名のリストからGoogle Static Mapを使用して、旅行ルート地図を作成する。

$route=@"
place,country
ニューデリー,インド
アーグラー,インド
ジャイプル,インド
ウダイプル,インド
ボンベイ,インド
ゴア,インド
パナジ,インド
マンガロール,インド
コチン,インド
カニャークマリ,インド
トリバンドラム,インド
マドライ,インド
マドラス,インド
カルカッタ,インド
ダージリン,インド
カトマンズ,ネパール
ポカラ,ネパール
ヴァラナシ,インド
ニューデリー,インド
"@

function address2latlng($address)
{
    $encoded_address=[System.Uri]::EscapeDataString($address)
    $google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                            $encoded_address+"&sensor=false&language=ja"

    $enc = [System.Text.Encoding]::GetEncoding("utf-8")
    $bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
    $xml=[XML]$enc.getString($bytes)
    $xml.GeocodeResponse.result|
        %{ @{ lat=$_.geometry.location.lat;lng=$_.geometry.location.lng;address=$_.formatted_address} }
}

function browse-url($uri)
{
    $ie = new-object -com internetexplorer.application
    $ie.navigate($url)

    while($ie.ReadyState -ne 4){}
    $ie.visible = $true    
}

function get-label($num)
{
    #google Static Mapsではラベルは1ケタの英数字のみ
    $a = [char[]](([int][char]'0')..([int][char]'9'))
    $a += [char[]](([int][char]'A')..([int][char]'Z'))
    $a[$num % $a.length]
}

$route|
    convertFrom-csv|
    % {
        $ad = $_.place + "," + $_.country
        address2latlng $ad
        sleep -milliseconds 200 #アクセスが集中すると緯度経度が取得できないため
    }|
    % -begin {
        $pc=0
        $url="http://maps.google.com/maps/api/staticmap?size=1024x1024"
        $markers=""
        $path="&path=color:black|weight:3"
    }`
    {
        $pc++
        [char]$label=get-label $pc #場所番号からラベルを作成
        #マーカー設定
        $markers +="&markers=size:mid|label:" +$label + "|"+ $_.lat + "," + $_.lng
        #パス設定
        $path += "|" + $_.lat + "," + $_.lng
        #ラベルと地名出力
        $label + ":" +$_.address
    }`
    -end {
        $url += $markers + $path + "&sensor=false"
        browse-url $url
    }



結果

インド一周旅行(1990/12-1991/2)

1:インド デリー ニューデリー
2:インド ウッタル・プラデーシュ アーグラ
3:インド ラージャスターン ジャイプル
4:インド ラージャスターン ウダイプル
5:インド マハーラーシュトラ ムンバイ CritiCare Hospital Multispeciality Hospital & Research Centre
6:インド マハーラーシュトラ ムンバイ
7:インド ゴア
8:インド ゴア パナジ
9:インド カルナータカ マンガロール
A:インド ケーララ コーチン
B:インド タミル・ナードゥ カンニヤークマリ
C:インド ケーララ ティルヴァナンタプラム
D:インド 〒625022 タミル・ナードゥ マドゥライ・エアポート・ターミナル (IXM)
E:インド タミル・ナードゥ チェンナイ
F:インド 西ベンガル コルカタ
G:インド 西ベンガル ダージリン
H:ネパール 〒44600 カトマンズ
I:ネパール 〒33700 ポカラ
J:インド ウッタル・プラデーシュ ワーラーナシー
K:インド デリー ニューデリー




メモ

  • 今回は過去にブログで書いた技術の組み合わせだけでできた。技術系ブログ記事と個人趣味系記事がクロスオーバーしたのでうれしい。
  • Static Map APIはとても使いやすい。
  • Geocoding APIの地図情報の取得でムンバイが2件引っかかってます。良しとします。インドの地名が90年当時の名称(しかもカタカナ)でもちゃんと検索できてしまうのはすごいなぁ。精度も結構良い。
  • これで、自分が生まれてから住んだところのマップとかも作れるな。


0 件のコメント:

コメントを投稿