Pythonで住所APIを使用するケースのご紹介

皆さん、お疲れ様です。
プラットフォーム事業部のNです。
業務や個人開発で「住所」を扱うケースは意外と多いかと思います。
たとえば郵便番号から住所を検索したり、入力された住所を正規化して保存したり。 今回は Python を使って、住所APIを呼び出す簡単なサンプルを紹介します。
また、日本の住所の正規化といった点も少しだけお話しできたらと思いますので、
よろしくお願いします。
ご紹介するAPI
- 郵便番号から住所を取得(ZipCloud API)
- 住所から緯度経度を取得(Nominatim API)
- (Tips)住所正規化について
ZipCloud
ZipCloudは郵便番号から住所を取得するAPIです。
まずは、サンプルでコードを書いてみます。
## Pythonサンプルコード
```python
import requests
def get_address(zip_code: str):
url = "https://zipcloud.ibsnet.co.jp/api/search"
params = {"zipcode": zip_code}
response = requests.get(url, params=params)
if response.status_code != 200:
raise Exception("APIリクエストに失敗しました")
data = response.json()
if data["results"] is None:
return "該当する住所が見つかりませんでした"
result = data["results"][0]
return f"{result['address1']}{result['address2']}{result['address3']}"
if __name__ == "__main__":
zipcode = "1000001" # 東京都千代田区千代田
address = get_address(zipcode)
print(f"郵便番号 {zipcode} の住所は {address} です")
実行結果
郵便番号 1000001 の住所は 東京都千代田区千代田 です
上記のように、簡単に郵便番号から住所が特定できます。
特徴としては以下が挙げられます。
· Python の requests モジュールを使えば、住所APIを簡単に呼び出せる。
· 郵便番号から住所を取得したいときに便利。
· 業務システムの入力チェックや自動補完にも応用できる。
Nominatim API
次にご紹介するのは住所から緯度経度を取得するNominatim APIです。
こちらも、まずはコードを書いてみます。
import requests
def get_latlon(address: str):
url = "https://nominatim.openstreetmap.org/search"
params = {
"q": address,
"format": "json",
"limit": 1
}
headers = {"User-Agent": "python-sample-app"} # 必須: API利用規約で指定あり
response = requests.get(url, params=params, headers=headers)
if response.status_code != 200:
raise Exception("APIリクエストに失敗しました")
data = response.json()
if not data:
return "緯度経度が見つかりませんでした"
lat = data[0]["lat"]
lon = data[0]["lon"]
return (lat, lon)
if __name__ == "__main__":
address = "東京都千代田区千代田1-1"
latlon = get_latlon(address)
print(f"{address} の緯度経度は {latlon} です")
実行結果:
東京都千代田区千代田1-1 の緯度経度は ('35.685175', '139.7528') です
特定の住所から緯度経度を割り出すことが出来ました。
「ZipCloud」が郵便番号から住所を特定するのに対し、「Nominatim API」は住所から緯度経度の特定になります。
「郵便番号から住所を特定することは使えるけども、緯度経度が分かっても使用用途が無いのではないか」と思われる方もいるかもしれません。
ですが、この情報は色々な場面で使用できます。
①地図上に表示できる
Google Maps や Leaflet などの地図ライブラリにピンを立てられる。
②距離や所要時間の計算
2地点間の距離計算や、移動経路のルート検索に利用できる。
③位置情報による検索・絞り込み
例: 「現在地から半径 1km のレストランを探す」など、周辺検索が可能。
④データの可視化
顧客分布や売上データを地図にプロットして、地域ごとの傾向を見える化できる。
⑤AR/IoT/位置連動サービス
スマホアプリやIoT機器で「その場所にいると通知する」「近づくとイベントが発生する」といった機能に使える。
上記は例ですが、簡単にまとめると次のように言えます。
緯度・経度は、住所をデジタルで扱いやすい形式に変換したものです。地図表示、距離計算、周辺検索、データ分析などに幅広く活用できます!
(Tips)住所正規化について
日本の住所は「東京都千代田区丸の内1丁目1番1号」「東京都千代田区丸の内1-1-1」など、全角・半角や表記ゆれが多く、そのままでは検索やデータ分析に使いにくいことがあります。
そんなときに便利なのが、住所正規化ライブラリです。
今回は「normalize-japanese-addresses」というライブラリをご紹介します。
normalize-japanese-addressesとは?
Python でも簡単に使える住所正規化ライブラリで、都道府県・市区町村・町域などに分割してくれます。
さっそくコードを書いてみます。
from normalize_japanese_addresses import normalize
address = "東京都千代田区丸の内1-1-1"
result = normalize(address)
print(result)
実行結果:
{
'pref': '東京都', # 都道府県
'city': '千代田区', # 市区町村
'town': '丸の内一丁目', # 町域(丁目まで正規化)
'addr': '1-1', # 番地の数字部分(ハイフンで統一)
'lat': 35.681236, # 緯度(取得可能な場合)
'lng': 139.767125 # 経度(取得可能な場合)
}
とてもお手軽に住所の正規化をしてくれます。
上記コードで「東京都千代田区丸の内1丁目1番1号」が入力データだったとしても同様の結果が得られます。
from normalize_japanese_addresses import normalize
address = "東京都千代田区丸の内1丁目1番1号"
result = normalize(address)
print(result)
実行結果:
{
'pref': '東京都', # 都道府県
'city': '千代田区', # 市区町村
'town': '丸の内一丁目', # 町域(丁目まで正規化)
'addr': '1-1', # 番地の数字部分(ハイフンで統一)
'lat': 35.681236, # 緯度(取得可能な場合)
'lng': 139.767125 # 経度(取得可能な場合)
}
同じ住所であったとしても、日本の住所は「丁目、番地、号」といった情報で色々な書き方があるためとても管理が難しいです。
このような場面で、「normalize-japanese-addresses」といったライブラリを用いて正規化が出来るようになります。
まとめ
いかがだったでしょうか。
今回は Python を使って住所情報を扱う方法をご紹介しました。
1.郵便番号から住所を取得 → ZipCloud API で簡単に検索可能
2.住所から緯度経度を取得 → Nominatim API で地図表示や周辺検索に応用可能
3.住所の正規化 → normalize-japanese-addresses を使えば表記ゆれを統一してデータ分析や検索に便利
住所データはただの文字列に見えますが、APIや正規化を活用することで、
地図表示、距離計算、データ分析などさまざまな便利なサービスに活用できます。
Python と無料APIを使えば、ちょっとした住所関連の機能もすぐに試せますので、
ぜひご自身のサービスや開発に取り入れてみてください。
最後まで読んでいただきありがとうございました。
【公式サイト】
https://zipcloud.ibsnet.co.jp/doc/api
https://nominatim.org/release-docs/latest/api/Overview
https://github.com/geolonia/normalize-japanese-addresses