Google Place APIで住所や地名のデータを構造化する
概要
Google Mapの検索機能は、人がある程度大雑把に地名を入力しても正確な住所を返してくれます。これを利用すれば、人が生成した住所や地名の膨大なデータを、プログラムや機械学習で扱いやすいように構造化することができます。この記事では特に、 Tokyo, Japan
や 東京都渋谷区
などの文字列をGoogle Place APIに投げて、対応する都道府県の情報を得ることを目的とします。
Google Place APIについて
今回の目的に関係があるAPIは、下記のような階層で整理されています。
特に今回必要とする情報は、Find Place requests
と Places Details requests
だけを使えば得ることができます。 Text Search requests
は無用に詳細な情報を取得して料金が高くなるため、今回は使用すべきではありません。
Find Place requests
: 地名や住所の文字列を入力として、対応する場所の情報を返す。Text Search requests
: 地名や住所の文字列を入力として、対応する場所の完全な情報を返す。要求する情報の種類を指定することができず、常に追加課金が発生する。Places Details requests
:place_id
を入力として、対応する場所の情報を返す。
APIの料金
Google Maps Platformの料金表を見るとわかるように、 Find Place
と Places Details
にはどちらも同じ料金体系が設定されています。
都道府県を取得する手順
Find Place requests
で取得できる値の一つに、 formatted_address
があります。実際にいくつかの地名や住所で検索した結果得られた formatted_address
は下表の通りです。
検索クエリ | formatted_address |
---|---|
ディズニーランド | 1-1 Maihama, Urayasu, Chiba 279-0031, Japan |
千葉県浦安市 | Urayasu, Chiba, Japan |
ユニバーサル・スタジオ・ジャパン | 2 Chome-1-33 Sakurajima, Konohana Ward, Osaka, 554-0031, Japan |
大阪府大阪市此花区桜島2丁目1−33 | 2-chōme-1-33 Sakurajima, Konohana-ku, Osaka, 554-0031, Japan |
これを見ると、 formatted_address
も表記揺れを含んでおり、正確な文法を特定するのが困難です。
- 都道府県と郵便番号の間にカンマが入る場合と入らない場合がある。
- 伸ばす音を示すオーバーラインが有る場合と無い場合がある。
- 同一の場所に対して、複数の僅かに異なる
formatted_address
が対応する場合がある。
何らかの方法で formatted_address
から無理やり都道府県を取得することも考えられますが、より簡単で確実なのは Place Details requests
を併用する方法です。すなわち
Find Place requests
でplace_id
を取得Place Details requests
でplace_id
を検索し、address_component
を取得
ただし、この方法は1つの地名を検索するために2回のAPIコールを用いるため、課金額に特に注意を払う必要があります。
例えば「千葉県」を検索すると以下のような address_component
が得られます。 types
に administrative_area_level_1
を含む部分が都道府県に関する情報です。
[ { "long_name": "Chiba", "short_name": "Chiba", "types": [ "administrative_area_level_1", "political" ] }, { "long_name": "Japan", "short_name": "JP", "types": [ "country", "political" ] }, { "long_name": "279-0031", "short_name": "279-0031", "types": [ "postal_code" ] } ]
Python Client for Google Maps Services
Google Maps APIを簡単に叩けるPythonライブラリが公式に提供されています。各エンドポイントとライブラリのメソッドの対応関係は下表の通りです。
エンドポイント | Python Clientのメソッド |
---|---|
Find Place requests | googleMaps.Client.find_place |
Text Search requests | googleMaps.Client.places |
Places Details requests | googleMaps.Client.place |
メソッド名が非常に紛らわしいので、誤って Text Search requests
(googleMaps.Client.places
) を使わないように注意してください(自戒)。