使用Scipy测量地理距离

7

我无法使用scipypdist函数的结果。我对真实的地理距离感兴趣(首选单位:公里)。采用以下坐标:

from scipy.spatial.distance import pdist

coordinates = [ (42.057, -71.08), (39.132, -84.5155) ]
distance = pdist(coordinates)
print distance
# [ 13.75021037]

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


2
pdist,AFAICT 没有办法将坐标读取为经纬度。它将它们作为(AFAICT)R^n中的向量进行处理。我相信您想寻找球面距离大圆距离 - cphlewis
1
你想要的更好的工具是geopy。请参阅https://pypi.python.org/pypi/geopy,了解如何使用它来计算指定经纬度的两点之间的大圆距离的示例。 - user4322779
@cphlewis:感谢您的建议。有一点需要指出的是:您提供的第一个链接好像已经失效了。 - MERose
2个回答

8
scipy 中的 pdist 方法不支持对经纬度坐标 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)

3
使用最新的Python 3,现在会出现弃用警告。我发现this answer by @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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接