簡體   English   中英

使用haversine公式循環遍歷Python lat lon coords

[英]Looping through Python lat lon coords using haversine formula

我正在嘗試遍歷多行緯度/經度坐標,並為每個坐標創建一個新的“距離”列。

這就是它的樣子:我使用了這個公式:

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

很抱歉格式不正確 - 誰能幫我理解發生了什么?

謝謝!

我想通了,我使用的是這個公式:

# 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] 並且效果很好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM