Рассчитать расстояние ближайшего соседа в питоне между двумя точками на основе критериев - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть набор данных, в котором есть GPS-координаты школ по уровням начальной и средней школы.Чтобы выяснить, где строить новые школы, мне нужно рассчитать расстояние между каждой младшей начальной школой до старшей начальной школы и расстояние между старшей начальной школой до ближайшей средней школы.

Я использую Python имог бы посоветовать, как лучше всего сделать этот расчет.Выходные данные должны добавить два двух дополнительных столбца в CSV.1) должен указать ближайшую среднюю школу и 2) должен указать расстояние в км до этой средней школы.

У меня есть функция расстояния, которая работает, но у меня возникают проблемы при сравнении расстояния одной конкретной строки свсе остальные указанные строки, например, сравнение расстояния одной нижней первичной строки 1-4 со всеми остальными первичными 1-8 строками и сохранение выходных данных в новом столбце.

Цените любые советы здесь.

Спасибо

Изображение набора данных CSV

EDIT2- Рабочий код на данный момент:

Алгоритм работает с некоторыми небольшими выборочными данными, но он плохо масштабируется.Я сталкиваюсь с ошибками памяти с 60000 точек данных, с которыми пытаюсь работать

    # Algorithm for calculating the closest upper primary school for lower primary schools. 

for i, row in df.iterrows():
    listy = 0
    school = []
    if row['LS_Type'] == 'Primary (1-4)':
        a = row['Northing']
        b = row['Easting']
        LS_ID = row['LS_ID']
        for j, row2 in df.iterrows():
            if row2['LS_Type'] == 'Primary (1-8)':
                dist_km = distance(a,b, df.Northing[j], df.Easting[j])
                if (listy == 0):
                    listy = dist_km
                    school.append([df.LS_Name[j], df.LS_ID[j]])
                else:
                    if dist_km < listy:
                        listy = dist_km
                        school[0] = [df.LS_Name[j], int(df.LS_ID[j])]
        df['dist_up_prim'][i] = listy
        df["closest_up_prim"][i] = school[0]

    else:
        df['dist_up_prim'][i] = 0

1 Ответ

0 голосов
/ 01 марта 2019

Его действительно сложно вычислить.Лучше использовать функции гео или нативных функций из баз данных, таких как Spatialite.Если вы вычислите его с помощью картезианского пространства, вы увидите, что в результате возникнут ошибки, потому что Земля не плоская, потому что это распространено для использования геопространственных моделей.И плюс, если вам нужно реальное расстояние до прибытия до цели, вы должны помнить, что путь - это не линия.Также вы можете использовать API Google Maps

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...