다 지점 입력 기능에서 용해 된 버퍼를 작성했습니다. 아래 예에서 입력 테이블에는 4 가지 기능이 있습니다. 기능 #2
은 두 가지 점으로 구성됩니다. 버퍼를 생성 한 후 4 개의 폴리곤 지오메트리를 얻습니다.
결과를 그룹화하는 방법이 있습니까? 포인트의 버퍼 #1
및 #2
용해 번의 다중 다각형 기능이어야 ( a
).
내가 지금까지 한 일 :
-- collect all buffers to a single multi-polygon feature
-- dissolve overlapping polygon geometries
CREATE TABLE public.pg_multibuffer AS SELECT
row_number() over() AS gid,
sub_qry.*
FROM (SELECT
ST_Union(ST_Buffer(geom, 1000, 8))::geometry(MultiPolygon, /*SRID*/) AS geom
FROM
public.multipoints)
AS sub_qry;
편집하다:
-- create sample geometries
CREATE TABLE public.multipoints (
gid serial NOT NULL,
geom geometry(MultiPoint, 31256),
CONSTRAINT multipoints_pkey PRIMARY KEY (gid)
);
CREATE INDEX sidx_multipoints_geom
ON public.multipoints
USING gist
(geom);
INSERT INTO public.multipoints (gid, geom) VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256));
답변
첫 번째 두 공간이 교차하는 OP의 이미지의 점을 모방하기 위해 임의의 임의의 점으로 시작하여 두 번째와 세 번째는 동일한 속성 ID (2)를 가지며 공간적으로 교차하지도 않는 두 개의 다른 점을 갖습니다. 동일한 속성으로 다음 쿼리는 3 개의 클러스터를 생성합니다.
WITH
temp (id, geom) AS
(VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
(2, ST_Buffer(ST_MakePoint(-0.7,0.5), 2)),
(2, ST_Buffer(ST_MakePoint(10, 10), 2)),
(3, ST_Buffer(ST_MakePoint(-2, 12), 2)),
(4, ST_Buffer(ST_MakePoint(5, -6), 2))),
unions(geoms) AS
(SELECT ST_Union(geom) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
여기 몇 단계가 있습니다 :
- 사용
ST_Union
속성에 의해 첫 번째 그룹에, id로 그룹화, ST_ClusterIntersecting
공간적으로 교차하는 동일한 그룹의 것을 결합하는 데 사용- 각 클러스터 (테이블 멀티)에 id를 추가하십시오-ClusterIntersecting에서 직접 수행하면 모든 지오메트리가 id가 1이됩니다.
- 2 단계에서 덤프 된 지오메트리를 결합하고 3 단계의 ID를 기준으로 그룹화하십시오 . 이것은 디졸브 파트입니다. 이로 인해 클러스터 A에서 2 개의 겹치는 다각형이 2 단계가 끝날 때 겹치지 않고 함께 결합됩니다.
오히려 길지만 작동합니다 (더 짧은 방법이 있다고 확신합니다).
QGIS에서 WKT 도구를 사용하고 편집 도구를 사용하여 얼마나 끔찍한지를 발견하면 다음과 같은 클러스터가 생성됩니다. 여기서 레이블이 a 인 클러스터는 모두 한 가지 색상으로 함께 표시됩니다.
최종 ST_UNION (d.geom)에 ST_AsText를 넣으면 결과를 직접 볼 수 있습니다.
주석에서 더 많은 정보를 다음과 같이 편집하십시오. 포인트로 시작할 때 다이어그램을 모방하기 위해 처음에 임시 CTE에 넣은 원래 솔루션에 버퍼를 통합해야합니다. Union CTE에 버퍼를 추가하는 것이 더 쉬울 수 있으므로 모든 형상을 한 번에 수행 할 수 있습니다. 예를 들어, 버퍼 거리 1000을 사용하면 다음과 같이 이제 예상대로 3 개의 클러스터가 반환됩니다.
WITH temp(id, geom) AS
(VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256))
),
unions(geoms) AS
(SELECT st_buffer(ST_Union(geom), 1000) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT id, ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
답변
이 작업을 수행하는 한 가지 방법은 ST_Union
모든 버퍼를 함께 연결 ST_Dump
하여 결과 다각형의 구성 요소를 가져 ST_Intersects
오고 입력 지점 으로 다시 결합하여 각 클러스터를 구성하는 지점 수 / 점을 확인하는 것입니다.
호출 하기 전에 포인트를 그룹화하여 조인을 요구하지 않고이 작업을 수행 할 수 있습니다 ST_Buffer
. 두 지점이 동일한 용해 된 버퍼 내에 위치하려면 거리보다 작은 거리 사이의 홉으로 도달 할 수 있어야합니다 eps
. 이는 최소 연계 클러스터링 문제 일 뿐이며 다음을 사용하여 해결할 수 있습니다 ST_ClusterDBSCAN
.
SELECT
cluster_id,
ST_Union(ST_Buffer(geom, 1000)) AS geom,
count(*) AS num_points,
array_agg(point_id) AS point_ids
FROM (
SELECT
point_id,
ST_ClusterDBSCAN(geom, eps := 2000, minpoints := 1) OVER() AS cluster_id ,
geom
FROM points) sq
GROUP BY cluster_id;
PostGIS 버퍼가 완벽한 원이 아니고 1000m 떨어진 두 지점이 두 개의 500m 버퍼로 연결되어 있지 않을 수 있기 때문에 이것은 버퍼 우선 방법과 정확히 동일한 결과를 생성하지 않습니다.
답변
이 답변 에 따르면 하위 쿼리 내에서 ST_DUMP를 수행하려고합니다.
이 같은:
-- collect all buffers to a single multi-polygon feature
-- dissolve overlapping polygon geometries
CREATE TABLE public.pg_multibuffer AS SELECT
row_number() over() AS gid,
sub_qry.*
FROM (SELECT
ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8))::geometry(MultiPolygon, /*SRID*/)) AS geom
FROM
public.multipoints)
AS sub_qry;
그 이유 ST_UNION
는 모든 지형지 물의 용해 된 다중 다각형 을 반환하고 ST_DUMP
이를 개별 다각형 지형지 물 (해산 된)로 나눕니다.