Measuring geographic distance with scipy
Asked Answered
E

2

7

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?

Epigenesis answered 25/7, 2015 at 23:44 Comment(3)
pdist , AFAICT, doesn't have any way to read the coordinates as lat-long. It's taking them as vectors in (AFAICT) R^n. I believe you want to look for spherical distance or great circle distance.Anemic
A better tool for what you want is geopy. See pypi.python.org/pypi/geopy for an example of using it to calculate geodesic distance between two points specified with lat and long.Madid
@cphlewis: Thanks for the suggestion. One remark: Your first link appears to be broken.Epigenesis
A
3

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 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
Almeda answered 13/3, 2019 at 15:3 Comment(0)
T
8

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)
Technic answered 28/2, 2018 at 22:50 Comment(0)
A
3

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 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
Almeda answered 13/3, 2019 at 15:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.