郵便番号と緯度経度の一覧データを取得する【Python】
日本郵便からは、郵便番号の一覧データをダウンロードすることができます。
www.post.japanpost.jp
また、国土交通省からは、全国の市町村と緯度経度のデータをダウンロードすることができます。
nlftp.mlit.go.jp
しかしながら、郵便番号と緯度経度が紐づけされた一覧データはダウンロードすることができません。
今回は、以下の記事やAPIをもとに、郵便番号と緯度経度の一覧データを取得してみます。
qiita.com
geoapi.heartrails.com
早速、Pythonでのコードを載せます。
import requests import json import pandas as pd import csv name =["code","zip5","zip7","yomi1","yomi2","yomi3","name1","name2","name3","other1","other2","other3","other4","other5","reason"] zipcode = pd.read_csv('./KEN_ALL.CSV', names=name, encoding='cp932', header = None) url = 'http://geoapi.heartrails.com/api/json' payload = {'method':'searchByPostal'} for i in range(len(zipcode)): try: payload['postal']= (str(zipcode["zip7"][i]).zfill(7)) res = requests.get(url, params=payload).json()['response']['location'][0] with open('./KEN_ALL_POSTALCODE.csv', 'a',newline='') as f: writer = csv.writer(f) writer.writerow([res['postal'], res['prefecture'], res['city'], res['town'], res['y'],res['x']]) except: continue
簡単な説明としては、まずpandasでこちら(https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)にある全国一括の郵便番号データを読み込みます。この際に、nameでheaderに名前を付けてあげています。
その後、forループを回して、一つ一つの郵便番号を参照し、APIを動かし、取得した値をcsvファイルに書き込む、ということを繰り返しています。
たまに郵便番号を入れてもAPIが緯度経度を返せずエラーが起こってしまうため、try exceptでそのような場合は次のループに進むようにしています。
特に工夫もせず単純なループを回しただけのコードですので、実行には大体4時間程度かかりました。
もしご要望等あれば、完成したファイルの無料または有料での配布も考えておりますので、コメントいただければ幸いです。