Задача. Если задана координата X, найдите "n" ближайшую линию-многоугольник для координаты X, а не только "n" ближайших точек. Пример: https://i.imgur.com/qyxV2MF.png
У меня есть группа пространственных линейных полигонов, которые могут иметь более двух координат. Их координаты хранятся в (Scipy) KDtree, чтобы включить поиск NN.
Во-первых, я буду запрашивать число "i" ближайших координат, а затем искать соответствующие координаты линии-полигоны → "i", возможно, не обязательно создают строки "i".
Чтобы достичь "n" ближайших линий, мне нужно увеличить "i". Моя проблема в том, что "i" может быть непредсказуемым, потому что количество коордов варьируется между каждым линейным полигоном. Например, многоугольник линии может быть представлен двумя координатами, а другой может быть представлен с использованием 10 координат. Большую часть времени мне нужно только 2 ближайших соседних линейных полигона из точки X.
В примере изображения мне нужны строки A и B в качестве результата. Даже с "i" = 3 будет найдена только строка A, потому что A1, A2, A3 являются ближайшими соседями к X.
Вопрос: Есть ли способ группировать координаты формы вместе, а затем выполнять поиск NN для получения "n" уникальных форм? (кроме грубой форсировки "i" для обеспечения "n" уникальных форм)
Текущий псевдоод обходного пути:
found = []
while True:
if first_loop:
result = look up N nearest coords
else:
result = look up Nth nearest coord
look up shapes using result and append to found
perform de-duplication of found
if len(found) >= required:
return found
else:
N = N+1 # to check the Nth neighbor next iteration
Если я правильно понял ваш вопрос, это проблема наличия правильных структур данных.
Пусть имеют следующие структуры данных: 1. Словарь из линейных полигонов в точки 2. Другой словарь из точек в линейные многоугольники (или, что то же самое, одно двунаправленную карту из bidict вместо пары словарей) 3. посещенный булевой массив с размером, равным количеству точек
Теперь следующий алгоритм должен решить вашу проблему (может быть эффективно реализован с вышеуказанными структурами данных):
Для всех точек инициализируйте посещенный массив False.
Найдите ближайшую точку к точке запроса сначала из kd-дерева, пометьте совпадающую точку и все точки из соответствующего многоугольника, совпадающие с точкой, которые были посещены, и возвратите этот конкретный многоугольник (id) в качестве ближайшего многоугольника (если там многократные такие многоугольники, возвращают все из них).
Повторите шаг 2 до тех пор, пока не будут возвращены такие (разные) полигоны. Рассмотрим новую точку, возвращенную из kd-дерева, в соответствии с точкой запроса, если она еще не была посещена (если совпадающая точка, возвращаемая kd-деревом, уже посещена, отбросьте ее и запросите следующую ближайшую согласованную точку). Как только точка посещается, отметьте точку и все точки из соответствующего многоугольника (ов) по мере посещения и верните многоугольник (ы).
Я вижу два способа сделать это эффективно: