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 LINESTRING
rekordy autostrady w MULTILINESTRING
rekordy, gdy mają one wspólne wartości w wielu polach (w moim zestawie danych dopasowałem pola name
i 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ę WHERE
klauzulę (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 MULTILINESTRING
rekordó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:
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. :)