コンテンツにスキップ

3 ジオコーディング

3.1 緯度経度の取得

地図で場所を示すのは緯度と経度です。緯度と経度を扱うプログラミングをジオコーディングといいます。そのためのライブラリがgeocoderとgeopyです。

場所の名前から緯度経度を取得してみます。map1.ipynbに以下を記述します。

from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="geoapi")
location = geolocator.geocode("熊本市役所")

print("緯度:",location.latitude)
print("経度:",location.longitude)

NominatimはOpenStreetMapにアクセスし、緯度と経度を取得します。ただし、アクセス数が多い場合、取得出来ない場合があります。

国土地理院のWeb APIを利用すると住所から緯度経度への変換が可能です。

import requests

url = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="
adr = "熊本県熊本市中央区手取本町1-1"
response = requests.get(url + adr)
res = response.json()
res

取得したJSON情報にはさまざまな情報が含まれているため、緯度経度だけを出すには以下のようにします。

res[0]["geometry"]["coordinates"]

施設の名前から検索してみます。

import requests

url = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="
name = "熊本市役所"
response = requests.get(url + name)
response.json()

3.2 距離取得

geopyを使うと緯度経度を使った計算が出来ます。今回は二地点間の距離を調べてみます。geopyのdistanceを使用します。

# 熊本市役所の緯度経度
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="geoapi")
location1 = geolocator.geocode("熊本市役所")
pos1 = (location1.latitude,location1.longitude)
print("熊本市役所:", pos1)

# 鶴屋の緯度経度
location2 = geolocator.geocode("鶴屋")
pos2 = (location2.latitude, location2.longitude)
print("鶴屋:", pos1)

# 距離
from geopy import distance
dist = distance.distance(pos1, pos2).km
print(dist, 'Km')

distanceで2つの場所の緯度経度を指定します。そして、kmとすることで、キロメートル単位で取得出来ます。 m とするとメートル単位で取得出来ます。