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

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 для удаления псевдо-узлов (узел, который соединяет только две линии)

radouxju
источник
Пожалуйста, опишите, как 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
user30184
источник
Спасибо за публикацию этого ответа. Я немного сбит с толку, почему вы заставляете график быть плоским. В конце концов, уличные сети не являются плоскими графами (мосты, туннели).
Подземье
Только потому, что Микаэль провел быстрый тест с существующими графическими инструментами, которые он написал для OpenJUMP, и в настоящий момент они не поддерживают неплоские графы. Пропустите первый шаг, если в QGIS и GRASS есть похожие инструменты, которые поддерживают непланарные графики.
user30184
Я думаю, что это правильный подход - разделить сеть на плоские графы. В каждом плоском графе задача проще - например, можно использовать описанный выше подход или просто триангулировать и прополотить TIN коротких краев дороги. Затем снова извлеките края дороги и объедините слои.
AnserGIS