pythonでgoogle mapを弄る

何をするか

・住所から緯度経度を検索する
google mapのマイマップに場所情報を登録する

導入

jubeatというゲームがあります。アミューズメント施設(平たく言うとゲームセンター)などに設置されているゲームなんですが、設置台数が少なめです。
なので、有志が設置店舗の情報を集めてwikiに纏めています。ありがたやありがたや。
しかし。
住所の羅列なので、例えば「横浜市内の設置店舗を調べたい」ってときには有効ですが、「通勤経路上で設置店舗無いかな〜」って時には使い辛いんです。
そこで。
地図上にポイントすれば直感的に分かり易いんじゃないかな〜と思ってgoogle mapを使ってやってみました。

手順

1.wikiのhtmlから住所を抽出
2.住所を緯度経度に変換
3.緯度経度その他情報を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&region=ja&address="
    url = url + urllib.quote(address.encode(ENCODING))
    buffer = urllib.urlopen(url).read()
    return buffer

json形式で取得したい場合は、上記コード中のURLにあるxmljsonに換えます。
ここでは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要素で位置を指定します。経度、緯度、高さの順に指定できるのですが、今回は高さは使用していません。
このコードによって、マイマップにテスト地図が作成され、ポイントが追加されます。