找到具有半正弦误差的熊猫中 2 个坐标之间的距离

问题描述

我想在熊猫中找到带有haversine的2个坐标之间的距离,但它给了我错误: 包含多个元素的数组的真值是不明确的。使用 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


解决方法

您在处理相关公式中有关 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')

在这一步,数据框df3

        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