如何使用 pandas 数据框中的纬度和经度计算距离?
How to calculate distance using latitude and longitude in a pandas dataframe?
我有一个包含两列纬度和经度以及 863 行的数据框,因此每行都有一个由纬度和经度定义的点坐标。现在我想计算所有行之间的距离(以公里为单位)。我正在使用以下参考 link 来获取纬度和经度对之间的距离。如果有几行,我可以使用引用 link 来完成。但是我有很多行,我想我需要一个循环来解决问题。因为我是 python 的新手,所以我无法创建循环这个想法的逻辑。
参考link:
Getting distance between two points based on latitude/longitude
我的数据框如下所示:
read_randomly_generated_lat_lon.head(3)
Lat Lon
43.937845 -97.905537
44.310739 -97.588820
44.914698 -99.003517
您可以使用 scikit-learn 执行此操作:
import numpy as np
from sklearn.neighbors import DistanceMetric
dfr = df.copy()
dfr.Lat = np.radians(df.Lat)
dfr.Lon = np.radians(df.Lon)
hs = DistanceMetric.get_metric("haversine")
(hs.pairwise(dfr)*6371) # Earth radius in km
输出:
array([[ 0. , 48.56264446, 139.2836099 ],
[ 48.56264446, 0. , 130.57312786],
[139.2836099 , 130.57312786, 0. ]])
注意输出是一个方阵,其中元素(i,j)是第i行和第j行的距离
这似乎比使用带有自定义 haversine
函数的 scipy 的 pdist 更快
请注意:以下脚本未考虑地球曲率。有很多文档 Convert lat/long to XY 解释了这个问题。
但是,坐标之间的距离可以粗略确定。导出的是一个系列,可以很容易地 concatenated
与您的原始 df
一起提供单独的 column
显示相对于您的坐标的距离。
d = ({
'Lat' : [43.937845,44.310739,44.914698],
'Long' : [-97.905537,-97.588820,-99.003517],
})
df = pd.DataFrame(d)
df = df[['Lat','Long']]
point1 = df.iloc[0]
def to_xy(point):
r = 6371000 #radians of the earth (m)
lam,phi = point
cos_phi_0 = np.cos(np.radians(phi))
return (r * np.radians(lam) * cos_phi_0,
r * np.radians(phi))
point1_xy = to_xy(point1)
df['to_xy'] = df.apply(lambda x:
tuple(x.values),
axis=1).map(to_xy)
df['Y'], df['X'] = df.to_xy.str[0], df.to_xy.str[1]
df = df[['X','Y']]
df = df.diff()
dist = np.sqrt(df['X']**2 + df['Y']**2)
#Convert to km
dist = dist/1000
print(dist)
0 NaN
1 41.149537
2 204.640462
我有一个包含两列纬度和经度以及 863 行的数据框,因此每行都有一个由纬度和经度定义的点坐标。现在我想计算所有行之间的距离(以公里为单位)。我正在使用以下参考 link 来获取纬度和经度对之间的距离。如果有几行,我可以使用引用 link 来完成。但是我有很多行,我想我需要一个循环来解决问题。因为我是 python 的新手,所以我无法创建循环这个想法的逻辑。
参考link: Getting distance between two points based on latitude/longitude
我的数据框如下所示:
read_randomly_generated_lat_lon.head(3)
Lat Lon
43.937845 -97.905537
44.310739 -97.588820
44.914698 -99.003517
您可以使用 scikit-learn 执行此操作:
import numpy as np
from sklearn.neighbors import DistanceMetric
dfr = df.copy()
dfr.Lat = np.radians(df.Lat)
dfr.Lon = np.radians(df.Lon)
hs = DistanceMetric.get_metric("haversine")
(hs.pairwise(dfr)*6371) # Earth radius in km
输出:
array([[ 0. , 48.56264446, 139.2836099 ],
[ 48.56264446, 0. , 130.57312786],
[139.2836099 , 130.57312786, 0. ]])
注意输出是一个方阵,其中元素(i,j)是第i行和第j行的距离
这似乎比使用带有自定义 haversine
函数的 scipy 的 pdist 更快
请注意:以下脚本未考虑地球曲率。有很多文档 Convert lat/long to XY 解释了这个问题。
但是,坐标之间的距离可以粗略确定。导出的是一个系列,可以很容易地 concatenated
与您的原始 df
一起提供单独的 column
显示相对于您的坐标的距离。
d = ({
'Lat' : [43.937845,44.310739,44.914698],
'Long' : [-97.905537,-97.588820,-99.003517],
})
df = pd.DataFrame(d)
df = df[['Lat','Long']]
point1 = df.iloc[0]
def to_xy(point):
r = 6371000 #radians of the earth (m)
lam,phi = point
cos_phi_0 = np.cos(np.radians(phi))
return (r * np.radians(lam) * cos_phi_0,
r * np.radians(phi))
point1_xy = to_xy(point1)
df['to_xy'] = df.apply(lambda x:
tuple(x.values),
axis=1).map(to_xy)
df['Y'], df['X'] = df.to_xy.str[0], df.to_xy.str[1]
df = df[['X','Y']]
df = df.diff()
dist = np.sqrt(df['X']**2 + df['Y']**2)
#Convert to km
dist = dist/1000
print(dist)
0 NaN
1 41.149537
2 204.640462