Як спростити мережу маршрутизації?


24

У мене є мережевий графік, який мені потрібно спростити в сенсі зменшення кількості ребер . Ідея полягала б у злитті вузлів, розташованих близько один до одного, та видалення з'єднувальних коротких країв.

Як цього можна досягти в PostGIS або GRASS? Або є кращі підходи до автоматичного спрощення такої мережі?

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

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


1
Ви робите це для спрощення аналізу на основі мережі або для відображення? Якщо це колишній, який аналіз буде проведено?
whuber

Це для найкоротшого аналізу.
underdark

2
Оскільки багато алгоритмів найкоротшого шляху - це O (E + V), можливо, це спрощення вам навіть не потрібно? З іншого боку, для таких аналізів часто можна зробити різко більш агресивні спрощення. Наприклад, цей набір з трьох паралельних сегментів та прилеглих до них сегментів зліва (схожий на коробку з Н-в-вікні) можна замінити трикутником, якщо в цих сегментах немає походження або місця призначення. Я згадую про це, тому що я впевнений, що для таких операцій на (абстрактних) графіках є (не-ГІС) код.
whuber

Ви хочете зберегти геометрію ребер (наприклад, криві) чи достатньо лише збереження топології + вузол XY? Крім того, чи потрібно, щоб вузли на різних Z (наприклад, перехід) не з'єднувалися разом?
AnserGIS

Топологія є ключовою. Геометрія може трохи змінитися. Z порядок повинен залишатися недоторканим.
underdark

Відповіді:


7

Найближче до цього я зайшов:

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

Це обрив доріг з допуском 5 метрів і видалення всіх ліній нульової довжини. Це не оптимальне рішення, оскільки воно, мабуть, досить випадково підходить до якоїсь вершини.

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


Дійсно, результат може бути не точним, але використання v.clean цікаве, дякую за обмін
simo

Це зображення створене в траві?
NetConstructor.com

На зображенні показані результати GRASS v.clean, візуалізовані в QGIS.
андермаркет

Будь-які проблеми із підтриманням "дивних перехресть" чи дороги, розділеної класами?
dassouki

Як щодо обробки ST_SnapToGrid після v.clean?
kttii

5

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

v.generalizeдозволяє вибрати алгоритм узагальнення з атрибутом методу . Існує купа: дуглас, дуглас_редукція, ланг, скорочення, реуманн, бойл, ковзання_посередження, дистанція_втягання, чайкен, герміт, змій, мережа, переміщення .

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

Тут виходить підручник .


Дякую за посилання Я намагаюсь, хоча я не дуже розумію, яке поєднання методу та порогових значень дасть результат, який я шукаю.
underdark

Я дійсно не можу знайти метод v.generalize, який буде робити те, що я хочу.
underdark

2
Шкода, що команда багата багатьма алгоритмами, але, як ви вже говорили раніше, це, мабуть, досить складно налаштувати для отримання очікуваного результату. Може, тут алгоритми узагальнення гуру? Ви спробували також метод змій ?
simo

Тут не альгогуру, але я вважаю, що метод змій найкращий для деяких моїх пробіг v.genralize, які я робив у минулому.
maning

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

4

Я цього не робив, але думаю, що можу запропонувати напрямок.

  1. Створіть топологію з PostGIS для свого графіка.
  2. Знайдіть усі вузли, які мають лише два ребра.
  3. Обробити краї.

ST_ModEdgeHeal об'єднає один край в інший. ST_NewEdgeHeal замінить обидва новим краєм.

Посібник з топології PostGIS


Дякую @Sean Це зробить щось інше, ніж злиття двох країв? Будь-яка ідея про те, як видалити короткі краї та з'єднати їх вузли разом?
underdark

@Underdark, я не бачу нічого простого. Ви можете зробити це все в PL / SQL, але це, ймовірно, не допомагає. Чи можете ви запустити ST_SnapToGrid спочатку?
Шон

1

@underdark, я бачу, що ви написали інструмент для ущільнення рядків у Sextante. Тому я пропоную наступний алгоритм, щоб уникнути "випадкового" оснащення однієї з ваших точок.

Виберіть сегменти рядка, від яких ви хочете позбутися, виходячи з їх довжини.

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

Видаліть невеликий сегмент

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

EDIT: зауважте, що у вашому випадку ви також можете спочатку скористатися 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

Дякуємо, що опублікували цю відповідь. Я трохи розгублений, чому ви примусите графік до планарності. Адже вуличні мережі - це не плоскі графіки (мости, тунелі).
underdark

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

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