使用Haversine公式遍历Python纬度坐标

问题描述 投票:0回答:1

我试图遍历经/纬坐标的许多行,并为每个坐标创建一个新的“距离”列。

外观如下:我使用了这个公式:

def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
"""
slightly modified version: of http://stackoverflow.com/a/29546836/2901002

Calculate the great circle distance between two points
on the earth (specified in decimal degrees or in radians)

All (lat, lon) coordinates must have numeric dtypes and be of equal length.

"""
if to_radians:
    lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])

a = np.sin((lat2-lat1)/2.0)**2 + \
    np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

return earth_radius * 2 * np.arcsin(np.sqrt(a))


df['dist'] = \
    haversine(df.lat.shift(), df.lon.shift(),
             df.loc[1:, 'lat'], df.loc[1:, 'lon'])

但是我收到此错误:

AttributeError                            Traceback (most recent call last)
~\anaconda3\envs\geopandas\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
  5273                 return self[name]
-> 5274             return object.__getattribute__(self, name)
5275 

AttributeError: 'Series' object has no attribute 'radians'

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
<ipython-input-10-e19d56f45506> in <module>
   20 df['dist'] = \
  21     haversine(df.lat.shift(), df.lon.shift(),
 ---> 22                  df.loc[1:, 'lat'], df.loc[1:, 'lon'])

<ipython-input-10-e19d56f45506> in haversine(lat1, lon1, lat2, lon2, to_radians, earth_radius)
 10     """
 11     if to_radians:
 ---> 12         lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
 13 
 14     a = np.sin((lat2-lat1)/2.0)**2 + \

 TypeError: loop of ufunc does not support argument 0 of type Series which has no callable radians 
 method

对不起,格式化很麻烦-有人可以帮我了解发生了什么吗?

谢谢!

python loops coordinates distance haversine
1个回答
0
投票

我知道了,我在用这个公式:

# vectorized haversine function
def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
"""
slightly modified version: of http://stackoverflow.com/a/29546836/2901002

Calculate the great circle distance between two points
on the earth (specified in decimal degrees or in radians)

All (lat, lon) coordinates must have numeric dtypes and be of equal length.

"""
if to_radians:
    lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])

a = np.sin((lat2-lat1)/2.0)**2 + \
    np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

return earth_radius * 2 * np.arcsin(np.sqrt(a))


df['dist'] = \
haversine(df.LAT.shift(), df.LONG.shift(),
             df.loc[1:, 'LAT'], df.loc[1:, 'LONG'])

但是将np.radians更改为map(np.radians,[lat1,lon1,lat2,lon2],它工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.