PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum gibt st_intersection Nicht-Polygone zurück?

ST_intersect gibt abhängig von der relativen Topologie mehrere Geometrietypen zurück.

Beispiel:Ausführen von ST_intersect auf zwei benachbarten Polygonen gibt den gemeinsamen Teil der gemeinsamen Grenze zurück.

Während es eine einzelne Tabelle ausgibt (wie Sie zum Beispiel in pgadmin überprüfen können), wird es im Browsermuster von QGIS als mehrere Tabellen mit verschiedenen Geometrietypen angezeigt (zum Beispiel:POLYGON, MULTIPOLY, LINE und POINT), aber ( etwas verwirrend) mit demselben Namen.

Visuell können Sie sie unterscheiden, indem Sie die begleitenden Symbole auf der linken Seite beobachten:

Sie können jedoch den gewünschten Geometrietyp auswählen, indem Sie beispielsweise einen WHERE-Filter mit ST_Dimension hinzufügen :

SELECT      a.*,
            b.*,
            st_intersection(a.geom, b.geom) as geom
FROM        a,b
WHERE       st_intersects(a.geom, b.geom) 
            AND ST_Dimension(st_intersects(a.geom, b.geom)) = 2;

oder schreiben Sie es aus Gründen der Leistung ähnlich wie folgt um:

SELECT clipped.* 
FROM (
         SELECT a.id, b."fieldName",
             (ST_Dump(ST_Intersection(a.geom, b.geom))).geom AS geom
         FROM "public"."table_A_name" AS a INNER JOIN "public"."table_B_name" AS b   
         ON ST_Intersects(a.geom, b.geom)
     ) AS clipped
WHERE ST_Dimension("clipped"."geom") = 2;

Die letztere Lösung erstellt eine anonyme temporäre Tabelle, die ST_Intersection zulässt nur einmal auszuführen.

Sie haben vielleicht bemerkt, dass der Trick in ST_Dimension("clipped"."geom") = 2 liegt .

ST_Dimensionen der die Ausgaben von ST_Intersection filtert um nur Polygone zu behalten (die eine topologische Dimension von 2 haben).