Цикл через широту с помощью функции Хаверсинуса по сравнению с одной широтой - PullRequest
0 голосов
/ 19 июня 2020

У меня есть два фрейма данных, один с множеством строк lat / lon точек, например:

lat            lon   
32.8000009     -117.536
32.800005      -117.047   
etc...    

Мы назовем это df1,

и df только с одной lat / lon точкой (мы назовем ее df2)

Ycoord     Xcoord 
32.8005     -117.0473

Я пытаюсь использовать функцию гаверсинуса для l oop через первый фрейм данных для каждой lat lon точки и найти расстояние от них до второй df.

Я смог использовать код, чтобы выяснить, как пройти l oop через первый df с помощью функции haversine, вычислить расстояние от одной точки до следующей и поместить их в новый столбец , но как мне l oop через первый 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()

, и результат, который я получил, выглядел так:

lat            lon            distMI_cleaned
32.8000009     -117.536       0
32.800005      -117.047       .0003450
etc...  

Итак, мой вопрос в том, как создать этот новый столбец, похожий на distMI_cleaned, но dist_from_df2 в качестве нового столбца? Извините, я новичок во всем этом и искал все в Google, чтобы зайти так далеко. Спасибо!

1 Ответ

0 голосов
/ 20 июня 2020

Я решил вручную ввести точки lat lon из 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
...