sql >> Database >  >> RDS >> PostgreSQL

Waarom retourneert st_intersection niet-polygonen?

ST_intersect geeft verschillende typen geometrie terug, afhankelijk van de relatieve topologie.

Bijvoorbeeld:ST_intersect . uitvoeren op twee aangrenzende polygonen geeft het gemeenschappelijke deel van de gedeelde grens terug.

Terwijl het een enkele tabel uitgeeft (zoals u kunt verifiëren in pgadmin, bijvoorbeeld), zal het in het Browser-staal van QGIS worden weergegeven als meerdere tabellen van verschillende typen geometrie (bijvoorbeeld:POLYGON, MULTIPOLY, LINE en POINT) maar ( enigszins verwarrend) met dezelfde naam.

Visueel kun je ze van elkaar onderscheiden door de bijbehorende pictogrammen aan de linkerkant te observeren:

U kunt echter wel selecteren welk type geometrie u wilt, bijvoorbeeld door een WHERE-filter toe te voegen met 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;

of, omwille van de prestaties, herschrijf het op een manier die vergelijkbaar is met:

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;

De laatste oplossing creëert een anonieme tijdelijke tabel, waarmee ST_Intersection om slechts één keer uit te voeren.

Het is je misschien opgevallen dat de truc in ST_Dimension("clipped"."geom") = 2 zit .

ST_Dimensions die de uitvoer filtert van ST_Intersection om alleen polygonen te behouden (die een topologische dimensie van 2) hebben.




  1. Java uitgevoerd door MySQL-trigger

  2. Mysql2 gem installeren op Mac os x Lion

  3. Tijdzone instellen in PHP en MySQL

  4. Waarschuwing:mysql_fetch_array():opgegeven argument is geen geldige MySQL-resultaatbron