Google Place APIで住所や地名のデータを構造化する

概要

Google Mapの検索機能は、人がある程度大雑把に地名を入力しても正確な住所を返してくれます。これを利用すれば、人が生成した住所や地名の膨大なデータを、プログラムや機械学習で扱いやすいように構造化することができます。この記事では特に、 Tokyo, Japan東京都渋谷区 などの文字列をGoogle Place APIに投げて、対応する都道府県の情報を得ることを目的とします。

Google Place APIについて

今回の目的に関係があるAPIは、下記のような階層で整理されています。

特に今回必要とする情報は、Find Place requestsPlaces Details requests だけを使えば得ることができます。 Text Search requests は無用に詳細な情報を取得して料金が高くなるため、今回は使用すべきではありません

  • Find Place requests : 地名や住所の文字列を入力として、対応する場所の情報を返す。
  • Text Search requests : 地名や住所の文字列を入力として、対応する場所の完全な情報を返す。要求する情報の種類を指定することができず、常に追加課金が発生する
  • Places Details requests : place_id を入力として、対応する場所の情報を返す。

APIの料金

Google Maps Platformの料金表を見るとわかるように、 Find PlacePlaces Details にはどちらも同じ料金体系が設定されています。

  • 毎月$200のフリークレジットが与えられる
  • 月間100,000リクエスト以内で、必要最小限の情報だけを要求する場合:
    • $17 / 1,000リクエス
    • 月間11000リクエストまでは無料

都道府県を取得する手順

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 を併用する方法です。すなわち

  1. Find Place requestsplace_id を取得
  2. Place Details requestsplace_id を検索し、 address_component を取得

ただし、この方法は1つの地名を検索するために2回のAPIコールを用いるため、課金額に特に注意を払う必要があります。

例えば「千葉県」を検索すると以下のような address_component が得られます。 typesadministrative_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) を使わないように注意してください(自戒)。