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.