始まりは「緯度・経度」から
たまたまだが、仕事でデータ処理チームのExcelのVBAを色々と直しているうちに、「motciniさん、VBAでAPIって使ったことありますか?」と聞かれた。
「え、使ったことないですね。どうしましたか」
「VBAで、緯度・経度から住所を調べるGoogle MapのAPIを使ってるんですが、なかなかうまくいかなくて…」
「ほう」
ということでコード画面を見せてもらったところ
(さっぱりわからん)
というのが正直な感想だった。
画像ダウンロードのサンプルプログラムでちょっとflickrのAPIをチュートリアルに沿って使ったことがあるだけで、そもそも業務でAPIとか使わなかったんですよね。
「因みにそのデータはどのくらい処理するんですか」
「8万行です」
Oh...そりゃ確かにAPIとかそういう機能も使いたくなるだろうな(この時APIという言葉はふわっとしかわからなくて、雰囲気で言っていた感はあります)
でも、個人的に正直Pythonとかで処理しちゃった方が楽だなと思ったので、
「とりあえず、Pythonで何かできないか調べてみます」
ってことでまずはGoogleMapsAPIというものについて調べることにした。
Geocodingの記事は見飽きた
ということで早速ググってみるわけだけど、どうやら「緯度・経度」から住所を探知するのは「逆ジオコーティング(Reverse-Geocoding)」ということがわかった。
物件名や名称から住所、緯度・経度を探すのは普通の「ジオコーディング」らしい。
しかし困ったことに、この「逆ジオコーディング」でヒットする記事は少なく、求めていたコードは中々見当たらなかった。
5回くらい検索ワードを変えるころには正規のジオコーディングの記事は見飽きていた。
さらに、逆ジオコーディングのそれっぽいコードが乗っていたとして、得られる住所は英語表記、つまり番地→都道府県という形で、アルファベットで表記されてしまうことがネックだった。
例えば「東京タワー」で調べたら、
・〒105-0011 東京都港区芝公園4丁目2−8
と表示されるのではなく、
・4-2-8, Shibakoen, Minato-ku, Tokyo
みたいな感じで表記されてしまう。
これでは住所を次に読む人が困ってしまうので、なんとか日本語表記にする方法を探した。
そして見つかった
以下、コードを載せるので参考になれば幸いである。
参考にしたわかりやすい解説(Pythonでジオコーディング(Geocoder/Googlemaps))
逆ジオコーディング(緯度・経度)から住所を日本語で探す
import googlemaps
#GoogleMapsAPI用に取得したAPIキーを変数に格納する
Key = XXXXX
#GoogleMapsAPI用にAPIキーを返す
gmaps = googlemaps.Client(key=Key)
#リストにいくつか緯度・経度を格納する
list = [
"35.65858645, 139.745440057962", #東京タワー
"35.71005425, 139.810714099926" #東京スカイツリー
]
#リストの中から順番に住所を探していく
for i in list:
results = gmaps.reverse_geocode((i), language='ja')
add = [d.get('formatted_address') for d in results]
print(add[1])
#=>日本、〒105-0011 東京都港区芝公園4丁目2−8
#=>日本、〒131-0045 東京都墨田区押上1丁目1−83
問題はこのままだと、文頭に「日本、」という若干余計な文字が入っていること。
これをスライスで途中から記載するできるようにちょっとコードを改変する。
for i in list:
results = gmaps.reverse_geocode((i), language='ja')
add = [d.get('formatted_address') for d in results]
Jusho = add[1]
print(Jusho[3:])
#=>〒105-0011 東京都港区芝公園4丁目2−8
#=>〒131-0045 東京都墨田区押上1丁目1−83
うん、素晴らしい出来栄えだ。求めていた形そのものである。
ただ、問題はGoogleMapsAPIがどうやら月に無料でアクセス可能なAPIの件数が40,000件までということらしい(参照元)
まぁそれを超えるヘビーユーザーは中々いないかもしれないが、それを超えると料金が請求されてしまうので頭に入れておこう。