다중 지오메트리에서 용해 된 버퍼 생성 (공유 속성 및 공간 교차로 통합)


10

다 지점 입력 기능에서 용해 된 버퍼를 작성했습니다. 아래 예에서 입력 테이블에는 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));

하위 쿼리를 너무 많이 사용합니다. 클러스터하려는 속성에서 그룹화 할 수있는 기능이 줄어 듭니다.
Vince

따라서 공간 결합을 수행 한 다음 피처 번호를 기준으로 결합을 수행해야하므로 위의 다이어그램에서 3 개의 다중 다각형이 필요합니다. 나는 이것이 2 단계 과정을 필요로 할 것이라고 생각하지만 대답을 제공하기 전에 질문에 대해 명확하게하고 싶었습니다.
존 파월

예, 버퍼 다각형을 통합하고 입력 기능 수에 따라 결과를 수집하려고합니다.
eclipsed_by_the_moon

이것에 대한 업데이트? 내가 볼 수있는 한, 나는 그것이 당신에게 도움이되는지 알고 싶습니다. 나는 질문에 대답했습니다.
존 파월

답변이 늦어서 죄송합니다. 며칠 동안 온라인에 접속하지 않았습니다.
eclipsed_by_the_moon

답변:


7

첫 번째 두 공간이 교차하는 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;

여기 몇 단계가 있습니다 :

  1. 사용 ST_Union속성에 의해 첫 번째 그룹에, id로 그룹화,
  2. ST_ClusterIntersecting공간적으로 교차하는 동일한 그룹의 것을 결합하는 데 사용
  3. 각 클러스터 (테이블 멀티)에 id를 추가하십시오-ClusterIntersecting에서 직접 수행하면 모든 지오메트리가 id가 1이됩니다.
  4. 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;

답장을받는 데 시간이 오래 걸렸습니다. QGIS에서 버퍼 구조를 시각화하는 데 문제가 있습니다. ST_SetSRID, ST_Multi및을 사용하여 검색어를 수정하려고했지만 ::geometry(Multipolygon, /*SRID*/)현재 작동하지 않습니다.
eclipsed_by_the_moon

좋아, 코드를 게시하고 더 나은 데이터를 얻을 수 있다면 도움이 될 수 있습니다.
존 파월

샘플 포인트를 만들기 위해 SQL을 추가했습니다.
eclipsed_by_the_moon

오늘 조금 묶여서 최대한 빨리 복귀하겠습니다. 다 지점도 쿼리에 적용해야합니다.
존 파월

3

이 작업을 수행하는 한 가지 방법은 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 버퍼로 연결되어 있지 않을 수 있기 때문에 이것은 버퍼 우선 방법과 정확히 동일한 결과를 생성하지 않습니다.


우리도 비슷한 생각을 한 것 같습니다. 나는 당신을 테스트하지는 않았지만 그것이 효과가 있고 내 것보다 더 깨끗하다고 ​​확신합니다.
존 파월

PostGIS 2.2.1은 ST_ClusterDBSCAN을 지원하지 않는 것 같습니다. PostGIS 2.3.2를 설치했지만 pgAdmin의 새로운 postgis 확장자는 여전히 버전 2.2.1입니다.
eclipsed_by_the_moon

0

이 답변 에 따르면 하위 쿼리 내에서 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이를 개별 다각형 지형지 물 (해산 된)로 나눕니다.


1
원하는 멀티 파트 다각형을 클러스터링하는 데 필요한 속성이 손실되므로 실제로는 작동하지 않습니다.
Vince

시도 ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom했지만 3 대신 4 가지 기능을 만듭니다.
eclipsed_by_the_moon

아, 맞아요, 당신은 숫자로 그룹화하고 싶습니까? 당신은 당신이 GROUP_BY전에해야합니다 ST_UNION.
Alex Leith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.