end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

python urllib による http getと yahoo ジオコーダapiで、住所→座標(緯度経度)変換

pythonにおけるhttpやjsonの練習の為、以前、perlで書いたentryをpython

geocoding (住所→座標(緯度経度))変換は、google map apiより Yahoo!ジオコーダAPIがよさそ - end0tknr's kipple - 新web写経開発

YOLP(地図):Yahoo!ジオコーダAPI - Yahoo!デベロッパーネットワーク

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import json
import socket
import ssl
import traceback
import urllib
import urllib2

def main():
    # オレオレ証明書のurlにアクセスする場合
    # SSL: CERTIFICATE_VERIFY_FAILED エラーになる為
    ssl._create_default_https_context = ssl._create_unverified_context

    socket.setdefaulttimeout(5);  # sec

    u_agent = urllib2.build_opener()
    u_agent.addheaders = [('User-Agent','python-urllib2-test')];

    api_end_point = 'https://map.yahooapis.jp/geocode/V1/geoCoder'
    params = {
        'appid' : 'ないしょ',
        'output' :'json',
        'ei':'UTF-8',
        "al":4,  #level -> 1=都道府県, 2=市区町村, 3=町/大字, 4=丁目/字
        "recursive": 'true', #見つからない場合、階層上位を探す
        "query": '東京都渋谷区渋谷1-11'
    }

    encoded_params = urllib.urlencode(params)
    req_url = api_end_point + "?" + encoded_params
#    print req_url

    try:
        # openの引数1コはGET, 2コはPOST
        response = u_agent.open(req_url)
    except urllib2.HTTPError as err:
        print("HTTP ERROR "+ err.reason)
        return
    except socket.timeout as err:
        print("SOCKET.TIMEOUT")
        return
    except Exception as err:
        print("UNKNOWN ERROR")
        print traceback.format_exc()
        return
    else:
        pass

    res_all_json = response.read()
    res_all = json.loads( res_all_json )
    res_geocodes = res_all["Feature"]

    for ret_geocode in res_geocodes:
        disp_line = "\t".join([ret_geocode["Geometry"]["Coordinates"],
                               ret_geocode["Property"]["Address"] ]);
        print disp_line

if __name__ == '__main__':
    main()

↑こう書くと、↓こうできます

$ ./foo.py
139.70199214,35.66043257    東京都渋谷区渋谷1丁目