Как рассчитать расстояние, используя широту и долготу в кадре данных панд? - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть фрейм данных с двумя столбцами широты и долготы и 863 строки, так что у каждой строки есть координата точки, определяемая широтой и долготой.Теперь я хочу рассчитать расстояние между всеми рядами в километрах.Я использую следующую ссылку для получения расстояния между парой широты и долготы.Если бы было несколько строк, я мог бы сделать, используя ссылку ссылки.Но у меня большие строки, и я думаю, что мне нужен цикл для решения проблемы.Поскольку я новичок в Python, я не смог создать логику для зацикливания этой идеи.

Ссылочная ссылка: Получение расстояния между двумя точками на основе широты / долготы

Мой фрейм данных выглядит так:

read_randomly_generated_lat_lon.head(3)
Lat          Lon
43.937845   -97.905537
44.310739   -97.588820
44.914698   -99.003517

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Обратите внимание: следующий скрипт не учитывает кривизну земли. Существует множество документов Преобразование широты / длины в XY , объясняющих эту проблему.

Однако расстояние между координатами может быть приблизительно определено. Экспорт представляет собой серию, которая может быть легко concatenated с вашим исходным df, чтобы обеспечить отдельное column отображение расстояния относительно ваших координат.

d = ({
    'Lat' : [43.937845,44.310739,44.914698],       
    'Long' : [-97.905537,-97.588820,-99.003517],                               
     })

df = pd.DataFrame(d)

df = df[['Lat','Long']]

point1 = df.iloc[0]

def to_xy(point):

    r = 6371000 #radians of the earth (m)
    lam,phi = point
    cos_phi_0 = np.cos(np.radians(phi))

    return (r * np.radians(lam) * cos_phi_0, 
            r * np.radians(phi))

point1_xy = to_xy(point1)

df['to_xy'] = df.apply(lambda x: 
         tuple(x.values),
         axis=1).map(to_xy)

df['Y'], df['X'] = df.to_xy.str[0], df.to_xy.str[1]

df = df[['X','Y']] 
df = df.diff()

dist = np.sqrt(df['X']**2 + df['Y']**2)

#Convert to km
dist = dist/1000

print(dist)

0           NaN
1     41.149537
2    204.640462
2 голосов
/ 02 апреля 2019

Вы можете сделать это, используя scikit-learn:

import numpy as np
from sklearn.neighbors import DistanceMetric

dfr = df.copy()
dfr.Lat = np.radians(df.Lat)
dfr.Lon = np.radians(df.Lon)
hs = DistanceMetric.get_metric("haversine")
(hs.pairwise(dfr)*6371) # Earth radius in km

Выход:

array([[  0.        ,  48.56264446, 139.2836099 ],
       [ 48.56264446,   0.        , 130.57312786],
       [139.2836099 , 130.57312786,   0.        ]])

Обратите внимание, что выходные данные представляют собой квадратную матрицу, где элемент (i, j) - это расстояние между строкой i и строкой j

Это кажется быстрее, чем использование pdist от scipy с пользовательской haversine функцией

...