[FOSSGIS-Talk] PostGIS Multipart to Singlepart

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[FOSSGIS-Talk] PostGIS Multipart to Singlepart

Claas Leiner-2
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

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

____________________________________________________________________
FOSSGIS-Talk-Liste mailing list
[hidden email]
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
Reply | Threaded
Open this post in threaded view
|

Re: [FOSSGIS-Talk] PostGIS Multipart to Singlepart

Felix Kunde
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" <[hidden email]>
An: Fossgis-talk-liste <[hidden email]>
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
[hidden email]
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste[https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste]
--
....................................................................
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

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

____________________________________________________________________
FOSSGIS-Talk-Liste mailing list
[hidden email]
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
Reply | Threaded
Open this post in threaded view
|

Re: [FOSSGIS-Talk] PostGIS Multipart to Singlepart

Claas Leiner-2
Vielen Dank!

Das ist es!


Am 07.06.19 um 20:21 schrieb Felix Kunde:

> 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" <[hidden email]>
> An: Fossgis-talk-liste <[hidden email]>
> 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
> [hidden email]
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste[https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste]
>


--
-----------------------------------------
GKG-Kassel - Dr.-Ing. Claas Leiner
QGIS-Support und mehr

Geodatenservice, Kartenwerkstatt &
GIS-Schule Kassel

Wilhelmshöher Allee 304 E
34131 Kassel
Tel. 0561/56013445
[hidden email]
----------------------------------------
http://www.gkg-kassel.de
----------------------------------------
Unterstützen Sie QGIS
QGIS-DE e.V. | http://qgis.de
QGIS Projekt | http://qgis.org/de/site/
--
....................................................................
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

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

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