QGIS: ST_Intersection ohne Linien bzw. Punkte als Ausgabegeometrien

Hallo,

ich benötige die Schnittmenge zweier Polygongeometrien (poly1 und poly2) und habe dazu nachfolgende Abfrage erstellt.

CREATE TABLE tmp.poly3 AS
SELECT
ST_Intersection(poly1.geom, poly2.geom)::geometry(polygon,SRID_hier_angeben) AS geom
FROM tmp.poly1, tmp.poly2
WHERE ST_IsEmpty(ST_Intersection(poly1.geom, poly2.geom))=FALSE;

Leider funktioniert meine Ausgabe nicht wenn sich meine Polygongeometrien entlang von Kanten oder an Punkten berühren. Ich bin ohnehin nur an Schnittflächen interessiert. Für das Bild im Anhang soll meine Tabelle also drei Einträge beinhalten. Ebenfalls benötige ich für QGIS eine eindeutige ID (gid) pro Eintrag. Kann mir jemand mit meiner Abfrage helfen?

Vielen Dank und schöne Grüße!
st_intersection.jpg

Die ID kannst du z.B. mit ‘rownumber() over () as id’ erzeugen. Oder du generierst etwas, das du aus den EingangsIDs berechnest. So könntest du z.B. im Ergebnis erkennen, welche Ausgangsgeometrien verwendet wurden.

Gruß Uwe

Vielen Dank für die superschnelle Hilfe. Die nachfolgende Abfrage vergibt für jede Verschneidungsgeometrie eine eindeutige ID. Leider funktioniert sie nur wenn sich meine Flächen überlappen aber nicht berühren. Mein Problem besteht aber darin, dass sich viele meiner Flächen entlang von Kanten berühren und ich als Ergebnis nur Poylgone benötige :confused:

CREATE TABLE tmp.poly3 AS
SELECT
row_number() over () as gid,
ST_Intersection(poly1.geom, poly2.geom)::geometry(polygon,SRID_hier_angeben) AS geom
FROM tmp.poly1, tmp.poly2
WHERE ST_IsEmpty(ST_Intersection(poly1.geom, poly2.geom))=FALSE;

Überlappen ist ein gutes Stichwort, sieh dir ST_Overlaps an.

Danke, ich habe mein Problem nun anscheinend gelöst!

CREATE TABLE tmp.poly3 AS
SELECT
row_number() over () as gid,
ST_Intersection(poly1.geom, poly2.geom)::geometry(polygon,SRID_hier_angeben) AS geom
FROM tmp.poly1, tmp.poly2
WHERE ST_Overlaps(poly1.geom, poly2.geom) = 't' OR ST_Contains(poly2.geom, poly1.geom) = 't';

Ist das ST_CONTAINS nötig? Vom Empfinden sollte das Ergebnis eine Untermenge von ST_OVERLAPS sein.

Gruß Uwe

Hallo Uwe,

ja ST_Contains ist nötig, da ST_Overlaps keine Geometrien erfasst, die zur Gänze von einer anderen Geometrie umgeben sind. Ich habe die oben gepostete Abfrage mittlerweile auf mein Projekt (beinhaltet einige hundert Geometrien) übertragen, aber leider funktioniert sie nicht. Es werden auch einige Multipolygone ausgegeben. Ich vermute es handelt sich dabei um Geometrieungenauigkeiten bzw. -fehler (?) an manchen Polygonkanten. Ich habe meine Abfrage daher adaptiert:

CREATE TABLE tmp.poly3 AS
SELECT
row_number() over () as gid,
(ST_Dump(ST_Intersection(poly1.geom, poly2.geom))).geom::geometry(polygon,SRID_hier_angeben) AS geom
FROM tmp.poly1, tmp.poly2
WHERE ST_Overlaps(poly1.geom, poly2.geom) = 't' OR ST_Contains(poly2.geom, poly1.geom) = 't';

Nun kämpfe ich aber mit dem Problem, das meine IDs (gid) zum teil mehrfach vorkommen (geteilte Multipolygone?) und daher nicht eindeutlig sind :angry:

Danke für die Info zu ST_OVERLAPS, hatte das anders in Erinnerung.
Eigentlich kann das mit row_number nicht passieren, da das einfach nur die Zeilen im jeweiligen Window numeriert und damit dort eindeutig sein sollte. Hilft dir dabei ein DISTINCT?

Gruß Uwe

Wenn ich meine Abfrage ohne Geometrietyp und KBS ausführe, sind die IDs (Spalte gid) noch korrekt. Allerdings sagt QGIS dann “Kein Eintrag in geometry_columns!”. Wie auf den hochgeladenen Bildern zu sehen bestehen meine Geometrien aus Polygonen und Multipolygonen (etwa gid 22 und gid 24), wobei es sich bei den Multipolygonen wohl um Verschneidungsungenauigkeiten handelt.
01.jpg
02.jpg
03.jpg

Unter der Verwendung von “ST_Dump” kann ich zwar den Geometrietyp (Polygon) und ein KBS angeben, aber meine IDs sind nun nicht mehr eindeutlig. Alle Polygone, welche zuvor Multipolygone waren, übernehmen die ID der ursprünglichen Multipolygone (siehe gid 22 und 24).
04.jpg

So, mithilfe einer Unterabfrage sind die IDs nun eindeutig. Was haltet ihr davon?

CREATE TABLE tmp.poly3 AS
SELECT
row_number() over() AS gid,
g.geom::geometry(polygon, SRID_hier_angeben) AS geom
FROM
(SELECT
(ST_Dump(ST_Intersection(poly1.geom, poly2.geom))).geom
FROM
tmp.poly1, tmp.poly2
WHERE
ST_Overlaps(poly1.geom, poly2.geom) = 't' OR ST_Contains(poly1.geom, poly2.geom) = 't' OR ST_Contains(poly1.geom, poly2.geom) = 't')
AS g;

ST_Dump liefert dir 2 Angaben: 1. Die Position der Geometrie innerhalb der Multigeometrie (.path) und 2. die Geometrie (.geom). Daraus kannst du dir wieder eine eindeutige ID basteln :wink:

Gruß uwe

Danke Uwe, würde ich mir dadurch meine Unterabfrage ersparen?

Vermutlich wäre die dann obsolet da du ja da nur eine Geomtrieliste erzeugst und die dann in der Hauptabfrage durchnummerierst. IMHO wäre die aber auch so nicht notwendig wenn ich mir das SQL genauer ansehe.

Gruß Uwe

Das Problem ist, dass die Einträge der “gid” Spalte ohne Unterabfrage für die “gedumpten” Multipolygone mehrfach vergeben werden (siehe Posting #07). Wäre es unangebracht nach einem Codeschnipsel zu fragen?

Vielen Dank!