ST_intersect
връща няколко типа геометрия в зависимост от относителната топология.
Например стартиране на ST_intersect
на два съседни полигона връща общата част от споделената граница.
Въпреки че извежда една таблица (както можете да проверите в pgadmin, например), в образеца на браузъра на QGIS тя ще бъде показана като множество таблици с различни типове геометрия (например:МНОГОГОЛНИК, МНОГОПОЛИ, ЛИНИЯ и ТОЧКА), но ( донякъде объркващо) със същото име.
Визуално можете да ги различите, като наблюдавате придружаващите икони вляво:
Можете обаче да изберете кой тип геометрия искате, например като добавите филтър WHERE с 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;
или, за производителност, го пренапишете по начин, подобен на:
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;
Последното решение създава анонимна временна таблица, която позволява ST_Intersection
да се изпълнява само веднъж.
Може би сте забелязали, че трикът е в ST_Dimension("clipped"."geom") = 2
.
ST_Dimensions
който филтрира изходите от ST_Intersection
така че да запазите само полигони (които имат топологична размерност 2).