ST_intersect
zwraca kilka typów geometrii, w zależności od względnej topologii.
Na przykład uruchomienie ST_intersect
na dwóch sąsiednich wielokątach zwraca wspólną część wspólnej granicy.
Podczas gdy wyprowadza pojedynczą tabelę (jak można to zweryfikować na przykład w pgadmin), w próbce przeglądarki QGIS zostanie ona pokazana jako wiele tabel o różnych typach geometrii (na przykład:WIELOKĄT, WIELPOLI, LINIA i PUNKT), ale ( nieco mylące) o tej samej nazwie.
Wizualnie można je odróżnić, obserwując towarzyszące ikony po lewej stronie:
Możesz jednak wybrać typ geometrii, który chcesz, na przykład dodając filtr WHERE z 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;
lub, ze względu na wydajność, przepisz go w sposób podobny do:
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;
Drugie rozwiązanie tworzy anonimową tabelę tymczasową, która umożliwia ST_Intersection
uruchomić tylko raz.
Być może zauważyłeś, że sztuczka jest w ST_Dimension("clipped"."geom") = 2
.
ST_Dimensions
który filtruje wyjścia z ST_Intersection
tak, aby zachować tylko wielokąty (które mają wymiar topologiczny 2).