找到带有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()
中的所有lat
和long
必须以弧度表示。乘以np.pi/180
。
【参考方案1】:
在相关公式中处理有关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')
这一步,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个坐标之间的距离的主要内容,如果未能解决你的问题,请参考以下文章