태그 보관물: postgis

postgis

다중 지오메트리에서 용해 된 버퍼 생성 (공유 속성 및 공간 교차로 통합) 있습니다. 기능 #2은 두 가지

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

여기 몇 단계가 있습니다 :

  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;

답변

이 작업을 수행하는 한 가지 방법은 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이를 개별 다각형 지형지 물 (해산 된)로 나눕니다.


답변