LoginSignup
21
14

More than 1 year has passed since last update.

【Python】CSVの住所一覧から緯度・経度を一括で取得する

Last updated at Posted at 2023-05-13

Google Map APIを使ってジオコーディングする際に、大量の住所データに対応する緯度・経度データを取得したいケースがあり、「一発で取得したい!」と思った時のメモです。
Pythonのpandasとrequestsライブラリを使うと、結構簡単にできました。

CSVデータを用意

こんな感じで、住所一覧が記載されているCSVデータ(address.csv)を用意します。
こちらのように、住所以外のデータが含まれていても大丈夫です。
「一覧データはあるけどPDFしかない…🥺」という場合は、こちらの記事を参考に、PDFからCSVに変換してみてください。
address.png

pandasライブラリをインポート

後ほど住所一覧をfor文ですべて走査して処理するために、CSVを読み込んでpandasのDataFrame型のデータに変換します。

import pandas as pd
data = pd.read_csv("address.csv")
data.head()

こんな感じのDataFrame型データが読み込まれます。
data.png
この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()

latlng_data.png

data.head()で先頭から5つのデータを表示してみると、こんな感じで緯度・経度のカラムに取得した値が書き込まれているのが分かります。
何らかのエラーで緯度・経度が取得できなかった場合は、取得できなかった住所と「緯度・経度が取得できませんでした」のメッセージが表示されるようにif文で条件分岐しています。
これでCSVの住所一覧から、緯度・経度が一括で取得できました。
(Google Mapで1件ずつ住所を検索して緯度・経度をコピペしなくて済む!やったね!)

最後に、緯度・経度カラムを新しく追加したdataをCSVとして出力して終了です。

data.to_csv("latlng_data.csv", index=False)
21
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
14