【问题标题】:Calculate distance between latitude and longitude in dataframe计算数据框中纬度和经度之间的距离
【发布时间】:2017-06-08 23:03:54
【问题描述】:

我的数据框中有 4 列包含以下数据:

Start_latitude<br>
Start_longitude<br>
Stop_latitude<br>
Stop_longitude<br>

我需要计算经纬度对之间的距离,并使用计算的距离创建一个新列。

我遇到了一个可以为我执行此操作的包 (geopy)。但我需要将一个元组传递给geopy。如何在 pandas 的数据框中应用此函数(geopy)以获取所有记录?

【问题讨论】:

    标签: python pandas geopy


    【解决方案1】:

    我建议您使用 pyproj 而不是 geopy。 geopy 依赖于在线服务,而 pyproj 是本地的(这意味着它会更快并且不会依赖于 Internet 连接)并且其方法更透明(例如,参见 here),它们基于本质上是基础的 Proj4 代码库所有开源 GIS 软件,可能还有您会使用的许多 Web 服务。

    #!/usr/bin/env python3
    
    import pandas as pd
    import numpy as np
    from pyproj import Geod
    
    wgs84_geod = Geod(ellps='WGS84') #Distance will be measured on this ellipsoid - more accurate than a spherical method
    
    #Get distance between pairs of lat-lon points
    def Distance(lat1,lon1,lat2,lon2):
      az12,az21,dist = wgs84_geod.inv(lon1,lat1,lon2,lat2) #Yes, this order is correct
      return dist
    
    #Create test data
    lat1 = np.random.uniform(-90,90,100)
    lon1 = np.random.uniform(-180,180,100)
    lat2 = np.random.uniform(-90,90,100)
    lon2 = np.random.uniform(-180,180,100)
    
    #Package as a dataframe
    df = pd.DataFrame({'lat1':lat1,'lon1':lon1,'lat2':lat2,'lon2':lon2})
    
    #Add/update a column to the data frame with the distances (in metres)
    df['dist'] = Distance(df['lat1'].tolist(),df['lon1'].tolist(),df['lat2'].tolist(),df['lon2'].tolist())
    

    PyProj 有一些文档here

    【讨论】:

    • 问题是我无法安装 pyproj。我收到一条错误消息,提示安装失败。它还要求我安装 Visual Basic
    • 你在使用anaconda吗?这是尝试与 Windows 共存的更理智的方式之一。
    • 缺少 Visual C++。设法安装它。代码效果很好!谢谢!只是想知道这是如何计算距离的?它在两点之间画一条直线?
    • @Harikrishna:“直线”是什么意思?通过一个太短的欧几里得 3 空间。大圆是球体上的最短距离;然而,地球是在扁球体上。 Proj4 使用的方法取自 GeographicLib(参见here),使用 WGS84 椭球,精确到 ~15nm。我相信它是基于C. F. F. Karney, Algorithms for gedesics, J. Geodesy ‘’‘87’‘’(1), 43-55 (2013), DOI: 10.1007/s00190-012-0578-z; geo-addenda.html.
    • @Harikrishna:如果您觉得这个答案有帮助,请随时单击其左侧的向上箭头来支持它。如果您认为这是对您的问题的最佳答案,您可以单击答案旁边的复选标记的轮廓。
    【解决方案2】:

    来自 geopy 的文档:https://pypi.python.org/pypi/geopy。你可以这样做:

    from geopy.distance import vincenty
    
    # Define the two points
    start = (start_latitute, start_longitude)
    stop = (stop_latitude, stop_longitude)
    
    # Print the vincenty distance
    print(vincenty(start, stop).meters)
    
    # Print the great circle distance
    print(great_circle(start, stop).meters)
    

    将其与 Pandas 相结合。假设您有一个数据框df。我们首先创建函数:

    def distance_calc (row):
        start = (row['start_latitute'], row['start_longitude'])
        stop = (row['stop_latitude'], row['stop_longitude'])
    
        return vincenty(start, stop).meters
    

    然后将其应用到数据框:

    df['distance'] = df.apply (lambda row: distance_calc (row),axis=1)
    

    注意 axis=1 说明符,这意味着应用程序是在行级别而不是列级别完成的。

    【讨论】:

    • 如何将操作应用到 pandas 中的整个数据框?
    • 抱歉还在输入,我不小心点击了提交
    • 为什么我会收到错误提示“DataFrame”对象没有属性“rows”
    • 谢谢!现在我正面临这个问题。如果我使用 great_circle 来查找距离,它会起作用。但是如果我使用 vincenty,它会说找不到 vincenty。
    • 您是否正确导入了 vincenty?另外不要忘记将问题标记为已回答。
    猜你喜欢
    • 2022-11-03
    • 2018-09-01
    • 2012-10-13
    • 2012-01-26
    • 1970-01-01
    • 2012-11-22
    • 2021-09-05
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多