필지 (폴리곤) 레이어에서 인접성 테스트를 수행하고 특정 기준 (크기 일 수 있음)에 맞으면 병합합니다. 아래 그림에 따라 다각형 1, 2, 3 및 4는 병합하지만 5는 병합 하지 않습니다 .
두 가지 문제가 있습니다.
ST_TOUCHES
모서리 만 터치하고 선 세그먼트가 아닌 경우 TRUE를 반환합니다. 공유 선 세그먼트를 확인하려면 ST_RELATE가 필요하다고 생각합니다.- 이상적으로는 인접한 모든 다각형을 하나로 병합하고 싶지만 한 라운드에서 1,2,3 및 4를 병합하는 것과 같이 2 이상으로 확장하는 방법을 잘 모릅니다.
내가 가진 구조는에 대한 자체 조인을 기반으로합니다 ST_TOUCHES
.
장난감 데이터
CREATE TABLE testpoly AS
SELECT
1 AS id, ST_PolyFromText('POLYGON ((0 0, 10 0, 10 20, 00 20, 0 0 ))') AS geom UNION SELECT
2 AS id, ST_PolyFromText('POLYGON ((10 0, 20 0, 20 20, 10 20, 10 0 ))') AS geom UNION SELECT
3 AS id, ST_PolyFromText('POLYGON ((10 -20, 20 -20, 20 0, 10 0, 10 -20 ))') AS geom UNION SELECT
4 AS id, ST_PolyFromText('POLYGON ((20 -20, 30 -20, 30 0, 20 0, 20 -20 ))') AS geom UNION SELECT
5 AS id, ST_PolyFromText('POLYGON ((30 0, 40 0, 40 20, 30 20, 30 0 ))') AS geom ;
선택
SELECT
gid, adj_gid,
st_AStext(st_union(l2.g1,l2.g2)) AS geo_combo
from (
--level 2
SELECT
t1.id AS gid,
t1.geom AS g1,
t2.id AS adj_gid,
t2.geom AS g2
from
testpoly t1,
testpoly t2
where
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
)
l2
출력은 다음과 같습니다.
+-----+---------+-------------------------------------------------------------------------------+
| gid | adj_gid | geo_combo |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 2 | POLYGON((10 0,0 0,0 20,10 20,20 20,20 0,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 1 | 3 | MULTIPOLYGON(((10 0,0 0,0 20,10 20,10 0)),((10 0,20 0,20 -20,10 -20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 1 | POLYGON((10 20,20 20,20 0,10 0,0 0,0 20,10 20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 3 | POLYGON((10 0,10 20,20 20,20 0,20 -20,10 -20,10 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 2 | 4 | MULTIPOLYGON(((20 0,10 0,10 20,20 20,20 0)),((20 0,30 0,30 -20,20 -20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 1 | MULTIPOLYGON(((10 0,20 0,20 -20,10 -20,10 0)),((10 0,0 0,0 20,10 20,10 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 2 | POLYGON((20 0,20 -20,10 -20,10 0,10 20,20 20,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 3 | 4 | POLYGON((20 -20,10 -20,10 0,20 0,30 0,30 -20,20 -20)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 2 | MULTIPOLYGON(((20 0,30 0,30 -20,20 -20,20 0)),((20 0,10 0,10 20,20 20,20 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 3 | POLYGON((20 0,30 0,30 -20,20 -20,10 -20,10 0,20 0)) |
+-----+---------+-------------------------------------------------------------------------------+
| 4 | 5 | MULTIPOLYGON(((30 0,30 -20,20 -20,20 0,30 0)),((30 0,30 20,40 20,40 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
| 5 | 4 | MULTIPOLYGON(((30 0,30 20,40 20,40 0,30 0)),((30 0,30 -20,20 -20,20 0,30 0))) |
+-----+---------+-------------------------------------------------------------------------------+
다각형 id = 3은 id = 1과 점을 공유하므로 긍정적 인 결과로 반환됩니다. WHERE 절을로 변경하면 ST_Touches( t1.geom, t2.geom ) AND t1.geom && t2.geom AND ST_Relate(t1.geom, t2.geom ,'T*T***T**');
레코드가 전혀 없습니다.
그래서 첫째 , 어떻게 선분을 공유해야합니다에만 소포를 고려하기 위해 ST_Relate를 지정 않습니다.
그런 다음 다각형 1,2,3,4를 한 라운드에 병합하여 위의 호출 결과를 접는 방법은 무엇입니까?
최신 정보
이것을 where
절에 추가하면 분명히 다중 다각형이 아닌 다각형 만 가져옵니다. 따라서 내 목적을 위해 잘못된 긍정을 제거합니다. 코너 터치는 무시됩니다.
GeometryType(st_union(t1.geom,t2.geom)) != 'MULTIPOLYGON'
이것이 이상적이지는 않지만 ( ST_RELATE
보다 일반적인 솔루션으로 토폴로지 검사를 사용하고 싶습니다 ) 앞으로 나아갈 방법입니다. 그런 다음 이러한 중복 제거 및 노조 문제가 남아 있습니다. 아마도 폴리곤 터치에 대해서만 시퀀스를 생성 할 수 있다면,이를 통합 할 수 있습니다.
업데이트 II
이것은 다각형 공유 선을 선택하는 데 효과적이지만 (모퉁이는 제외) 위의 MULTIPOLYGON
테스트 보다 더 일반적인 솔루션 입니다. 내 where 절은 이제 다음과 같습니다.
WHERE
ST_Touches( t1.geom, t2.geom )
AND t1.geom && t2.geom
-- 'overlap' relation
AND ST_Relate(t1.geom, t2.geom)='FF2F11212') t2
이제 남아있는 것은 여전히 한 쌍의 다각형 이상에 대해 병합을 수행하는 방법이지만, 기준에 맞는 임의의 숫자에 대해서는 한 번에.
ST_IntersectionArray
ST_Union [1]과 함께 작동 하도록 [function] [1]을 수정할 수 있습니다 . gis.stackexchange.com/a/60295/36886