AI
2025/04/03
古川 直輝

住所から距離を簡単に計算!sklearnと国土地理院APIを活用した距離算出法

地理情報を活用したアプリケーションやデータ分析が進む中、住所から距離を計算する需要は増加しています。

はじめに

地理情報を活用したアプリケーションやデータ分析が進む中、住所から距離を計算する需要は増加しています。例えば、配送ルートの最適化や、ユーザーの位置情報を基にしたサービス提供など、様々なシーンで活用可能です。この記事では、Pythonを使って国土地理院APIから住所に対応する緯度経度を取得し、2点間の距離を計算する方法をステップバイステップで解説します。

国土地理院APIとは

国土地理院APIは、住所から緯度・経度を取得できるAPIです。このAPIを使用することで、地図上の特定の位置を効率的に取得でき、位置情報を基にしたアプリケーションやサービス開発に大きな役立ちます。


実際に、地理的な情報を扱う際に、geopyライブラリなども広く使われていますが、geopyは詳細な住所を緯度・経度に変換する精度が限定的です。特に、日本国内においては、細かい住所の扱いが難しく、意図した通りの精度で緯度・経度を取得できないことが多いです。そこで、精度高く、正確な日本国内の住所変換が求められる場合、国土地理院APIが非常に有効です。


実装手順

実装は以下の手順に行います。


①国土地理院APIを使って住所から緯度・経度を取得


国土地理院APIを使用することで、簡単に住所から位置情報を取得できます。


 


②sklearnのBallTreeを使って、最も近い2点を求める。


BallTreeは、効率的に空間検索を行うためのデータ構造で、距離が近いデータ点を素早く見つけることができます。複数の地点(緯度・経度のペア)から、最も近い地点を特定するために、BallTreeを使って検索を行います。


 


③②で求めた2点間を関数に入れ、距離を求める。 ここでは、haversineなどの地理的距離計算を行うための関数を利用します。haversine公式は、球面上での2点間の大円距離を計算するためのものです。


実装

以下が実装コードです。


以下のコードを実行することで、住所から緯度・経度を求め、近い2点間の距離を取得することが可能です。


 


国土地理院APIを使用して、住所から緯度・経度を求めるコード



#国土地理院API
makeUrl = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="

#住所から緯度・経度を取得
lats = []
longs = []
for address in df["住所"]:
s_quote = urllib.parse.quote(address)
response = requests.get(makeUrl + s_quote)
if response:
lats.append(response.json()[0]["geometry"]["coordinates"][0])
longs.append(response.json()[0]["geometry"]["coordinates"][1])
else:
print("住所がありませんでした。")


2つの緯度・経度から、距離を求める関数



def distance(dist):
earth_radius_km = 6371
distance_km = dist * earth_radius_km
return distance_km


緯度・経度から最も近い2点を求めて、その距離を求めるコード



lists = [] coordinates = df[['緯度', '経度']].values tree = BallTree(np.radians(coordinates), metric='haversine') for lat,long in zip(df["緯度"],df["経度"]): store1_coords = np.radians([lat,long]) dist, ind = tree.query([store1_coords], k=2) dist = dist[0][1] closest_store = df.iloc[ind[0][1]] d = distance(dist) lists.append(d)


全体コード



#使用するライブラリ import pandas as pd import requests import urllib import numpy as np from sklearn.neighbors import BallTree #国土地理院API makeUrl = "https://msearch.gsi.go.jp/address-search/AddressSearch?q=" #住所から緯度・経度を取得 lats = [] longs = [] for address in df["住所"]: s_quote = urllib.parse.quote(address) response = requests.get(makeUrl + s_quote) if response: lats.append(response.json()[0]["geometry"]["coordinates"][0]) longs.append(response.json()[0]["geometry"]["coordinates"][1]) else: print("住所がありませんでした。") #緯度・経度から距離を求める関数 def distance(dist): earth_radius_km = 6371 distance_km = dist * earth_radius_km return distance_km #緯度・経度から最も近い2点を取得 lists = [] coordinates = df[['緯度', '経度']].values tree = BallTree(np.radians(coordinates), metric='haversine') for lat,long in zip(df["緯度"],df["経度"]): store1_coords = np.radians([lat,long]) dist, ind = tree.query([store1_coords], k=2) dist = dist[0][1] closest_store = df.iloc[ind[0][1]] d = distance(dist) lists.append(d)

まとめ

この記事では、Pythonを使って国土地理院のAPIを活用し、住所から緯度経度を取得する方法を紹介しました。そして、取得した2つの緯度・経度とhaversineライブラリを使って2点間の距離を計算する方法を解説しました。この技術を活用すれば、位置情報を扱ったアプリケーションを開発する際に役立つ知識が得られます。地理情報を効率的に活用できるようになり、さらに高度なデータ分析にも対応できるようになるでしょう。

New call-to-action