如何将 haversine 公式应用于一组坐标

How to apply haversine formula to a set of coordinates

我需要计算一组坐标的距离。我有计算它的功能,但我不知道如何在我的数据上使用它。

from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
  lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
  dlon = lon2 - lon1 
  dlat = lat2 - lat1 
  a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
  c = 2 * asin(sqrt(a)) 
  r = 6371
  return c * r

到目前为止我所做的是将列转换为列表:

lat1= frame['Start Station Lat'].values.tolist()
long1= frame['Start Station Long'].values.tolist()
long2=frame['End Station Long'].values.tolist()
lat1= frame['End Station Lat'].values.tolist()

然后我尝试使用 apply() 函数:

frame['distance_travelled'] = frame.apply(lambda lon1,lat1,lon2,lat2: haversine(lon1,lat1,lon2,lat2), axis=1)

但是没有奏效。请指教!

非常感谢。

因此,如果我理解正确,这可能会有所帮助;在框架上使用 apply 函数可以访问行的值,这意味着您不需要将列转换为列表。因此,对于您的示例案例,您可以这样做:

frame['distance_travelled'] = frame.apply(lambda x: haversine(x['Start Station Lat'],x['Start Station Long'],x['End Station Long'],x['End Station Lat']), axis=1)

另外,为了以防万一,您将 2x lat1 作为变量名:

lat1 = frame['Start Station Lat'].values.tolist() ###HERE
long1= frame['Start Station Long'].values.tolist()
long2=frame['End Station Long'].values.tolist()
lat1= frame ['End Station Lat'].values.tolist() ###HERE