具有两个lat列和两个long列的pandas数据帧中的距离计算

时间:2017-08-23 14:31:30

标签: python pandas distance latitude-longitude

我有一个带有这4个colums的pandas Dataframe df:

  • pickup_latitude
  • pickup_longitude
  • dropoff_latitude
  • dropoff_longitude

我想创建一个新的列,其中拾取点和下降点之间的距离。

我创建了这个函数:

def calcul_de_distance_vol_oiseau(data):

R = 6373.0

""" je change les variables en radians car python parle en radian et pas en degrées """
data['pickup_longitude'] = data['pickup_longitude'].apply(radians)
data['pickup_latitude'] = data['pickup_latitude'].apply(radians)
data['dropoff_longitude'] = data['dropoff_longitude'].apply(radians)
data['dropoff_latitude'] = data['dropoff_latitude'].apply(radians)

data['diff_lon'] = data['dropoff_longitude'] - data['pickup_longitude']
data['diff_lat'] = data['dropoff_latitude'] - data['dropoff_latitude']

data['calcul_intermediaire']= (data['diff_lat'] / 2).apply(sin)**2 + data['pickup_latitude'].apply(cos) * data['dropoff_latitude'].apply(cos) * (data['diff_lon'] / 2).apply(sin)**2

data['distance'] = R*np.arctan2((data['calcul_intermediaire']).apply(sqrt),(1 - data['calcul_intermediaire']).apply(sqrt))

return data

但是当我想验证我的点之间的距离时,我得到的结果与此网站https://www.sunearthtools.com/fr/tools/distance.php中的结果不一样,即gps点之间的距离。 我认为我的功能存在数学错误,但我找不到。

提前致谢

3 个答案:

答案 0 :(得分:2)

我认为你只需要:

data['pickup_longitude'] = data['pickup_longitude'].apply(radians)

和其他列的类似代码(使用lambda或定义函数)。

答案 1 :(得分:1)

这有效,您还可以使用geopy.distance.distance():

>>def distance(row):
    >>>return geopy.distance.distance((row.start_lats, row.start_longs),(row.end_lats, row.end_longs)).mi

>>new_df['miles_traveled']= new_df.apply(lambda r: distance(r), axis=1)

答案 2 :(得分:0)

(迟到但是......) 我建议你使用geopy.distance vincenty ,定义一个与pandas接口的函数 并使用此函数创建新的dateframe列:

from geopy.distance import vincenty

def pandasVincenty(row):
    '''calculate distance (m) between two lat&long points using the Vincenty formula '''

    return vincenty((row.pickup_latitude, row.pickup_longitude), (row.dropoff_latitude, row.dropoff_longitude)).meters 


data['distance'] =  data.apply(lambda r: pandasVincenty(r), axis=1)

这使用度数作为输入,并将米作为输出......