找到带有haversine错误的pandas中2个坐标之间的距离

Posted

技术标签:

【中文标题】找到带有haversine错误的pandas中2个坐标之间的距离【英文标题】:Find the distance between 2 coords in pandas with haversine error 【发布时间】:2021-05-04 13:02:03 【问题描述】:

我想在 pandas 中找到 2 个坐标与 Haversine 之间的距离,但它给了我错误: 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()

my df:
   latitude    longitude    buc_lat    buc_long
0  46.161411   27.662575    44.433     26.1024
1  44.420262   26.126688    44.433     26.1024
2  44.413853   26.096157    44.433     26.1024

我的代码:

import numpy as np

def haversine_vectorize(lon1, lat1, lon2, lat2):

    newlon = lon2 - lon1
    newlat = lat2 - lat1

    haver_formula = np.sin(newlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(newlon/2.0)**2

    dist = 2 * np.arcsin(np.sqrt(haver_formula ))
    km = 6367 * dist #6367 for distance in KM for miles use 3958
    return km


【问题讨论】:

请分享minimal reproducible example 与易于使用的数据。 haversine_vectorize() 中的所有latlong 必须以弧度表示。乘以np.pi/180 【参考方案1】:

在相关公式中处理有关latlong 的计算时,您没有使用正确的单位。下面是可运行的代码,一步一步来。

from io import StringIO
import pandas as pd
import numpy as np

data_str = """index   latitude    longitude    buc_lat    buc_long
0  46.161411   27.662575    44.433     26.1024
1  44.420262   26.126688    44.433     26.1024
2  44.413853   26.096157    44.433     26.1024"""

df3 = pd.read_csv(StringIO(data_str), sep='\s+', index_col='index')

这一步,dataframedf3

        latitude  longitude  buc_lat  buc_long
index                                                      
0      46.161411  27.662575   44.433   26.1024
1      44.420262  26.126688   44.433   26.1024
2      44.413853  26.096157   44.433   26.1024

你的距离函数应该是这样的。

def haversine_vectorize(row):
    rho = np.pi/180
    # convert all values to radians
    lon1=row.longitude*rho
    lat1=row.latitude*rho
    lon2=row.buc_long*rho
    lat2=row.buc_lat*rho

    newlon = lon2 - lon1
    newlat = lat2 - lat1

    haver_formula = np.sin(newlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(newlon/2.0)**2

    dist = 2 * np.arcsin(np.sqrt(haver_formula ))
    # use appropriate value for radius of the earth (this is crude!)
    km = 6367 * dist #6367 for distance in KM for miles use 3958
    print(" Distance  km:".format(km))
    return km

要计算并获取距离,请执行此操作。

ans = df3.apply(haversine_vectorize, axis=1)

在数据框df3 中创建一个新列以保留刚刚获得的距离。

df3["distance_km"] = ans

最后,你会得到数据框

        latitude  longitude  buc_lat  buc_long  distance_km
index                                                      
0      46.161411  27.662575   44.433   26.1024   227.506591
1      44.420262  26.126688   44.433   26.1024     2.391419
2      44.413853  26.096157   44.433   26.1024     2.184640

【讨论】:

以上是关于找到带有haversine错误的pandas中2个坐标之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

球形余弦Haversine公式

雄辩的haversine公式没有按预期工作

查找与其他用户 Sql Server 2005 的距离的问题 - Haversine

每个客户的连续行之间的Haversine距离

Python Pandas,尝试更新单元格值

Sql:Haversine 公式错误列不存在