问题
I fail to use the outcome of scipy
's pdist
function. I am interested in the real geographic distance (preferred unit: km). Take the following coordinates:
from scipy.spatial.distance import pdist
coordinates = [ (42.057, -71.08), (39.132, -84.5155) ]
distance = pdist(coordinates)
print distance
# [ 13.75021037]
But what's the unit? Google says the distance between these two points is 1179 km. How do I get there from 13.75021037?
回答1:
Using the latest Python 3, this now gives a deprecation warning. I actually found this answer by @cffk much easier to understand:
(pasting here for convenience)
>>> 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
回答2:
The pdist
method from scipy
does not support distance for lon
, lat
coordinates, as mentioned at the comments.
However, if you like to get the kind of distance matrix that pdist
returns, you may use the pdist
method and the distance methods provided at the geopy
package. To do so, pdist
allows to calculate distances with a custom function with two arguments (a lambda function).
Here is an example:
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)
来源:https://stackoverflow.com/questions/31632190/measuring-geographic-distance-with-scipy