使用 scipy 测量地理距离

MER*_*ose 5 python scipy geographic-distance

我没有使用scipy'spdist函数的结果。我对真实的地理距离感兴趣(首选单位:公里)。取以下坐标:

from scipy.spatial.distance import pdist

coordinates = [ (42.057, -71.08), (39.132, -84.5155) ]
distance = pdist(coordinates)
print distance
# [ 13.75021037]
Run Code Online (Sandbox Code Playgroud)

但是单位是什么?谷歌称这两个点之间的距离为 1179 公里。我如何从 13.75021037 到达那里?

RZR*_*KAL 5

在pdist从方法scipy不支持距离的lon,lat坐标,如在评论中提到。

但是,如果您想获取pdist返回的距离矩阵的类型,则可以使用包中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)
Run Code Online (Sandbox Code Playgroud)


小智 3

使用最新的 Python 3,现在会发出弃用警告。事实上,我发现@cffk的这个答案更容易理解:

(为了方便,粘贴到这里)

>>> from geopy.distance import geodesic, great_circle
>>> 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
Run Code Online (Sandbox Code Playgroud)