Ближайшая координата маршрута к заданной точке с использованием алгоритма поиска (python)

#python #search #coordinates #haversine

#python #Поиск #координаты #haversine

Вопрос:

У меня есть маршруты, которые представлены в виде координат с широтой / длиной. В зависимости от протяженности маршрута он может иметь 100 или даже 800 координат. Затем у меня снова есть конкретная координата с широтой / длиной, которая представляет мое местоположение. То, что я пытаюсь сделать, это найти ближайшую точку (координату) на маршруте к моему местоположению. Я могу сделать это с помощью формулы haversine, вычисляющей расстояние от каждой точки маршрута до моего местоположения, и взять минимальное, но это может занять слишком много времени, потому что некоторые маршруты действительно длинные и есть много точек для сравнения. Существует ли алгоритм поиска, который может помочь решить эту проблему? Я провел исследование по поиску золотого сечения, но не мог быть уверен, что это то, что я искал.

Ответ №1:

Я могу придумать два способа, которыми вы могли бы решить эту проблему. Одним из них было бы создание K-D дерева для каждого из маршрутов и запрос вашей новой координатной точки в каждом дереве для поиска ближайшей точки. Проверьте sci-kit KDTree

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

 import numpy as np
from sklearn.metrics import euclidean_distances

x = np.array([[0.1, 0.5]])
route = np.random.rand((10,2))

array([[0.78275588, 0.92844543],
       [0.30066744, 0.21161873],
       [0.95533462, 0.11647814],
       [0.37786273, 0.58306683],
       [0.86670199, 0.90861542],
       [0.68658895, 0.60087646],
       [0.19966574, 0.57160265],
       [0.34182302, 0.02809684],
       [0.08862117, 0.89459785],
       [0.18083728, 0.39331416]])

dist = euclidean_distances(x,route)

array([[0.80605278, 0.35132774, 0.9373827 , 0.29001344, 0.8687914 ,
        0.59519968, 0.12272001, 0.53025557, 0.39476188, 0.13385266]])
 

Тогда, если мы получим argmin, как вы можете видеть, ближайшая точка — это 6-й элемент

 np.argmin(euclidean_distances(x,route))
6