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.