如何在熊猫数据框中使用纬度和经度计算距离?

时间:2019-04-01 21:51:28

标签: python-3.x pandas geolocation latitude-longitude

我有一个数据框,该数据框具有两列经度和纬度,以及863行,因此每一行都有一个由纬度和经度定义的点坐标。现在,我要计算所有行之间的距离(以公里为单位)。我正在使用以下参考链接来获取纬度和经度对之间的距离。如果有几行,我可以使用参考链接来完成。但是我的行很大,我想需要一个循环来解决问题。由于我是python的新手,所以我无法创建循环这种想法的逻辑。

参考链接: Getting distance between two points based on latitude/longitude

我的数据框如下:

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

2 个答案:

答案 0 :(得分:3)

请注意:以下脚本不考虑地球的曲率。 Convert lat/long to 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 来显示相对于坐标的距离。

LocalDate

答案 1 :(得分:2)

您可以使用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行之间的距离

这似乎比使用自定义haversine函数的scipy的pdist更快