PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi st_intersection renvoie-t-il des non-polygones ?

ST_intersect renvoie plusieurs types de géométrie, en fonction de la topologie relative.

Par exemple, en exécutant ST_intersect sur deux polygones adjacents renvoie la partie commune de la limite partagée.

Bien qu'il produise une seule table (comme vous pouvez le vérifier dans pgadmin, par exemple), dans l'échantillon du navigateur de QGIS, il sera affiché sous la forme de plusieurs tables de différents types de géométrie (par exemple :POLYGON, MULTIPOLY, LINE et POINT) mais ( quelque peu déroutant) avec le même nom.

Visuellement, vous pouvez les différencier en observant les icônes d'accompagnement sur la gauche :

Vous pouvez cependant sélectionner le type de géométrie que vous souhaitez, par exemple en ajoutant un filtre WHERE avec ST_Dimension :

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;

ou, pour des raisons de performance, réécrivez-le d'une manière similaire à :

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;

Cette dernière solution crée une table temporaire anonyme, qui permet à ST_Intersection à exécuter une seule fois.

Vous avez peut-être remarqué que l'astuce est dans ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions qui filtre les sorties de ST_Intersection afin de ne conserver que les polygones (qui ont une dimension topologique de 2).