sql >> Databáze >  >> RDS >> PostgreSQL

Proč st_intersection vrací nepolygony?

ST_intersect vrátí několik typů geometrie v závislosti na relativní topologii.

Například spuštění ST_intersect na dvou sousedních polygonech vrátí společnou část sdílené hranice.

I když vytiskne jednu tabulku (jak si můžete ověřit například v pgadmin), ve vzorníku prohlížeče QGIS se zobrazí jako více tabulek různých typů geometrie (například:POLYGON, MULTIPOLY, LINE a POINT), ale ( poněkud matoucí) se stejným názvem.

Vizuálně je můžete rozlišit podle doprovodných ikon nalevo:

Můžete si však vybrat, jaký typ geometrie chcete, například přidáním filtru WHERE s 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;

nebo jej z důvodu výkonu přepište podobným způsobem jako:

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;

Posledně uvedené řešení vytváří anonymní dočasnou tabulku, která umožňuje ST_Intersection spustit pouze jednou.

Možná jste si všimli, že trik je v ST_Dimension("clipped"."geom") = 2 .

ST_Dimensions který filtruje výstupy z ST_Intersection tak, aby zůstaly pouze polygony (které mají topologický rozměr 2).




  1. Jak vrátit seznam spouštěcích událostí na serveru SQL Server

  2. Jak používat vloženou\smazanou tabulku v uložené proceduře?

  3. 4 způsoby, jak zobrazit seznam všech pohledů v databázi MariaDB

  4. PostgreSQL + Hibernate + Spring automaticky vytváří databázi