问题描述
我想在熊猫中找到带有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
解决方法
您在处理相关公式中有关 lat
和 long
的计算时未能使用正确的单位。这是可运行的代码,一步一步。
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