pythonでgoogle mapを弄る
何をするか
・住所から緯度経度を検索する
・google mapのマイマップに場所情報を登録する
何が出来たか
jubeat設置店MAP_北海道・東北
jubeat設置店MAP_北陸・甲信越・東海
jubeat設置店MAP_北関東
jubeat設置店MAP_東京都
jubeat設置店MAP_南関東
jubeat設置店MAP_近畿
jubeat設置店MAP_中国・四国
jubeat設置店MAP_九州・沖縄
導入
jubeatというゲームがあります。アミューズメント施設(平たく言うとゲームセンター)などに設置されているゲームなんですが、設置台数が少なめです。
なので、有志が設置店舗の情報を集めてwikiに纏めています。ありがたやありがたや。
しかし。
住所の羅列なので、例えば「横浜市内の設置店舗を調べたい」ってときには有効ですが、「通勤経路上で設置店舗無いかな〜」って時には使い辛いんです。
そこで。
地図上にポイントすれば直感的に分かり易いんじゃないかな〜と思ってgoogle mapを使ってやってみました。
実践
1.wikiのhtmlから住所を抽出
特に捻りも無くSAX parserを使って解析し、「店の名前」「店の詳細」「住所」の一覧を作成します。
(詳細は割愛)
2.住所を緯度経度に変換
詳細はThe Google Geocoding API http://code.google.com/intl/en/apis/maps/documentation/geocoding/
を参照してください。
Google Geocoding APIに住所を投げるとxmlまたはjson形式で情報を返してくれます。
import urllib ENCODING = 'utf-8' def geocode(address): url = u"http://maps.google.com/maps/api/geocode/xml?&language=ja&sensor=false®ion=ja&address=" url = url + urllib.quote(address.encode(ENCODING)) buffer = urllib.urlopen(url).read() return buffer
json形式で取得したい場合は、上記コード中のURLにあるxmlをjsonに換えます。
ここではxml形式で取得して必要な情報を抽出します。
import xml.dom.minidom dom = xml.dom.minidom.parseString(buffer) location = dom.getElementsByTagName('location') if location.length > 0: # 緯度 lat = location[0].getElementsByTagName('lat')[0].firstChild.data # 経度 lng = location[0].getElementsByTagName('lng')[0].firstChild.data
3.緯度経度その他情報をgoogle mapのマイマップに登録
ライブラリのダウンロードが必要です。
詳細はGoogle Maps Data API
http://code.google.com/intl/en/apis/maps/documentation/mapsdata/
を参照。
ライブラリのダウンロードは以下のリンクから。
Client Libraries
http://code.google.com/intl/en/apis/gdata/docs/client-libraries.html
MapsClientクラスのインスタンスを作成して各種操作を行います。
import gdata.maps.client client = gdata.maps.client.MapsClient() # ログイン client.client_login('(google id)', '(パスワード)', source="myApp") # マイマップ作成 targetMap = client.create_map(u'テスト地図') map_id = targetMap.get_map_id() content = '<Placemark><name>%s</name><description><![CDATA[%s]]></description><Point><coordinates>%s,%s</coordinates></Point></Placemark>' % (u'店の名前', u'店の詳細', lng, lat) # マイマップにポイントを追加 client.add_feature(map_id, u'店の名前', content.encode(ENCODING))
(google id)、(パスワード)の部分は各自のgoogleアカウントの物を使用して下さい。
ポイント追加に使用しているcontent文字列は、KML形式と呼ばれる記法です。coordinates要素で位置を指定します。経度、緯度、高さの順に指定できるのですが、今回は高さは使用していません。
このコードによって、マイマップにテスト地図が作成され、ポイントが追加されます。