sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué st_intersection devuelve no polígonos?

ST_intersect devuelve varios tipos de geometría, dependiendo de la topología relativa.

Por ejemplo, ejecutar ST_intersect en dos polígonos adyacentes devuelve la parte común del límite compartido.

Si bien genera una sola tabla (como puede verificar en pgadmin, por ejemplo), en la muestra del navegador de QGIS se mostrará como varias tablas de diferentes tipos de geometría (por ejemplo:POLYGON, MULTIPOLY, LINE y POINT) pero ( algo confuso) con el mismo nombre.

Visualmente, puede diferenciarlos observando los íconos que lo acompañan a la izquierda:

Sin embargo, puede seleccionar qué tipo de geometría desea, por ejemplo, agregando un filtro WHERE con 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;

o, por motivos de rendimiento, reescríbalo de forma similar a:

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;

La última solución crea una tabla temporal anónima, que permite ST_Intersection ejecutar solo una vez.

Es posible que hayas notado que el truco está en ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions que filtra las salidas de ST_Intersection para mantener solo los polígonos (que tienen una dimensión topológica de 2).