Yönlendirilebilir bir ağ nasıl basitleştirilir?


24

Kenar sayısını azaltma anlamında basitleştirmem gereken bir ağ grafiğim var . Fikir, birbirine yakın yerleştirilmiş düğümleri birleştirmek ve kısa kenarları birleştirmek olacaktır.

PostGIS veya GRASS'da bu nasıl başarılabilir? Veya böyle bir ağı otomatik olarak basitleştirmek için daha iyi yaklaşımlar var mı?

ST_SnapToGrid işlevini zaten denedim ancak sonuçlardan memnun değilim (gray = original, black = snapped):

görüntü tanımını buraya girin


1
Bunu, ağ tabanlı bir analizi basitleştirmek veya görüntüleme amacıyla mı yapıyorsunuz? Eski ise, hangi analiz yapılacak?
whuber

En kısa yol analizi için.
underdark

2
En kısa yol algoritmalarının çoğu O (E + V) olduğundan, belki de bu sadeleştirmeye ihtiyacınız yok mu? Diğer uçta, bu tür analizler için sık sık daha agresif sadeleştirmeler yapabilirsiniz. Örneğin, bu üç paralel bölüm kümesi ve soldaki bitişik bölümleri (bir kutuda H'ye benzeyen), bu bölümlerin içinde başlangıç ​​veya hedef bulunmuyorsa, bir üçgenle değiştirilebilir. Bunu söylüyorum, çünkü (soyut) grafiklerdeki işlemler için (GIS dışı) bir kod olduğundan eminim.
whuber

Kenarların geometrisini (ör. Eğriler) korumak mı istiyorsunuz yoksa sadece topoloji + düğüm XY'yi korumak yeterli mi? Ayrıca, farklı Z'deki düğümlerin (örneğin, üstgeçitlerin) birbirine geçmediğinden emin olmanız gerekir mi?
AnserGIS

Topoloji anahtardır. Geometri biraz değişebilir. Z emri bozulmadan kalmalı.
underdark

Yanıtlar:


7

Şimdiye kadar geldiğim en yakın şey şudur:

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

Yolları 5 metre toleransla kapatıyor ve sıfır uzunluktaki tüm çizgileri kaldırıyor. Bazı tepe noktalarına rastgele rastgele göründüğü için ideal bir çözüm değildir.

görüntü tanımını buraya girin


Aslında, sonuç belki doğru olmayabilir ama v.clean'in kullanımı ilginç, paylaşım için teşekkürler
simo

Bu görüntü çimlerde mi yaratılıyor?
NetConstructor.com

Resimde QGIS'de görselleştirilmiş GRASS v.clean sonuçları gösterilmektedir.
saat

"Garip kavşak" veya sınıfla ayrılmış yolları korumaya ilişkin herhangi bir sorun var mı?
dassouki

V.clean'den sonra ST_SnapToGrid'i işlemeye ne dersiniz?
kttii

5

GRASS v.generalize'ı denediniz mi?

v.generalizeyöntem özniteliği ile genelleme algoritmasını seçmenize olanak sağlar . Bir demet var: douglas, douglas_reduction, lang, redüksiyon, reumann, boyle, sliding_averaging, distance_weighting, chaiken, hermite, yılanlar, ağ, yer değiştirme .

Ve ek parametreler olarak threshold, degree_thresh, angle_thresh(seçilen algoritmaya bağlı olarak) doğru bir sonuç almak için yardımcı olabilir.

İşte bir öğretici geliyor .


Bağlantı için teşekkürler. Ben deniyorum, ancak hangi yöntem ve eşik değer kombinasyonlarının aradığım sonucu vereceğini anlamadım.
underdark

İstediğimi yapacak bir v.generalize yöntem bulamıyorum.
underdark

2
Yazık, komut birçok algoritma bakımından zengin, ancak daha önce de söylediğiniz gibi, beklenen sonucu almak için ayarlanması muhtemelen oldukça karmaşık. Belki burada genelleme algoritmaları gurusu? Yılan yöntemini de denedin mi?
simo

Burada bir algo-guru değil, ancak geçmişte yaptığım v.genralize çalışmalarımın bazıları için en iyi yılan yöntemini buluyorum.
Maning

1
Kayıt için parametreler bugün itibariyle GRASS SVN'de basitleştirilmiştir. GRASS'ın bir parçası olmak 6.4.2.
markusN

4

Bunu yapmadım ama bir yön önerebilirim.

  1. Grafiğiniz için PostGIS ile bir topoloji oluşturun.
  2. Sadece iki kenarı olan tüm düğümleri bulun.
  3. Kenarları iyileştir.

ST_ModEdgeHeal bir kenarı diğerine birleştirir. ST_NewEdgeHeal her ikisini de yeni bir kenara bırakacak.

PostGIS Topoloji kılavuzu


@Sean'a teşekkürler. Bu iki kenarı birleştirmekten başka bir şey yapar mı? Kısa kenarların nasıl kaldırılacağı ve düğümlerinin birbirine yapışacağı hakkında bir fikriniz var mı?
underdark

@Underdark, basit bir şey göremiyorum. Hepsini PL / SQL'de yapabilirsiniz, ancak bu muhtemelen yardımcı olmaz. Önce ST_SnapToGrid'i çalıştırabilir misin?
Sean,

1

@ underdark, Sextante'deki çizgileri yoğunlaştırmak için bir araç yazdığınızı gördüm. Bu nedenle, puanlarınızdan birinin "rastgele" şekilde sıkışmasını önlemek için aşağıdaki algoritmayı öneririm.

Boyuna bağlı olarak kurtulmak istediğiniz çizgi parçalarını seçin.

Bu segmentlerin her biri için orta noktada bir nokta oluşturun

Küçük kesimi sil

Şimdi PostGIS'te ST_Snap kullanabilirsiniz ( buradaki örneğe bakınız )

EDIT: sizin durumunuzda, sözde düğümleri (sadece iki satırı birbirine bağlayan düğüm) kaldırmak için önce v.net'i kullanabileceğinizi unutmayın.


Lütfen v.net’in sözde düğümleri kaldırmak için nasıl kullanılabileceğini açıklayınız. Thanks
osmjit

0

Michaël Michaud'un OpenJUMP geliştirici listesinde bunu nasıl analiz ettiğini iletme:

> 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

Bu cevabı gönderdiğiniz için teşekkür ederiz. Grafiği neden düzlemsel olmaya zorlayacağınız konusunda biraz kafam karıştı. Sonuçta, sokak ağları düzlemsel grafikler değil (köprüler, tüneller).
underdark

Sadece Michaël, OpenJUMP için yazdığı mevcut grafik araçlarıyla hızlı bir test yaptığından ve şu anda düzlemsel olmayan grafikleri desteklemediklerinden. QGIS ve GRASS düzlemsel olmayan grafikleri destekleyen benzer araçlara sahipse ilk adımı atlayın.
user30184

Bunun doğru yaklaşım olduğunu düşünüyorum - ağı düzlemsel grafiklere ayırın. Her bir düzlemsel grafikte problem daha basittir - örneğin, yukarıdaki yaklaşımı kullanabilir veya basitçe kısa yol kenarlarının TIN'ini üçgenleştirip temizleyebiliriz. Ardından yol kenarlarını tekrar açın ve katmanları birleştirin.
AnserGIS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.