PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que st_intersection retorna não polígonos?


ST_intersect retorna vários tipos de geometria, dependendo da topologia relativa.

Por exemplo, executando ST_intersect em dois polígonos adjacentes retorna a parte comum do limite compartilhado.

Enquanto ele produz uma única tabela (como você pode verificar no pgadmin, por exemplo), na amostra do navegador do QGIS ele será mostrado como várias tabelas de diferentes tipos de geometria (por exemplo:POLYGON, MULTIPOLY, LINE e POINT), mas ( um tanto confuso) com o mesmo nome.

Visualmente, você pode diferenciá-los observando os ícones de acompanhamento à esquerda:



No entanto, você pode selecionar o tipo de geometria que deseja, por exemplo, adicionando um filtro WHERE com 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, por uma questão de desempenho, reescreva-o de maneira semelhante 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;

A última solução cria uma tabela temporária anônima, que permite ST_Intersection para correr apenas uma vez.

Você deve ter notado que o truque está em ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions que filtra as saídas de ST_Intersection de modo a manter apenas polígonos (que têm uma dimensão topológica de 2).