PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché st_intersection restituisce non poligoni?

ST_intersect restituisce diversi tipi di geometria, a seconda della relativa topologia.

Ad esempio, eseguendo ST_intersect su due poligoni adiacenti restituisce la parte comune del confine condiviso.

Mentre crea una singola tabella (come puoi verificare in pgadmin, ad esempio), nel campione del browser di QGIS verrà mostrato come più tabelle di diversi tipi di geometria (ad esempio:POLYGON, MULTIPOLY, LINE e POINT) ma ( un po' confusamente) con lo stesso nome.

Visivamente, puoi distinguerli osservando le icone di accompagnamento sulla sinistra:

Puoi comunque selezionare quale tipo di geometria desideri, ad esempio aggiungendo 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;

oppure, per motivi di prestazioni, riscrivilo in modo simile 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;

Quest'ultima soluzione crea una tabella temporanea anonima, che consente ST_Intersection da eseguire solo una volta.

Potresti aver notato che il trucco è in ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions che filtra gli output da ST_Intersection in modo da mantenere solo i poligoni (che hanno dimensione topologica 2).