GPS等の位置情報(緯度,経度)データを扱う中で、2つの位置情報間の距離を算出する方法をまとめました。
今回python
のGeopy
というライブラリを活用しています。特定の緯度経度同士の距離を出す方法は巷にあふれているのですが、複数の位置情報データを利用した算出方法を見つけられなかったため、記事を書くことにしました。お役に立てると幸いです。
私はGoogle Colaboratory
を利用しています。PythonのVerはPython 3.7.12
でした。
#Geopyのインストール方法
Google colaboraory
はデフォルトでGeopy
がインストールされていますので、以下手順はスキップしてください。
pip install geopy
#データフレームの準備
緯度経度情報のあるデータフレームを準備します。
list = [[35.68142790460516, 139.76714625616972], [34.702714709994204, 135.49593986965132],[31.601693966235818, 130.5630390561215]]
index = ['東京駅', '大阪駅', '福岡駅']
columns = ['latitude', 'longitude']
df = pd.DataFrame(data=list, index=index, columns=columns)
latitude | longitude | |
---|---|---|
東京駅 | 35.68142790460516 | 139.76714625616972 |
大阪駅 | 34.702714709994204 | 135.49593986965132 |
福岡駅 | 31.60169396623581 | 130.5630390561215 |
#導入
Geopyのインポート。
from geopy.distance import geodesic
#①比較する位置情報が1箇所の場合
#比較対象を品川駅に設定
location = (35.628671851820975, 139.73874896966285)
df["distance"] = df.apply(lambda x:geodesic((x["latitude"], x["longitude"]), location), axis=1)
latitude | longitude | distance | |
---|---|---|---|
東京駅 | 35.68142790460516 | 139.76714625616972 | 6.393371847275713 km |
大阪駅 | 34.702714709994204 | 135.49593986965132 | 399.91561269237417 km |
福岡駅 | 31.60169396623581 | 130.5630390561215 | 960.9271552485031 km |
このように行毎に品川駅との距離を算出することができました。 |
#②別の位置情報のデータと比較する場合
次に比較したい場所が複数ある場合は以下の手順です。
まず比較する位置情報のあるデータフレームを作成します。
list2 = [["品川駅", 35.62861516865684, 139.73878651988088], ["梅田駅", 34.703394777186084, 135.4976907467483],["桜島", 31.585815733986234, 130.65043613481365]]
columns = ['location', 'latitude', 'longitude']
locations = pd.DataFrame(data=list2,columns=columns)
location | latitude | longitude | |
---|---|---|---|
0 | 品川駅 | 35.62861516865684 | 139.73878651988088 |
1 | 梅田駅 | 34.703394777186084 | 135.4976907467483 |
2 | 桜島 | 31.585815733986234 | 130.65043613481365 |
このデータフレームを元に総当りで比較してみます。新しく作るcolumns名はlist2のlocaton名にしてみます。
for i in range(len(locations)) :
df[locations['location'][i]] = df.apply(lambda x:geodesic((x["latitude"], x["longitude"]), (locations['latitude'][i], locations['longitude'][i])), axis=1)
そうすることで以下表のように各拠点との距離を測定することができました。
| | latitude | longitude | 品川駅 | 梅田駅 | 桜島 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 東京駅 | 35.68142790460516 | 139.76714625616972 |6.397765002728355 km|403.65205533837116 km|959.4990902614147 km|
| 大阪駅 | 34.702714709994204 | 135.49593986965132 |399.9174334391656 km|0.17726519520253164 km|568.9750259401818 km|
| 福岡駅 | 31.60169396623581 | 130.5630390561215 |960.9275703488593 km|574.5558420262055 km|8.479415597138578 km|
# さいごに
今回数千件のレコードと数十件の拠点のデータから1レコードずつどの拠点に属するかを距離から分類しました。
その分類する前に、この記事の内容が役立ちましたので、皆さんのお役にも立てれば幸いです。