使用 scipy 测量地理距离
Measuring geographic distance with scipy
我没有使用 scipy
的 pdist
函数的结果。我对真实的地理距离感兴趣(首选单位:公里)。取以下坐标:
from scipy.spatial.distance import pdist
coordinates = [ (42.057, -71.08), (39.132, -84.5155) ]
distance = pdist(coordinates)
print distance
# [ 13.75021037]
但是单位是什么? Google 表示这两点之间的距离是 1179 公里。我如何从 13.75021037 到达那里?
scipy
中的 pdist
方法不支持 lon
、lat
坐标的距离,如评论中所述。
不过,如果你想得到pdist
returns那种距离矩阵,你可以使用pdist
方法和geopy
提供的距离方法] 包裹。为此,pdist
允许使用带有两个参数的自定义函数(lambda 函数)计算距离。
这是一个例子:
from scipy.spatial.distance import pdist
from geopy.distance import vincenty
import numpy as np
coordinates = np.array([[19.41133431, -99.17822823],
[19.434514 , -99.180934],
[19.380412 , -99.178789])
# Using the vincenty distance function.
m_dist = pdist(coordinates, # Coordinates matrix or tuples list
# Vicenty distance in lambda function
lambda u, v: vincenty(u, v).kilometers)
使用最新的 Python 3,现在给出弃用警告。我实际上发现 this answer by @cffk 更容易理解:
(为了方便粘贴在这里)
>>> from geopy.distance import great_circle
>>> from geopy.distance import geodesic
>>> p1 = (31.8300167,35.0662833) # (lat, lon) - https://goo.gl/maps/TQwDd
>>> p2 = (31.8300000,35.0708167) # (lat, lon) - https://goo.gl/maps/lHrrg
>>> geodesic(p1, p2).meters
429.1676644986777
>>> great_circle(p1, p2).meters
428.28877358686776
我没有使用 scipy
的 pdist
函数的结果。我对真实的地理距离感兴趣(首选单位:公里)。取以下坐标:
from scipy.spatial.distance import pdist
coordinates = [ (42.057, -71.08), (39.132, -84.5155) ]
distance = pdist(coordinates)
print distance
# [ 13.75021037]
但是单位是什么? Google 表示这两点之间的距离是 1179 公里。我如何从 13.75021037 到达那里?
scipy
中的 pdist
方法不支持 lon
、lat
坐标的距离,如评论中所述。
不过,如果你想得到pdist
returns那种距离矩阵,你可以使用pdist
方法和geopy
提供的距离方法] 包裹。为此,pdist
允许使用带有两个参数的自定义函数(lambda 函数)计算距离。
这是一个例子:
from scipy.spatial.distance import pdist
from geopy.distance import vincenty
import numpy as np
coordinates = np.array([[19.41133431, -99.17822823],
[19.434514 , -99.180934],
[19.380412 , -99.178789])
# Using the vincenty distance function.
m_dist = pdist(coordinates, # Coordinates matrix or tuples list
# Vicenty distance in lambda function
lambda u, v: vincenty(u, v).kilometers)
使用最新的 Python 3,现在给出弃用警告。我实际上发现 this answer by @cffk 更容易理解:
(为了方便粘贴在这里)
>>> from geopy.distance import great_circle
>>> from geopy.distance import geodesic
>>> p1 = (31.8300167,35.0662833) # (lat, lon) - https://goo.gl/maps/TQwDd
>>> p2 = (31.8300000,35.0708167) # (lat, lon) - https://goo.gl/maps/lHrrg
>>> geodesic(p1, p2).meters
429.1676644986777
>>> great_circle(p1, p2).meters
428.28877358686776