Как упростить маршрутизируемую сеть?


24

У меня есть сетевой график, который мне нужно упростить в смысле уменьшения количества ребер . Идея состоит в том, чтобы объединить узлы, которые расположены близко друг к другу, и удалить короткие соединительные ребра.

Как этого достичь в PostGIS или GRASS? Или есть ли лучшие подходы для автоматического упрощения такой сети?

Я уже попробовал функцию ST_SnapToGrid, но я не доволен результатами (серый = оригинальный, черный = привязанный):

введите описание изображения здесь


1
Вы делаете это, чтобы упростить сетевой анализ или для целей отображения? Если это первое, какой анализ будет выполнен?
whuber

Это для анализа кратчайшего пути.
Подземье

2
Поскольку многие алгоритмы кратчайшего пути являются O (E + V), возможно, вам даже не нужно это упрощение? С другой стороны, для таких анализов вы часто можете сделать значительно более агрессивные упрощения. Например, этот набор из трех параллельных сегментов и их смежных сегментов слева (выглядящий как H-in-a-box) может быть заменен треугольником, если в этих сегментах нет ни источника, ни пункта назначения. Я упоминаю об этом, потому что я уверен, что есть (не ГИС) код для таких операций над (абстрактными) графами.
whuber

Вы хотите сохранить геометрию ребер (например, кривые) или достаточно просто поддерживать топологию + узел XY? Кроме того, необходимо ли гарантировать, что узлы на разных Z (например, эстакады) не сцепляются друг с другом?
AnserGIS

Топология является ключевой. Геометрия может немного измениться. Z заказ должен остаться без изменений.
Подземье

Ответы:


7

Самое близкое, что я зашел, это:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

Он ломает дороги с допуском 5 метров и удаляет все линии нулевой длины. Это не оптимальное решение, так как кажется, что оно привязано к некоторой вершине случайным образом.

введите описание изображения здесь


Действительно, результат может быть не точным, но использование v.clean интересно, спасибо, что поделились
simo

Это изображение создано в траве?
NetConstructor.com

На рисунке показаны результаты GRASS v.clean, визуализированные в QGIS.
Подземье

Есть какие-то проблемы с поддержанием "странных перекрестков" или дорог с разграничением?
Дассоуки

Как насчет обработки ST_SnapToGrid после v.clean?
kttii

5

Вы пробовали GRASS v.generalize ?

v.generalizeпозволяет выбрать алгоритм обобщения с атрибутом метода . Существует множество: douglas, douglas_reduction, lang, Reduction, Reumann, Boyle, Sliding_averaging, distance_weighting, Chaiken, Hermite, Snakes, Network, смещения .

И дополнительные параметры , как threshold, degree_thresh, angle_thresh( в зависимости от выбранного алгоритма) может помочь вам получить точный результат.

Здесь идет учебник .


Спасибо за ссылку. Я даю ему попытку, хотя на самом деле я не понимаю, какая комбинация значений метода и пороговых значений даст нужный мне результат.
Подземье

Я действительно не могу найти метод v.generalize, который будет делать то, что я хочу.
Подземье

2
Жаль, что команда богата множеством алгоритмов, но, как вы сказали ранее, вероятно, довольно сложно настроить получение ожидаемого результата. Может быть, гуру обобщения алгоритмов, здесь? Вы пробовали также метод змей ?
Симо

Здесь не альго-гуру, но я считаю, что метод змей лучший для некоторых из моих опытов v.genralize, которые я делал в прошлом.
Манинг

1
Для записи, параметры были упрощены на сегодняшний день в GRASS SVN. Стать частью GRASS 6.4.2.
markusN

4

Я этого не делал, но думаю, что могу предложить направление.

  1. Создайте топологию с PostGIS для вашего графика.
  2. Найти все узлы только с двумя ребрами.
  3. Исцели края.

ST_ModEdgeHeal объединит одно ребро с другим. ST_NewEdgeHeal заменит оба с новым ребром.

Руководство по топологии PostGIS


Спасибо @Sean. Будет ли это делать что-то еще, кроме как объединить два края? Любая идея о том, как удалить короткие края и соединить их узлы?
Подземье

@ Под землей, я не вижу ничего простого. Вы можете сделать все это в PL / SQL, но это, вероятно, не поможет. Можете ли вы сначала запустить ST_SnapToGrid?
Шон

1

@underdark, я вижу, что вы написали инструмент для уплотнения строк в Sextante. Поэтому я предлагаю следующий алгоритм, чтобы избежать «случайной» привязки одной из ваших точек.

Выберите отрезки, от которых вы хотите избавиться, исходя из их длины.

Для каждого из этих сегментов создайте точку в средней точке

Удалить маленький сегмент

Теперь вы можете использовать ST_Snap в PostGIS (см. Пример здесь )

РЕДАКТИРОВАТЬ: обратите внимание, что в вашем случае, вы также могли бы сначала использовать v.net для удаления псевдо-узлов (узел, который соединяет только две линии)


Пожалуйста, опишите, как v.net может быть использован для удаления псевдо-узлов. Спасибо
osmjit

0

Расскажите, как Микаэль Мишо проанализировал это в списке разработчиков OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

Спасибо за публикацию этого ответа. Я немного сбит с толку, почему вы заставляете график быть плоским. В конце концов, уличные сети не являются плоскими графами (мосты, туннели).
Подземье

Только потому, что Микаэль провел быстрый тест с существующими графическими инструментами, которые он написал для OpenJUMP, и в настоящий момент они не поддерживают неплоские графы. Пропустите первый шаг, если в QGIS и GRASS есть похожие инструменты, которые поддерживают непланарные графики.
user30184

Я думаю, что это правильный подход - разделить сеть на плоские графы. В каждом плоском графе задача проще - например, можно использовать описанный выше подход или просто триангулировать и прополотить TIN коротких краев дороги. Затем снова извлеките края дороги и объедините слои.
AnserGIS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.