Topolojiyi Koruyan Bir Çizgi Ağı Nasıl Basitleştirilir?


9

Pgrouting için basitleştirmek zorunda olduğum yaklaşık 250.000 Segmentli (Avrupa ana yollarından oluşan) bir Shapefile'm var. Ama bunu düzgün yapmanın bir yolunu bulamıyorum.

Öyle görünüyor:

http://i.stack.imgur.com/qJ2OJ.png

ve işte böyle görünmeli:

http://i.stack.imgur.com/FN4Z6.png

Kalan noktalar arasındaki topolojik bağlantıları korurken, bir şekilde 3'ten daha az hatta bağlı olan (Kesişim değil) Çizgilerin her Noktasını bir şekilde kaldırmam gerekiyor. Birinin bir fikri varsa, çok takdir edilecektir!

Saygılarımla

DÜZENLEME: @dkastl fikrini uygulamaya çalıştım ve aşağıdaki kodla ağımdan yalnızca gereksiz düğümleri (yalnızca 2 bitişik linestringli düğümler) almayı başardım (ağ üretimi alt ağın blogundan alınmıştır http://underdark.wordpress.com / 2011/02/07 / a-yeni başlayanlar-sayfa-kılavuzlama / ):

SELECT * FROM
   (SELECT tmp.id as gid, node.the_geom FROM 
     (SELECT id, count(*) FROM network 
     JOIN node 
     ON (start_id = id OR end_id = id) AND (end_id = id OR start_id = id)
     GROUP BY id ORDER BY id) as tmp
   JOIN node ON (tmp.id = node.id)
   WHERE tmp.count = 2) as unn_node;

Yani, şimdi tek yapmam gereken çizgilerin birleşmesi. Ancak, nasıl bir fikrim yok. Yukarıdaki sorgu sonucunun her satır için bitişik satırları alır ve onları birleştiren bir döngü olması gerektiğini hayal ediyorum. Ardından ağı tamamen yeniden oluşturur ve yukarıdaki sorgu boş bir sonuç döndürene kadar işlemi tekrarlar.


1
Neden pgRouting için bunu yapmak zorundasınız? Önceden atanmış bir kaynak / hedef kimliğiniz varsa, yalnızca dizeleri kaynak ve hedef kimliğini içeren yeni bir geometri oluşturabilirsiniz. Bu ikinci görüntünüze benzemelidir.
dkastl

Sorun, satırların bölümlere ayrılmasıdır (yayınladığım ilk görüntüye bakarsanız, gördüğünüz her nokta yeni bir segment başlar / biter), yaklaşımınız topolojiyi değil (geometriyi) basitleştirir (iyi).
chriserik

1
Her noktanın yeni bir çizgi geometrisi başlattığı imajınızdan belli değil. Kaynak / hedef sütunları doldurmak için pgRouting'in assign_vertex_id işlevini zaten çalıştırdınız mı? Bu durumda daha sonra yalnızca iki kez var olan kaynak / hedef kimliklerini tanımlamak için bazı sorgular yapabilirsiniz; bu, bu noktada iki çizgi parçasını birleştirebilmeniz gerektiği anlamına gelir. Kaynak / hedef kimliğinin iki kattan fazla olması durumunda bir kesişme noktası olması gerekir.
dkastl

@dkastl: Çok iyi bir fikir! Ne kadar ilerlediğimi gösteren sorumu güncelledim.
chriserik

Yanıtlar:


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.