Географические препятствия в поиске по радиусу

Я здесь новичок и плохо отношусь к бедным, поэтому могу предложить только 50-процентную награду.

Предположим, у меня есть приложение для поиска всех заправочных станций в радиусе 10 миль от определенного места. Однако одна сторона этого места окружена горным хребтом, в котором вам нужно проехать 50 миль, чтобы обойти. Вы не хотели бы возвращать результаты с другой стороны горы. Какие хорошие алгоритмы/методы для решения этой проблемы? Я знаю, что при поиске по точкам вы можете использовать затраты на пути, но я не уверен, что метод использует радиус поиска.

Вот пример:

alt text

Красная линия - это аккорд на круге радиуса от 40, от -74 до 41, -72 лат (неточно говорящий). Пользователь в 40, -73 выполняет поиск по географическому радиусу для чего-то, что также охватывает области через звук LI в Коннектикуте, который нецелесообразно. Алгоритм должен знать, что существует хорда, полностью пересекающая круг поиска и не возвращающая результаты, которые находятся на другой стороне этого аккорда. Таким образом, только точки в зеленой зоне будут возвращены.

Это должно быть сделано без анализа дорожной сети, если программист определяет эти ограничивающие линии. Например, в какой-то стране может быть область, которая опасна для прохождения, и вы хотите, чтобы люди по обе стороны от этой области были ограничены этой стороной. Или международная граница и т.д. Я просто спрашиваю об этом, потому что я уверен, что люди это делают.

Ответы

Ответ 1

Хотя лучшим решением было бы рассчитать расстояние по дорожной сети (а не прямолинейное расстояние), используя, например, ArcGIS Network Analyst, грязный взломать создание прямых линий между центром вашего радиуса и каждой станцией, затем вычислите общее усиление высоты вдоль этого профиля (a script, для этого автоматически присваивается здесь). Затем вы можете установить пороговое значение, чтобы отклонить те, у которых общий рост высоты выше определенного значения (те, которые вам нужно преодолеть с горы).

РЕДАКТИРОВАТЬ Поскольку вы, похоже, не используете сетевой анализ, почему бы не создать карту стоимости растра, в которой значение соответствует сложности прохождения этой местности? Это может быть основано на других данных (т.е. Водных объектах, высоте, обложке и т.д.). Затем вы можете либо вернуть станцию ​​с наименьшей стоимостью, либо сделать выбор по атрибуту, используя карту затрат...

Другой вариант - создать многоугольный векторный слой, показывающий непроходимые зоны (горы, водоемы и т.д.), а затем создать линию между вашим местоположением и всеми станциями в радиусе. Используя выбор по местоположению, вы можете увидеть, пересекает ли эта линия любой из непроходимых полигонов; если это произойдет, отмените выбор станции.

Лучшим инструментом для задачи является сетевой анализ...

Ответ 2

Вы должны изменить свой показатель, что значит "рядом". В вашем примере в 10 милях от окружающих мячей 10 миль. Тем не менее, вы можете захотеть запросить любые заправочные станции, где кратчайший путь по улицам не должен превышать 10 миль.

Вы также можете комбинировать оба подхода и сначала запрашивать все окружающие точки, а затем фильтровать их, то есть вычислять длины маршрута.

Если вы больше входите в алгоритмы, я предлагаю вам взглянуть на алгоритмы поиска пути, используемые для помощников по навигации.

Ответ 3

Решение, которое, возможно, ближе к тому, что вы просите, - это найти места для всех заправочных станций в районе, добавить точки пересечения между окружностью и границами вашей зоны запрещения, а затем выполнить топологическую сортировку по результирующему набору узлов в 2- мерного пространства. Поиск АЗС в определенной области будет таким же простым, как возврат набора значений, которые попадают в заданный диапазон, если сортировать записи в наборе.

Подробнее см. Главы 5.10.1 и 15.2 в "Руководстве по разработке алгоритмов" Стивена Скинн'а. Библиотека графов Boost обеспечивает реализацию топологического алгоритма сортировки.

Я все еще думаю, что это строго проблема графа, поэтому "радиус 10 миль" - это не то, что ваш алгоритм будет использовать для поиска совпадений, а скорее расстояние до дороги. Хорошее решение должно также включать такие факторы, как ограничение скорости на дорогах, односторонние улицы и т.д. И позволять пользователю включать в функцию калькуляции для наилучшего соответствия.