Рассчитать расстояние между широтой и долготой в кадре данных

У меня в столбце данных 4 столбца, содержащих следующие данные:
Start_latitude
Start_longitude
Stop_latitude
Stop_longitude

Мне нужно вычислить расстояние между парой широта-долгота и создать новый столбец с вычисленным расстоянием.

Я наткнулся на пакет (геоп), который может сделать это для меня. Но мне нужно передать кортеж в Geopy. Как применить эту функцию (geopy) ко всем данным в фрейме данных в пандах?

2 ответа

Решение

Я бы порекомендовал вам использовать pyproj вместо geopy. geopy полагается на онлайн-сервисы, тогда как pyproj является локальным (то есть он будет быстрее и не будет полагаться на интернет-соединение) и более прозрачным в отношении своих методов (см. здесь, например), которые основаны на кодовой базе Proj4, которая лежит в основе практически всех открытых - программное обеспечение ГИС-источников и, возможно, многие из веб-сервисов, которые вы бы использовали.

#!/usr/bin/env python3

import pandas as pd
import numpy as np
from pyproj import Geod

wgs84_geod = Geod(ellps='WGS84') #Distance will be measured on this ellipsoid - more accurate than a spherical method

#Get distance between pairs of lat-lon points
def Distance(lat1,lon1,lat2,lon2):
  az12,az21,dist = wgs84_geod.inv(lon1,lat1,lon2,lat2) #Yes, this order is correct
  return dist

#Create test data
lat1 = np.random.uniform(-90,90,100)
lon1 = np.random.uniform(-180,180,100)
lat2 = np.random.uniform(-90,90,100)
lon2 = np.random.uniform(-180,180,100)

#Package as a dataframe
df = pd.DataFrame({'lat1':lat1,'lon1':lon1,'lat2':lat2,'lon2':lon2})

#Add/update a column to the data frame with the distances (in metres)
df['dist'] = Distance(df['lat1'].tolist(),df['lon1'].tolist(),df['lat2'].tolist(),df['lon2'].tolist())

PyProj имеет некоторую документацию здесь.

Из документации geopy: https://pypi.python.org/pypi/geopy. Вы можете сделать это, выполнив:

from geopy.distance import vincenty

# Define the two points
start = (start_latitute, start_longitude)
stop = (stop_latitude, stop_longitude)

# Print the vincenty distance
print(vincenty(start, stop).meters)

# Print the great circle distance
print(great_circle(start, stop).meters)

Сочетая это с пандами. Если у вас есть датафрейм df, Сначала мы создаем функцию:

def distance_calc (row):
    start = (row['start_latitute'], row['start_longitude'])
    stop = (row['stop_latitude'], row['stop_longitude'])

    return vincenty(start, stop).meters

А затем примените его к фрейму данных:

df['distance'] = df.apply (lambda row: distance_calc (row),axis=1)

Обратите внимание на спецификатор axis=1, это означает, что приложение выполняется на уровне строки, а не на уровне столбца.

Другие вопросы по тегам