PostGIS에 st_union 이외의 디졸브 기능이 있습니까?


22

테이블의 다각형 피처 사이에 공유 경계를 해소하는 함수를 찾고 있습니다. ST_UNION ()은 내가 찾고있는 것을 거의 수행하지만 공통 경계를 공유하는지 여부에 관계없이 레이어의 모든 다각형에서 다중 다각형을 만듭니다. 차라리 서로 닿는 다각형 사이의 경계 만 녹이려고합니다. ST_TOUCHES ()를 사용하는 방법이 있어야하지만 디졸브 함수의 필요성이 너무 일반적으로 보이므로 내장 함수가 없으면 놀랄 것입니다.

유스 케이스는 다음과 같습니다. 유럽의 큰 국가에 대한 Corine Landcover 데이터를 다운로드했으며 서로 다른 포리스트 유형 (한 테이블에 약 75,000 개의 다각형) 사이의 경계를 없애고 싶습니다. ST_UNION을 시도했지만 "메모리 부족"오류로 인해 실패합니다 (30,000 개의 다각형이 작동했습니다).

create table corine00 as 
  select st_union(the_geom) as the_geom, 
         sum(area_ha) as area_ha,
         substr(code_00,1,2) as code_00
  from clc00_c31_forests
  group by substr(code_00,1,2)

참고 : 모든 포리스트 코드는 '31'로 시작하며 PostGIS 1.4, GEOS 버전 : 3.2.0-CAPI-1.6.0을 사용하고 있습니다.

답변:


21

ST_MemUnion ()은 순진하고 느린 메모리 친화적 프로세스를 실행합니다. 문제가 충분히 작은 경우 적절한 시간 내에 완료 될 수 있습니다. 문제를 반으로 나눈 다음 반쪽을 함께 실행할 수도 있습니다. 결과는 입력보다 훨씬 적은 포인트를 가지므로 전체 문제를 메모리에 맞출 수 있습니다. 또는 절반에 빠른 메모리 배고픈 루틴을 사용하고 최종 병합에 느린 루틴을 사용하십시오.


4
비교할 수없는 전문 지식을 제공해 주셔서 감사합니다.
fmark

1
고마워, 내 문제가 충분히 작지 않은 것 같습니다. ST_MemUnion ()이 24 시간 동안 실행되었습니다. 나는 문제를 나누려고 노력할 것이다.
underdark

5

ST_Dump가 원하는 것이라고 생각합니다.

ST_Dump :

형상 g1.을 구성하는 geometry_dump (geom, path) 행 세트를 리턴합니다. 예를 들어 MULTIPOLYGONS를 POLYGONS로 확장하는 데 사용할 수 있습니다. ...

따라서 귀하의 경우 :

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

나는 그것이 당신이하려고하는 테이블 생성과 어떻게 상호 작용할 지 확신하지 않지만, 당신에게 기하학을 별도의 항목으로 제공해야합니다. 그런 다음 두 테이블간에 공간 조인 (&& 및 ST_Contains 사용)을 수행하여 데이터를 도형에 수집 할 수 있습니다.


2
참고 : 이것은 ST_Union의 메모리 문제가 처리 된 경우에만 유용합니다! :)
yhw42

4

PostGIS가 GEOS 3.1.0 이상에서 컴파일 되었습니까? 이 버전에서는 훨씬 빠른 캐스케이드 연합 이 구현되었지만 찾지 못하면 오래된 코드가 사용됩니다.

업데이트 : PostGIS가 계단식 유니온 접근법을 사용하는 것처럼 보이지만 메모리 부족은 실제입니다. 폴 그레이 지의 2007 FOSS4G PostGIS 토크 의 조언은 다음 같습니다.

  • 디스크 액세스가 느리므로 더 많은 메모리를 사용하여 데이터를 캐시함으로써 더 높은 성능을 얻을 수 있습니다!
    • 증가하다 shared_buffers
    • 물리적 RAM-OS 필요 * 75 %
  • 정렬이 메모리에서 더 빠름
    • 증가하다 work_mem
  • 더 많은 메모리로 디스크 정리가 빠릅니다.
    • 증가하다 maintenance_work_mem
  • 연결 당 할당
  • 또한
    • 증가하다 wal_buffers
    • 증가하다 checkpoint_segments
    • 감소 random_page_cost

귀하의 경우, 나는 shared_buffers데이터베이스 서버에 대해 사용 가능한 메모리의 25 %를 늘리려 고 노력하고 있지만 현재 값의 3-4 배로 늘리고 완료되는지 확인하십시오.


postgis_geos_version ()은 다음을 반환합니다. 3.2.0-CAPI-1.6.0 ... 괜찮습니다. 감사합니다. ST_Collect를 사용해보십시오.
underdark

ST_Collect는 경계를 해소하지 않는 것처럼 보이며 하나의 거대한 Multipolygon도 만듭니다.
underdark

예, ST_Collect에 대한 페이지를 잘못 읽었습니다. Postgres의 메모리 사용량 조정에 대한보다 구체적인 조언을 제공하기 위해 답변을 업데이트했습니다.
scw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.