OSMNX — какая «часть» ребра считается ближайшей

#python #openstreetmap #osmnx

Вопрос:

Я использую функцию nearest_edges в OSMNX. Мне непонятно, какая «часть» ребра используется при выполнении этого вычисления. Является ли это какой-либо частью ребра? Это промежуточная точка?

Для длинных ребер в сети это имело бы довольно большое значение.

Комментарии:

1. Пожалуйста, предоставьте свой код. Его метод зависит от параметризации.

Ответ №1:

Это зависит от того, как вы параметризовали функцию. Из nearest_edges документации функции:

Найдите ближайшее ребро к точке или к каждой из нескольких точек.

Если X и Y являются значениями одной координаты, это вернет ближайшее ребро к этой точке. Если X и Y представляют собой списки значений координат, это вернет ближайшее ребро к каждой точке.

Если значение interpolate равно None, выполните поиск ближайшего ребра к каждой точке по одному, используя r-дерево и минимизируя евклидовы расстояния от точки до возможных совпадений. Для точности используйте спроецированный график и точки. Этот метод является точным, а также самым быстрым при поиске нескольких точек относительно размера графика.

Для более быстрого метода при поиске многих точек относительно размера графика используйте аргумент interpolate для интерполяции точек вдоль ребер и их индексации. Если график проецируется, для евклидова поиска ближайших соседей используется kd-дерево, для чего требуется, чтобы scipy был установлен в качестве необязательной зависимости. Если граф не проецируется, для поиска ближайшего соседа используется дерево шаров, для чего требуется, чтобы scikit-learn был установлен в качестве необязательной зависимости.

Поэтому, если вы уйдете interpolate=None (в идеале, используя спроецированный график и спроецированные точки для точности), функция найдет ближайшие ребра к вашей точке (точкам) на основе минимального расстояния точки до любой части геометрии ребра. Это геометрически точно и быстрее всего, если искать только несколько точек на большом графике.

В качестве альтернативы, если вы передаете interpolate значение аргумента, функция будет интерполировать равномерно расположенные точки вдоль ребер, а затем находить ближайшие ребра к вашей точке (точкам) на основе минимального расстояния точки до любой интерполированной точки вдоль геометрии ребра. Это немного геометрически неточно (причем эта неточность зависит от вашего interpolate значения), но быстрее всего при поиске многих точек, особенно на графике меньшего или среднего размера.