Расчет расстояния между двумя точками в одном столбце python

У меня есть два столбца в файле CSV, которые я импортировал в фреймворк pandas. Первый столбец - это широта, а Второй столбец - долгота. Для каждой широты и долготы я хочу найти расстояние между всеми другими координатами в столбце и вернуть местоположение наименьшего расстояния.

import pandas as pd
import numpy as np
import geopy.distance
from math import sin,cos,sqrt,atan2,radians

df=pd.read_csv('coordinates.csv')
R=6373.0

df['coords']=list(zip(df['lat'],df['long'])
df['coords2']=list(zip(df['lat'],df['long'])

Итак, для каждой координаты я хочу иметь возможность найти наименьшую координату среди всех остальных в списке, но мой цикл for ниже просто дает длинный список расстояний без отслеживания местоположения.

У меня есть функция расстояния, которая принимает 2 балла:

def distance (p1, p2):
    return (geopy.distance.vincenty(p1,p2).km)

dist=[]
for i in range(0,len(df.coords)):
         for j in range(0,len(df.coords2)):
             if df.coords[i] != df.coords2[j]:
                 x=distance2(df.coords[i],df.coords2[j])
                 dist.append(df.coords[i], x)

Образец данных:

location lat            long
0        34.159525  -82.381883
1        33.57112   -81.761782
2        32.965361  -81.248054
3        34.511574  -82.646487

Требуемый результат:

   location lat         long         closest_distance
    0        34.159525  -82.381883   2
    1        33.57112   -81.761782   3
    2        32.965361  -81.248054   3
    3        34.511574  -82.646487   0

person user6754289    schedule 19.02.2018    source источник
comment
Разве не сработает простой for перебор? Зависит от размера файлов.   -  person Sqoshu    schedule 19.02.2018
comment
Это меньше, чем 100 строк, такой маленький файл. У вас есть образец того, как это будет выглядеть?   -  person user6754289    schedule 19.02.2018


Ответы (1)


Предполагая, что функция distance, которую вы определили, работает, когда два входа одинаковы (возвращая 0), следующий брутфорс должен работать:

def foo(latlong, location=list(range(len(latlong))):
    closest_distance = []
    for i in latlong:
        dist = list(map(lambda x: distance(i,x), latlong))
        min = dist.sort()
        closest_distance.append(location[dist.index(min[1])])
    return closest_distance

latlong - это список кортежей долгота-долгота, а местоположение - это список имен, которые вы выбираете для этих пар, которые из вашей записи выглядят как простая нумерация.

person stochastic13    schedule 19.02.2018
comment
Будет ли это работать, если мои координаты находятся в разных столбцах. Итак, для каждой координаты в столбце 1 я хочу найти ближайшую координату к столбцу 2? - person user6754289; 21.02.2018
comment
да. На карте сопоставьте функцию расстояния с другим столбцом. Вам нужно будет передать идентификатор другого столбца в аргумент местоположения. - person stochastic13; 21.02.2018