Какой эффективный способ обнаружения дорожных развязок на карте?

14

Я могу получать карты из любого источника для моего проекта, и для алгоритма C ++, который я делаю, необходимо, чтобы алгоритм знал, где находятся дорожные развязки (узлы, где встречаются более двух сегментов дороги). Кроме того, на многих картах, которые я получаю, есть дороги, которые выходят за границы и ниже (то есть: дороги не связаны должным образом). Одним из способов решения проблемы является «очистка» дорожной сети с помощью Autocad. У меня есть следующие вопросы:

  1. Есть ли эффективный способ (любое программное обеспечение, которое может это сделать?) Получить мою карту в формате GML, который содержит информацию о дорожных развязках на карте? (возможно, есть тег GML, который говорит, что конкретный узел является соединением)
  2. Есть ли другой способ «очистить» дорожную сеть?

Коллеги предложили FME, но это включает в себя написание сценариев, и мы не уверены, будет ли сценарий достаточно гибким, чтобы обслуживать все карты. Единственный другой способ обнаружить перекрестки - это использовать грубую силу и определить, какие участки дороги имеют общие узлы. Поможет ли ArcGIS? (не использовал, но слышал об этом) Я уверен, что должен быть лучший способ ...

навигационный
источник
2
Нужно ли найти самопересекающиеся дороги? Как это должно обращаться с вырожденными геометриями (полилинии, где все вершины совпадают, таким образом, имея нулевую длину). Как он должен обрабатывать совпадающие линии, где пересечение является линейным отрезком, а не просто точкой?
Кирк Куйкендалл
@Kirk: я немного шокирован ситуациями, о которых вы упомянули. Я новичок в ГИС и даже не знал, что такие возможности существуют. 1.Самое пересечение требует нескольких сегментов. Если это не эстакада, я бы посчитал эти перекрестки перекрестками. 2. Я даже не могу представить, что такое вырожденная геометрия, поэтому я не знаю, что ответить. 3.Соединительные линии должны рассматриваться как две отдельные дороги, потому что я так полагаю, что они будут и в реальной жизни.
Nav

Ответы:

9

Если у вас есть дороги в пространственной форме, например, Shapefile, вы можете загрузить их в PostGIS и автоматически найти те, которые используют SQL-запрос. Я делал это раньше - оператор SQL предназначен для поиска для каждой дороги тех, которые пересекаются географически и создают узловую точку для каждого перекрестка.

Я постараюсь убрать это позже, но вот основной поток, который вы можете взять ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Функции ST_ * - вот что делает эту работу в PostGIS

  • ST_Envelope : захватывает ограничивающий прямоугольник заданной геометрии - это используется для ускорения алгоритма. Можно сузить географический поиск с помощью ограничительных рамок в быстром, но менее точном проходе, а затем отсканировать результаты с фактической геометрией.
  • ST_Intersects : определяет, пересекаются ли две геометрии
  • ST_Intersection : возвращает пересечение двух геометрий

Ниже приведены только фрагменты, так как у меня нет времени, чтобы закончить, возможно, кто-то может отредактировать его, прежде чем я вернусь сюда ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
dmsnell
источник
Просто делюсь: Еще одна база данных, с которой я столкнулся, - < oracle.com/technetwork/database/berkeleydb/overview/index.html >. По-видимому, запросы очень быстрые, потому что они доступны в виде библиотек, которые могут быть встроены в приложение.
Nav
1
@ dmsnell - Может быть, вы могли бы привести пример типа SQL-запроса, используемого для выполнения этой задачи?
RyanKDalton
11

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

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

Вот пример 10-миллиметрового буфера полилинии (серый) и его -10-метрового буфера (светло-красный) на карте шириной 650 м:

фигура 1

Теперь пересекаем исходный слой полилинии с этими островными полигонами, объединяем сегменты по идентификатору острова и подсчитываем куски:

фигура 2

Светло-желтые сегменты обозначают фрагменты с большим количеством, а темно-голубые сегменты обозначают фрагменты с низким количеством. Таким образом, мы (а) нашли все изгибы и пересечения (включая самопересечения) и ближние перекрестки (см. Крайний левый угол, где два отрезка не совсем сходятся)) и (б) дифференцировали изгибы от пересечений. Мы можем найти почти соединения, выбрав острова, которые содержат два или более соединенных сегмента: изгибы содержат только соединенные сегменты.

Из-за симметрии буферизации центроиды островков пересечения являются точками пересечения.

Одним из прекрасных аспектов этого стиля анализа является то, что ему все равно, как представлена ​​базовая полилиния: это может быть одна особенность, это может быть одна особенность для каждого отрезка или что-то среднее между ними.

Whuber
источник
6

Да, вы могли бы сделать это с FME наверняка. Есть много «преобразователей», которые обрабатывают очистку, пересечения и топологию; Я бы попробовал трансформатор TopologyBuilder в этом случае.

Все сценарии выполняются в графической среде, поэтому это очень просто сделать.

Вы всегда можете получить пробную версию с www.safe.com

(Раскрытие: Марк Ирландия, также известный как FME Evangelist, Safe Software Inc.)

Марк Ирландия
источник
Я второй это. FME отлично подходит для этой конкретной задачи, как для преобразования из AutoCAD в GML, так и для топологической очистки. Он может быть поразительно универсален в своем применении.
blord-castillo
-1

Сетевой аналитик Arcgis, который вы можете получить с помощью бесплатной пробной версии, делает это менее чем за 10 секунд и всего за несколько кликов.

Тад
источник
-1

Процесс можно выполнить в ArcGIS с помощью сетевого аналитика.

В ArcGIS есть и другой путь: вы можете выполнить следующие шаги: «Arctoolbox» → «Инструменты управления данными» → «Функции» → «Вершины точек к точкам», и там вы можете делать то, что вам нужно.

Кровать
источник