Jak uprościć topologię zachowującą sieć liniową?

9

Mam Shapefile (składający się z głównych europejskich dróg) z około 250 000 segmentów, które muszę uprościć w celu opracowania. Ale nie mogę znaleźć sposobu, aby zrobić to właściwie.

Tak to wygląda:

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

i tak powinno to wyglądać:

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

W jakiś sposób muszę usunąć każdy punkt linii, który jest połączony z mniej niż 3 liniami (nie będącymi przecięciem), zachowując jednocześnie topologiczne połączenia między pozostałymi punktami. Jeśli ktoś ma pomysł, byłby bardzo wdzięczny!

Z poważaniem

EDYCJA: Próbowałem wdrożyć ideę @dkastl i udało mi się uzyskać tylko niepotrzebne węzły (węzły z tylko 2 sąsiadującymi liniami) z mojej sieci za pomocą poniższego kodu (generacja sieci pochodzi z bloga podmroku http://underdark.wordpress.com / 2011/02/07 / a-beginners-guide-to-pgrouting / ):

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;

Teraz muszę tylko połączyć linie. Nie mam jednak pojęcia, jak to zrobić. Wyobrażam sobie, że musi to być pętla, która dla każdego wiersza wyniku powyższego zapytania pobiera sąsiednie linie i łączy je. Następnie całkowicie przebuduje sieć i powtórzy proces, aż powyższe zapytanie zwróci pusty wynik.

chriserik
źródło
1
Dlaczego musisz to zrobić dla pgRouting? Jeśli masz już przypisany identyfikator źródła / celu, możesz utworzyć nową geometrię z liniami zawierającymi tylko identyfikator źródła i celu. To powinno wyglądać jak twój drugi obraz.
dkastl
Problem polega na tym, że linie są segmentowane (jeśli spojrzysz na pierwszy obraz, który opublikowałem, każdy punkt, który widzisz, zaczyna / kończy nowy segment), twoje podejście upraszcza geometrię (co jest dobre), ale nie topologię.
chriserik
1
Nie sądzę, że z twojego obrazu wynika, że ​​każdy punkt rozpoczyna nową geometrię linii. Czy uruchomiłeś już funkcję assign_vertex_id w pgRouting, aby wypełnić kolumny źródłowe / docelowe? W takim przypadku możesz później wykonać kilka zapytań w celu zidentyfikowania identyfikatora źródłowego / docelowego, które istnieją tylko dwa razy, co oznacza, że ​​w tym momencie powinieneś być w stanie scalić dwa segmenty linii. W przypadku, gdy identyfikator źródłowy / docelowy istnieje więcej niż dwa razy, musi to być skrzyżowanie.
dkastl
@dkastl: Bardzo dobry pomysł! Zaktualizowałem moje pytanie, pokazując, jak daleko do niego doszedłem.
chriserik,

Odpowiedzi: