[FOSSGIS-Talk] PostGIS Multipart to Singlepart

Felix Kunde felix-kunde at gmx.de
Fr Jun 7 20:21:27 CEST 2019


Hi Claas,

Klingt nach einem guten Anwendungsfall für ST_ClusterIntersecting (https://postgis.net/docs/ST_ClusterIntersecting.html)
PostGIS erstellt dabei ein Array von GeometryCollections, wobei sich die berührenden Linien dann in einer GeometryCollections befinden.
Mit unnest entpacke ich das Array und wandle die Collections mit ST_CollectionHomogenize in MULTILINESTRINGS oder LINESTRINGS um.
Sollen es nur MULTILINESTRINGS sein, dann ST_CollectionExtract (https://postgis.net/docs/ST_CollectionExtract.html)

Ein Beispiel:

WITH trassen(id, geom, typ) AS (
  VALUES
  (1, 'LINESTRING(1 1,3 1)'::geometry, 'typA'),
  (2, 'LINESTRING(2 1,2 2)'::geometry, 'typA'),
  (3, 'LINESTRING(3 2,4 2)'::geometry, 'typA'),
  (4, 'LINESTRING(3 1,3 2)'::geometry, 'typB'),
  (5, 'LINESTRING(3 2,3 3)'::geometry, 'typB')
)
SELECT typ, ST_AsText(ST_CollectionHomogenize(unnest(ST_ClusterIntersecting(geom))))
  FROM trassen
GROUP BY typ;

Bei 800 Objekten sollte es, denke ich, noch keine Probleme mit der Arraygröße geben.
Ich glaube, ab PostGIS 3.0 soll es diese Aggregatfunktion(en) auch als Window Functions geben.
Das dürfte noch schneller funktionieren.

Hoffe das hilft dir weiter.

Viele Grüße und schönes WE
Felix


Gesendet: Freitag, 07. Juni 2019 um 11:45 Uhr
Von: "Claas Leiner" <claas.leiner at gkg-kassel.de>
An: Fossgis-talk-liste <Fossgis-talk-liste at fossgis.de>
Betreff: [FOSSGIS-Talk] PostGIS Multipart to Singlepart
Hallo Zusammen,

folgendes Problem bei einer PostGis-Abfrage sieht einfach aus, aber es
scheint nicht so einfach zu sein:

Ein Linienlayer mit ca. 800 Objekten soll nach einem Attribut "typ"
verschmolzen werden. Am Ende sollen jedoch nicht zusammenhängende
Linienteile des gleichen Typs als eigene Objekte erscheinen. Ziel ist
ein Singlepart-Layer, bei dem nur zusammenhängende Linienobjekte des
gleichen Typs verschmolzen sind.

Schritt 1:

-- Nach dem Attribut typ verschmelzen

create table trassen_zus as
select
st_Union(geometry)::geometry('Multilinestring',25832) as geometry,
typ
from trassen
group by typ
;

Jetzt habe ich für jeden Typ ein Multlinestring-Objekt. Es gibt so viele
Objekt wie Typen (8). Die Multi-Objekte verfügen jedoch über Teil-Linien
die im Gebiet verstreut sind. Jedes Teilobjekt, welches nicht mit einem
anderen zusamenhängt, soll nun ein einzelne Objekt werden. Also
Multipart zu Singelepart.

Schritt 2
Mit

create table trassen_zus_diff as
select
(ST_Dum(geometry)).geom::geometry('Linestring',25832) as geometry,
typ

from trassen
;

Bekomme ich jedoch die Ausgangsgeometrie zurück. Ich möchte aber für
jeden seperat liegenden Linienabschnitt mit identischem Typ eine
Singlepart-Geometrie bekommen.

Hat jemand mit dieser Problemstellung Erfahrungen und kann mir einen Tip
geben?

Viele Grüße,

Claas
--
....................................................................
OSGeo Park & OSGeo Day auf der AGIT 2019 in Salzburg
3.-5. Juli 2019, Universität Salzburg
https://agit.at

FOSSGIS Veranstaltungen 2019
https://www.fossgis.de/node/322[https://www.fossgis.de/node/322]

FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
GIS-Bereich und Freier Geodaten!
https://www.fossgis.de/[https://www.fossgis.de/] https://twitter.com/fossgis_eV

____________________________________________________________________
FOSSGIS-Talk-Liste mailing list
FOSSGIS-Talk-Liste at fossgis.de
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste[https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste]


Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste