【Python】Yahoo Geocoding APIをpythonで実行 | COMMONS NOTE

【Python】Yahoo Geocoding APIをpythonで実行

こんにちはマダラです!

以前、PythonでGoogle Geocoding APIを実行する記事を紹介した際にヤフーのAPIを実装したものは消したしまったと言っていましたが、ちゃんと残っていました!

やはり、自分が書いたコードを残さずに消すなんてヘマはしていなかったようです!!

というわけで簡単に紹介しちゃいましょう。

Yahoo Geocoding APIについて

Googel Geocoding APIはリクエスト数制限が2,500回/日でしたよね
Googleと比較すると、YahooのAPIは利用制限が 50,000回/日ですので単純に大量のデータ無料で扱いたいという場合にはこちらの方が向いてそうです。
使用制限がやややさしめ。
また、住所検索レベル( 1:都道府県、2:市町村、3:町・大字、4:丁目・字)を指定可能となっています。
指定した住所レベルでマッチしなかった場合、上位のレベルで再検索を行います。
とはいえGoogle Geocodingの方が精度いいようでした。
有名な地点であれば問題ないですが、無名の地点に対してジオコーディングを行う場合、ピンポイントでやってくれるGoogleに対してYahooは誤差が数百m程度あることが多かったです。
どちらも一長一短で、
  • お金をかけたくない
  • 市町村レベルまで特定できればいい
  • データは大量に扱う

ということであれば、GoogleよりYahooに軍配があがるのではないでしょうか?

取得可能クエリについては下記を参照くださいhttps://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/geocoder.html

Pythonで実装する

API申請を行ったら
  • Client ID
  • シークレットID

がもらえると思います。
コーデイングの際に使うのはClient IDなのでコピーしておきましょう。

下はなんかメモにありました

緯度経度情報が逆で経度緯度になっているので、そのまま出力結果を調べても場所が出てこない。
反転させる必要がある。
GoogleのAPIでは緯度経度の順で結果が返ってくるのに対し、Yahooは経度緯度だったことを後世に伝えようとしているのだと思います。
下記はコードです
import json
import socket
import ssl
import traceback
import urllib.request, urllib.error

def YahooGeocoding(address):
    ssl._create_default_https_context = ssl._create_unverified_context
    socket.setdefaulttimeout(5);  # sec
    u_agent = urllib.request.build_opener()
    u_agent.addheaders = [('User-Agent','python-urllib-test')];
    api_end_point = 'https://map.yahooapis.jp/geocode/V1/geoCoder'
    params = {
        'appid' : 'Client ID',
        'output' :'json',
        'ei':'UTF-8',
        "al":4,  #level -> 1=都道府県, 2=市区町村, 3=町/大字, 4=丁目/字
        "recursive": 'true', #見つからない場合、階層上位を探す
        "query": address
    }
    encoded_params = urllib.parse.urlencode(params)
    req_url = api_end_point + "?" + encoded_params
    try:
        response = u_agent.open(req_url)
    except urllib.error.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:
        tmp = ret_geocode["Geometry"]["Coordinates"].split(",")
        print(tmp[1],tmp[0])
        
YahooGeocoding("東京都港区赤坂4-13-8")

参考にさせていただいたサイトがあるのですが、忘れてしまいました。

Client IDはご自身のものを代入してください

ぜひ参考にしてください(?)