[英]Looping through Python lat lon coords using haversine formula
[英]Looping through lat lon with Haversine function comparing to one lat lon
我有兩個數據框,一個有很多行的lat
/ lon
點,如下所示:
lat lon
32.8000009 -117.536
32.800005 -117.047
etc...
我們稱之為df1
,
和一個只有一個lat
/ lon
點的df
(我們稱之為df2
)
Ycoord Xcoord
32.8005 -117.0473
我正在嘗試使用 haversine function 循環遍歷每個lat
點的第一個lon
並找到從這些點到第二個df
的距離。
我能夠使用代碼來弄清楚如何使用haversine
function 循環遍歷第一個df
並計算從一個點到下一個點的距離並將它們放在新列中,但是我如何在比較時循環遍歷第一個df
第二個df
(只有一對點)而不是前一個點?
這是我以前使用的代碼:
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 = map(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['distKM_cleaned'] = \
haversine(df.lat.shift(), df.lon.shift(),
df.loc[1:, 'lat'], df.loc[1:, 'lon'])
df['distMI_cleaned'] = df['distKM_cleaned'] * 0.621371
#distKM is in km, distMI is converted to miles
df.tail()
我得到的 output 看起來像這樣:
lat lon distMI_cleaned
32.8000009 -117.536 0
32.800005 -117.047 .0003450
etc...
所以我的問題是如何創建這個新列,類似於 distMI_cleaned 但 dist_from_df2 作為新列? 抱歉,我對所有這一切都是全新的,並且已經用谷歌搜索了所有內容甚至可以做到這一點。 謝謝!
我決定手動輸入 df2 中的經緯度點(此處為 lon1、lat1),這對我有用!
def haversine(row):
lon1 = -117.047343
lat1 = 32.800027
lon2 = row['lon']
lat2 = row['lat']
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 * np.arcsin(sqrt(a))
km = 6367 * c
return km
df['distance_from_HomeMI'] = df.apply(lambda row: haversine(row), axis=1) * 0.621371
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.