Google Map APIを使ってジオコーディングする際に、大量の住所データに対応する緯度・経度データを取得したいケースがあり、「一発で取得したい!」と思った時のメモです。
Pythonのpandasとrequestsライブラリを使うと、結構簡単にできました。
CSVデータを用意
こんな感じで、住所一覧が記載されているCSVデータ(address.csv)を用意します。
こちらのように、住所以外のデータが含まれていても大丈夫です。
「一覧データはあるけどPDFしかない…🥺」という場合は、こちらの記事を参考に、PDFからCSVに変換してみてください。
pandasライブラリをインポート
後ほど住所一覧をfor文ですべて走査して処理するために、CSVを読み込んでpandasのDataFrame型のデータに変換します。
import pandas as pd
data = pd.read_csv("address.csv")
data.head()
こんな感じのDataFrame型データが読み込まれます。
このdataに、これから取得する「緯度・経度」のカラムを追加しておきます。
data["緯度・経度"] = 0
requestsライブラリを使って、Google Map Geocoding APIを経由して緯度・経度を取得
Pythonでhttp通信を行うためのライブラリrequests
を使って、Google Map Geocoding API経由で緯度・経度を取得します。
APIの利用にあたって、Google Cloud PlatformからAPIキーを取得しておいてください。(今回の例であれば基本無料で使えると思います。)
それでは、Google Mapから全データ分の緯度・経度を取得します。
import requests
api_key = '取得したAPIキー'
#dataの数だけ繰り返す
for i in range(len(data)):
address = data['住所'].loc[i]
#Google Map Geocoding APIにアクセスして緯度・経度を取得
url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}'
response = requests.get(url).json()
if response['status'] == 'OK':
lat = response['results'][0]['geometry']['location']['lat']
lng = response['results'][0]['geometry']['location']['lng']
#dataの「緯度・経度」カラムに取得した値を書き込む
data['緯度・経度'].loc[i] = f'{lat},{lng}'
else:
print(f'{address}:緯度・経度が取得できませんでした')
data.head()
data.head()で先頭から5つのデータを表示してみると、こんな感じで緯度・経度のカラムに取得した値が書き込まれているのが分かります。
何らかのエラーで緯度・経度が取得できなかった場合は、取得できなかった住所と「緯度・経度が取得できませんでした」のメッセージが表示されるようにif文で条件分岐しています。
これでCSVの住所一覧から、緯度・経度が一括で取得できました。
(Google Mapで1件ずつ住所を検索して緯度・経度をコピペしなくて済む!やったね!)
最後に、緯度・経度カラムを新しく追加したdataをCSVとして出力して終了です。
data.to_csv("latlng_data.csv", index=False)