복잡한 쉐이프 파일을 그리드로 나누기


11

다각형 / 다중 다각형 기능을 갖춘 괜찮은 모양의 파일이 있습니다 (파일 크기는 약 500MB). 실제로 해안선을 나타내는 지형지 물이있는 전 세계의 형태 파일입니다. 이 데이터를 그리드를 사용하여 나눌 필요가 있습니다. 분명히하기 위해 데이터를 '정렬'하고 싶지 않지만 실제로 다각형을 타일로 자릅니다. 나는이 질문이 전에 요청되었지만 내가 찾은 해결책이 효과가 없다는 것을 알고 있습니다.

난 노력 했어:

  • QGIS를 사용하고 모양 파일 내용을 벡터 격자와 교차하면 결과가 끔찍합니다. 작은 땅 덩어리가 때때로 그것을 만드는 것처럼 보이지만 대부분의 주요 대륙은 마술처럼 사라집니다. 이 방법은 훨씬 간단한 데이터 (즉, 적은 포인트)로 실제로 잘 작동한다는 점에 유의해야합니다.

  • OGR의 교차 도구 사용 나는 ogr2ogr을 통해 그리고 심지어 내 자신의 C ++ 도구를 굴려서 시도했다. 둘 다 QGIS와 같은 문제가 있습니다. 또한 간단한 파일에는이 문제가 나타나지 않지만보다 복잡한 파일에는 실패합니다. 참고로 20MB 이하의 호주와 뉴질랜드의 쉐이프 파일을 사용하고 있는데 QGIS와 OGR 모두 '그리드 화'에 실패했습니다.

누군가 교차점 기능이 있기 때문에 PostGIS 사용을 한 번에 제안했지만 PostGIS의 ST_Intersect는 OGR과 동일한 GEOS 백엔드를 사용합니다. 실제로 그들은 둘 다 내가 알 수있는 한 동일한 기능을 호출하므로 PostGIS가 다른 결과를 낳을 것이라고 생각하지 않습니다.

나는 내가 시도 할 수있는 다른 것에 대한 제안을 찾고 있었다. 매우 상세한 모양 파일을 타일로 나눌 수있는 강력한 응용 프로그램 또는 툴킷이 필요합니다.

편집 : 더 많은 정보 추가

