Возвращает минимальное расстояние между наборами координат долготы/широты

Я пишу код для вычисления кратчайшего расстояния между двумя наборами точек. По сути, я создал CSV-файл с набором местоположений в координатах и ​​второй CSV-файл со вторым набором местоположений в координатах. Например, координаты в списке A могут быть (50, -10), (60, 70), (40, -19), а в списке B это могут быть (40, 87), (60, 90), ( 23, 20). Все, что я нашел в Интернете, чтобы помочь мне вычислить между списком и одной точкой: это не сработает для меня.

Пока я могу рассчитать расстояние между всеми точками (то есть между A1 и B1, A1 и B2, A1 и B3, A2 и B1 и т. д.). Это нормально, но мне нужно минимальное расстояние от точки 1 в списке A до ЛЮБОЙ точки в списке B. По сути, какая позиция в списке B ближе всего к каждой точке в списке A?

Я пытаюсь найти способ запустить его, чтобы он сравнивал A1 с B1, B2, B3 и т. д., а затем возвращался с кратчайшим расстоянием, например, x миль между A1 и B3.

То, что у меня есть до сих пор, ниже:

import pandas as pd
import geopy.distance

df = pd.read_csv('AirportCoords.csv')
df2 = pd.read_csv('HotelCoords.csv')

for i,row in df2.iterrows():
coordinate = row.lat, row.long
for i,row in df.iterrows():
    coordinate2 = row.latitude, row.longitude

    distance = geopy.distance.geodesic(coordinate, coordinate2).km
    print(distance)

person TeenySceney    schedule 13.11.2019    source источник
comment
Возможно, это поможет вам.   -  person Péter Leéh    schedule 13.11.2019


Ответы (1)


Вы говорите о сравнении каждого элемента A с каждым элементом B, это означает, что у вас должен быть вложенный цикл, но ваш пример кода на самом деле имеет 2 цикла в последовательности.

import pandas as pd
import geopy.distance

df = pd.read_csv('AirportCoords.csv')
df2 = pd.read_csv('HotelCoords.csv')


for i,row in df.iterrows(): # A
    a = row.latitude, row.longitude
    distances = []
    for j,row2 in df2.iterrows(): # B
        b = row2.lat, row2.long
        distances.append(geopy.distance.geodesic(a, b).km)

    min_distance = min(distances)
    min_index = distances.index(min_distance)

    print("A", i, "is closest to B", min_index, min_distance, "km")
person Hymns For Disco    schedule 13.11.2019
comment
спасибо! Очень глупая ошибка, но теперь я понимаю вложенные циклы, поэтому не могу вас отблагодарить. - person TeenySceney; 13.11.2019
comment
Пожалуйста. Если это полностью ответило на ваш вопрос, не могли бы вы пометить его как принятый ответ? Таким образом, вопрос будет отображаться как решенный - person Hymns For Disco; 13.11.2019