Rozpuścić czy nieoświetlone linie wspólnych atrybutów w PostGIS lub GRASS?

9

Mam plik kształtu linii środkowej drogi, który dzieli drogi na każdym skrzyżowaniu. Chciałbym jednak dołączyć LINESTRING, które mają wspólny zestaw atrybutów, w jeden LINESTRING. Tak długo, jak nazwa, ograniczenie prędkości itp. Się nie zmienią, chcę je połączyć. Ma to na celu ostateczne połączenie z OpenStreetMap.

Oprogramowanie ArcGIS dla komputerów stacjonarnych Esri wydaje się na to pozwalać za pomocą polecenia Dissolve i opcji UNSPLIT_LINES.

Znalazłem również polecenie Rozpuszczanie w QGIS, ale wydaje się, że działa tylko na wielokątach i pojedynczych polach.

Zakładając, że nic nie istnieje w QGIS, czy ktoś wie, jak to zrobić w PostGIS lub GRASS?

joshdoe
źródło
W przypadku PostGIS sprawdź gis.stackexchange.com/questions/1387/…
podmrok
Gdyby dziś zadano to pytanie, myślę, że zostałoby ono zamknięte jako zbyt szerokie. Zamiast próbować go teraz zamknąć, zamierzam go edytować, aby doposażyć istniejące odpowiedzi i zapobiec szerszym odpowiedziom.
PolyGeo

Odpowiedzi:

4

Interesujące pytanie. Nie uważam się za guru PostGIS, ale zastanawiałem się nad twoim problemem i wymyśliłem następujące zapytanie, które rozpuszcza LINESTRINGrekordy autostrady w MULTILINESTRINGrekordy, gdy mają one wspólne wartości w wielu polach (w moim zestawie danych dopasowałem pola namei state). Użyłem OGR do wypchnięcia pliku kształtu autostrady (przemianowanego na ushwys) do PostGREsql; więc moje pole geometrii nazywa się wkb_geometry. Spróbuj zhakować to zapytanie, aby dostosować dane i warunki terenowe:

SELECT 
u.name, 
u.state, 
ST_AsText( ST_Multi( ST_Collect( u.wkb_geometry ) ) ) as multilines 
FROM ushwys u
GROUP BY u.name, u.state 
ORDER BY u.state 
LIMIT 100; --########### DROP THE LIMIT WHEN YOU'RE DONE EXPERIMENTING

Jeśli to zadziała, możesz użyć ogr2ogr do wykonania tego zapytania i wyeksportować wyniki w dowolnym preferowanym formacie wektorowym, takim jak plik kształtu, GML, CSV lub inny. Aby uzyskać informacje na temat wywoływania zapytań SQL z ogr2ogr, zapoznaj się z dokumentacją OGR SQL .

Jako odniesienie zapoznałem się z instrukcją PostGIS ST_Collect , a także z tą witryną, która pokazuje grupowanie na wielu polach.

Jeśli zauważysz, że redakcje tego zapytania nie działają, daj mi znać, a ja znajdę odpowiedź, aby nie pozostała w tyle i nie dezorientowała ludzi.


PS Jeśli nie znasz się na używaniu ogr2ogr do wypychania geodanych do PostGIS, użyłem następującego skryptu ogr2ogr, aby wykonać import danych ( strzeż się kopiowania z Internetu i wklejania bezpośrednio do okna poleceń ogr2ogr, ponieważ znalazłem formatowanie strony wprowadza podział wierszy i podstawianie czcionek / znaków dla podwójnych cudzysłowów, które łamią skrypt ogr ):

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=postgres dbname=gisdb password=my_password" 
"E:\GISData\UnitedStates\highways.shp" -nln ushwys -nlt geometry

[Aktualizacja]

Chciałem zobaczyć, jak to „wyglądało” w QGIS po uruchomieniu tego zapytania, więc zmodyfikowałem zapytanie, aby zastosować tę WHEREklauzulę (która daje mi wszystkie warianty US Highway 65 w stanie Missouri):

where u.state = 'MO' and u.name LIKE '%US%65%'

Następnie użyłem QGIS i wtyczki QuickWKT do wizualizacji wszystkich ośmiu (8) moich wynikowych MULTILINESTRINGrekordów autostrad . Jak widać na zrzucie ekranu, końcowe wyniki zabierają Hwy 65 z północnej granicy Missoui z Iowa aż do jej południowej granicy z Arkansas:

wprowadź opis zdjęcia tutaj

Dla mnie ta wizualizacja pokazuje, że moje zapytanie nie spowodowało nieoczekiwanego powielenia lub wyeliminowania funkcji. Następnie zastanawiałem się: „ok, rozpuszczenie zwróciło osiem elementów, ale ile elementów w oryginalnej tabeli faktycznie reprezentuje Hwy 65 w Missouri?” Moje następne zapytanie odpowiedziało na to pytanie. Wygląda na to, że oryginalny zestaw danych używa trzydziestu ośmiu (38) funkcji do reprezentowania Hwy 65 w Missouri:

SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38

W końcowej analizie zapytanie zredukowało trzydzieści osiem (38) elementów do ośmiu (8) elementów, które dzielą wartości w polach nazwy i stanu. W tym momencie jestem stosunkowo pewien, że to zapytanie jest przydatne i odpowiednie do rozpuszczania geometrii jednoczęściowych w geometrie wieloczęściowe, gdy zadanie rozpuszczania musi uwzględniać wiele pól.

Twoje zdrowie. :)

elrobis
źródło
1

W GRASS GIS spójrz na v.build.polilines

v.build.polilines można wykorzystać do odbudowania uszkodzonych polilinii

markusN
źródło