【问题标题】:How to calculate distance using latitude and longitude in a pandas dataframe?如何使用熊猫数据框中的纬度和经度计算距离?
【发布时间】:2019-08-23 03:34:12
【问题描述】:

我有一个数据框,它有两列纬度和经度,以及 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

【问题讨论】:

  • 向我们提供创建数据框一部分的代码会很有用,以便能够帮助解决您遇到的具体问题。
  • @VasilisD 谢谢。我现在编辑了我的问题。
  • 谢谢。由于您有 863 行,您是否要计算所有距离对,即 863 * 862 / 2 值?如果是这样,您希望以哪种格式输出,以矩阵形式还是...?
  • 没错。如果我能够在新列中存储距离,那就太好了。
  • 这没有意义。每个Lat Lon 组合都是一个点。因此,您必须将某些行与其他行进行比较才能计算距离。您无法计算纬度和经度之间的距离。

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


【解决方案1】:

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

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

【讨论】:

  • 那么,在这种情况下,43.937845 -97.90553744.310739 -97.588820 之间的距离是多少? 48.56264446306492 km?
  • 没错。最初的问题想要“在新列中”的距离,但如果 OP 想要成对距离,这没有意义
【解决方案2】:

请注意:以下脚本不考虑地球的曲率。有许多文档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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多