2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Geopyで2点間の距離を測定する方法

Last updated at Posted at 2021-10-04

GPS等の位置情報(緯度,経度)データを扱う中で、2つの位置情報間の距離を算出する方法をまとめました。

今回pythonGeopyというライブラリを活用しています。特定の緯度経度同士の距離を出す方法は巷にあふれているのですが、複数の位置情報データを利用した算出方法を見つけられなかったため、記事を書くことにしました。お役に立てると幸いです。

私は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レコードずつどの拠点に属するかを距離から分類しました。
その分類する前に、この記事の内容が役立ちましたので、皆さんのお役にも立てれば幸いです。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?