2010-06-20

pythonさんでジオコーディングと逆ジオコーディング V3

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以前、
pythonさんでジオコーディングと逆ジオコーディング
というのを書きましたが、いつまにかGoogle map apiがV3になっていました。

V3になって、Google Map APIを利用するためのキーが必要なくなりました。
なので、V3版で場所の名前から緯度経度取得するジオコーディングとその逆をpythonでやってみました。

Google map api V3でのジオコーディングに関しては、
http://code.google.com/intl/en/apis/maps/documentation/geocoding/
に書いてあります。

コードは以下のような感じです。
google app engineで利用することを前提にしているので
urlfetchを使っていますが、そうでないならばそこを置き換える必要があります。
jsonのパーサーも場合によって変更が必要だと思います。

import urllib
from google.appengine.api import urlfetch
import django.utils.simplejson as json

from django.conf import settings

#場所名から緯度経度取得
def geocoding(addr):
    url = 'http://maps.google.com/maps/api/geocode/json?'
    url = url + '&language=ja&sensor=false®ion=ja'
    url = url + '&address=' + urllib.quote(addr.encode('utf-8'))
    result = urlfetch.fetch(url)
    if result.status_code != 200:
        return None
    obj = json.loads(result.content)
    if obj["status"] != "OK":
        return None
    ret = {}
    ret['lon'] = str(obj["results"][0]["geometry"]["location"]["lng"])
    ret['lat'] = str(obj["results"][0]["geometry"]["location"]["lat"])
    return ret

#緯度経度から場所名取得
def regeocoding(lat,lon):
    url = 'http://maps.google.com/maps/api/geocode/json?'
    url = url + '&language=ja&sensor=false®ion=ja'
    url = url + '&latlng=' + str(lat) + ',' + str(lon)
    result = urlfetch.fetch(url)
    if result.status_code != 200:
        return None
    obj = json.loads(result.content)
    if obj["status"] != "OK":
        return None
    addr = None
    for result in obj["results"]:
        if "sublocality" in result["types"]:
            addr = result["formatted_address"]
            addr = addr.replace(u'日本, ', '', 1)
            break
    return addr


コメントを投稿