심바 만구 님의 질문에 답변 :

  • shapefile은 기본적으로 OpenStreetMap의 해안선 데이터입니다. 'processed_p'파일 (타일로 나뉘 지 않음)의 병합 된 버전으로 개발자 목록을 이메일로 보냅니다. 타일을 겹치는 부분 (100km x 100km 청크로 겹침)이 반드시 원하는 것은 아닙니다. 겹치는 것을 원하지 않으며 그리드 크기를 자유롭게 선택할 수 있습니다. 기본 processing_p.

  • 기본적으로 해안선 데이터에는 QGIS에서보고 한 지오메트리 오류가 있습니다. 이 문제를 구체적으로 해결하기 위해 고안된 코드를 사용하여 작성한 작은 도구로 이러한 오류를 수정합니다 (해안선 데이터의 지오메트리 오류 복구 : https://github.com/tudelft-gist/prepair ). 이 도구로 파일을 실행하면 QGIS에서 발생하는 거의 모든 오류가 수정됩니다. 파일을 청소 한 후에 만 ​​교차를 시도합니다.

  • 정확히 QGIS를 사용하여 수행 한 작업 : 데이터를 열어 QGIS에서 제대로 표시되는지 확인하십시오. 지정된 간격으로 벡터 그리드를 사용하여 타일 레이어를 만든 다음 두 레이어를 교차시켜 타일로 나눕니다. 작은 데이터 세트를 사용해보십시오. 오세아니아 (Aus, NZ)의 기능을 선택하여 더 작은 데이터 세트를 사용해보십시오.이 모양 파일의 크기는 <20mb입니다. 다시 나누면 작동하지 않습니다.

  • OGR로 수행 한 작업 : spat_extent와 함께 '-spat'및 '-clipsrc'옵션을 직접 사용하는 ogr2ogr 또한 WKT에서 작동하는 작은 C ++ 도구를 작성 했으므로 ogr2ogr을 사용하여 shapefile을 WKT로 변환 한 다음 텍스트 파일을 내 응용 프로그램에 공급합니다. 파일을 통해 실행되며 http://www.gdal.org/ogr/classOGRGeometry.html에 설명 된 Intersection () 메소드를 호출합니다 . 나는 그것이 ogr2ogr을 직접 사용하는 것과 똑같은 일을 끝내는 것으로 생각합니다.

브렌트에 대한 답변 :

  1. 그렇습니다. 모든 것은 WGS84 Lat / Lon에 있습니다.
  2. 주어진 그리드 타일 세트의 경우 각 타일에 더 공간적으로 지역화 될 수있는 조각난 피처가 아닌 하나의 거대한 다중 다각형을 교차시키는 데 시간이 더 오래 걸리지 만 그 반대가 사실이라고 생각했을 것입니다. 흥미로운 제안입니다. 다시 시도하고 다시 신고하겠습니다.
  3. 프로세스 중에 속성 필드가 유지되지 않으며 지오메트리에만 관심이 있습니다.
  4. 확실하지 않지만 주어진 그리드 타일과 겹치는 다각형을 선택한 다음 교차를 수행해야한다고 말하고 있다고 생각합니다. QGIS에서는 수동으로 너무 번거 롭습니다. 내 도구는 이미 경계 상자 확인을 통해 어느 정도까지이 작업을 수행합니다. 약간의 속도 향상이 있지만 최종 결과는 여전히 좋지 않으며 눈에 띄게 다르지 않습니다.
  5. 이것은 옵션이 아닙니다. 지금은 데이터를 1 lat x 1 deg lon으로 나누려고 노력하고 있으며 모든 경우에 작동하는 일반 / 강력한 방법을 찾고 있습니다. 더 나은 결과를 얻을 수 있는지 확인하기 위해 그리드 크기 (예 : 10x10)를 늘리려 고했지만 그리드 크기와 출력 품질 사이에 상관 관계가 없습니다.

편집 # 2 :

나는 이것을 더 많이 사용해 보았고 일반적으로 GEOS와 QGIS (fTools를 사용하는 경우 결과가 GEOS를 다시 사용하는지 여부는 알 수 없음)를 사용하여 결과를 신뢰할 수없는 것처럼 보입니다. 그리드의 크기가 결과와 아무 관련이 없다고 말하는 것이 잘못되었습니다. 그리드가 클수록 결과가 더 좋습니다 (알아도 좋지만 여전히 해결책은 아닙니다). 다음은 주로 작동하지만 실제로는 타일 하나에서 일부 실패한 그리드의 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

형상이 깨끗합니다. QGIS는 "유효성 검사"도구를 사용하여 0 개의 오류를 표시합니다. 나는이 문제를 단계적으로 접근하려고하지 않는다. 시각적으로 명확하지 않고 (더 작은 타일이 아닌) 데이터 집합의 교차점에서 특정 기능이 실패했는지 여부를 확인하는 것은 실용적이지 않습니다.


세계 또는 호주 셰이프 파일을 어디서 얻었습니까? 해당 파일의 지오메트리에 몇 가지 문제가있을 수 있습니다 (QGIS에서 Vector | Geometry Tools | Geometry Validity를 시도하십시오). 더 작은 월드 셰이프 파일과 5도 타일 에서 교차 를 시도 했으며 QGIS에서 완벽하게 작동합니다.
Simbamangu

1
Geoscience Australia (20MB)와 4도 타일의 100K 호주 해안선으로 이것을 시도해 보았습니다 (QGIS 1.7.4, OSX 10.7). 데이터와 수행 한 작업을 더 자세히 설명해 주시겠습니까?
Simbamangu

모든 추가 정보에 감사드립니다. OSM 데이터에 이상한 점이 있다고 생각합니다. 내가 언급 한 데이터 세트로 시도하고 더 나은 결과를 얻는 지 확인하십시오. 과거에 OSM Lake 데이터에 이상한 점이 있다는 것을 기억 한 것 같습니다.
Simbamangu

데이터 세트를 공유 할 수 있습니까? 아니면 위의 예와 같이 잘린 부분을 공유 할 수 있습니까?
Simbamangu

답변:


7

방금이 작업을 수행하기위한 자체 도구를 만들었습니다.

Clipper 라이브러리 ( http://www.angusj.com/delphi/clipper.php )를 OGR과 함께 사용하여 데이터 설정을 나누었습니다. 주목해야 할 것은이 lib와 순진하게 교차를 수행하는 데 시간이 오래 걸리기 때문에 쿼드 트리 접근 방식을 대신 사용했습니다. 즉, 원하는 해상도를 얻을 때까지 4 개의 그리드 셀로 나누고 각 그리드 셀을 4 개 이상으로 나눕니다. lib는 훌륭하게 작동합니다. 동반구의 결과를 보여주는 스크린 샷을 첨부했습니다.

여기에 이미지 설명을 입력하십시오

위의 결과는 1.33GHz 프로세서에서 약 4.5 시간이 걸렸습니다.

다음에 누군가 비슷한 문제가 발생할 경우에 대비 한 도구는 다음과 같습니다. 그것들은 개념 증명을 함께 해킹 당했으며 직접 사용해서는 안됩니다 (물론 좋은 출발점이 될 수 있습니다).

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


연결된 코드는 더 이상 사용할 수 없습니다 :-(
Shaun McDonald

리포지토리를 github.com/preet/scratch/tree/master/gis/polytoolkit 으로 옮겼습니다 . 정확히 달성하려는 것에 따라 github.com/preet/scratch/tree/master/gis/shapefiles/shptk 가 더 유용 할 수 있습니다.
Pris

후자가 더 유용합니다. PostGIS를 사용하는 방법을 찾았지만 이것이 더 빠른지 알아내는 데 관심이 있습니다. 컴파일 및 설치에 대한 추가 정보가 있습니까?
Shaun McDonald

링크를 수정하기 위해 답을 편집 할 수 있습니까? 감사합니다
Afr

4

지오메트리 문제가있는 것 같습니다. 형상 문제를 먼저 해결하지 않는 한 사용 된 소프트웨어에 관계없이 더티 입력 파일에서 깨끗한 결과를 얻을 수있을 것 같지 않습니다. 지오메트리 문제를 정리 한 후에도 여전히 문제가있는 경우 다음을 시도 할 수 있습니다.

1) 그리드 데이터 셋이 월드 폴리곤 데이터 셋과 동일한 투영인지 확인하십시오. 그렇지 않은 경우 적절한 투사로 다시 만드십시오.

2) 모든 기능을 단일 부품으로 변환-처리가 훨씬 쉬움

3) 교차점을 수행 한 후 속성을 다시 결합 할 수있게하는 id 필드 만 유지하는 모든 관련 필드를 제거하십시오.

4) 전체 그리드 데이터 세트와 전체 월드 폴리곤 데이터 세트를 교차시키는 대신 그리드 폴리곤을 반복하여 월드 데이터 세트의 교차 다각형을 선택하고 그리드 다각형을 기준으로 클립을 수행하십시오. 이를 통해 모든 문제를 파악할 수 있으며 결과를 합쳐서 원래 목표를 달성 할 수 있습니다.

5) 더 큰 격자 다각형을 사용해보십시오.


+1 정말 흥미 롭습니다. 데이터에 ID 필드 또는 멀티 파트를 유지하면 지오 프로세싱 속도에 얼마나 영향을 줍니까?
Simbamangu

1
나는 실제로 차이점을 정량화하려고 시도한 적이 없다. 분석적인 지오 프로세싱 작업이 실패한 경험을 통해서만 이야기 할 수 있으며 이러한 문제는 문제 해결에 도움이됩니다.
브렌트 에드워즈

나는 (2) 일하는 데 전혀 실패했습니다. 기능을 선택하고 QGIS를 사용하여 병합하려고하면 기본적으로 내 시스템을 잠그는 것 같습니다. 아직 처리하지는 않지만 그 속도는 실용적이지 않습니다 .QGIS로 밤새 시스템을 두어 몇 가지 기능을 병합하려고했습니다. 데이터 집합과 아침에 여전히 진행 중이었습니다.
Pris

1
병합이 포함되어서는 안됩니다. 목표는 멀티 파트 기능을 분해하는 것입니다. 예를 들어, 실패한 타일의 스크린 샷에서 목표는 BC 주와 알래스카 해안을 따라있는 섬 지형지 물과 같이 그룹화 된 공간적으로 분리 된 다각형을 포함하는 모든 레코드를 별도의 단일 부분 다각형 레코드로 분해하는 것입니다. 이것은 QGIS에서 Vector> Geometry Tools 메뉴의 "Multipart to singleparts"도구를 사용하여 달성 할 수 있습니다.
브렌트 에드워즈

단일 부품 피쳐로 변환 한 후에는 모든 것이 깨끗한 지 확인하기 위해 형상을 다시 확인해야합니다.
브렌트 에드워즈

0

또 다른 방법은 벡터-래스터 변환을 시도하여 포인트 데이터 세트를 만든 다음 포인트 데이터 세트를 기초로 사용하여 타일을 만드는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.