GDAL 워프 C ++ API로 래스터 파일 자르기

Aug 20 2020

셰이프 파일로 DEM 래스터 파일을 잘라야합니다. 이 shapefile에는 많은 다각형이 있습니다. 자르기 작업 후 몇 가지 변수를 계산해야합니다.

알고리즘은 C ++로 작성되었으므로 GDAL C ++ API를 호출하고 싶습니다. 뒤틀린 파일을 디스크에 쓸 필요가 없으며 테스트가 통과되면 VRT 또는 MEM을 사용하려고합니다.

이미 각 다각형의 좌표를 얻고 cutline 인수를 사용하여 다각형으로 전달했지만 지금까지 작업은 효과가 없습니다.

            OGRLinearRing poExteriorRing;
            for (i = 0; i < nPt; i++) 
              {
                dX = (*iIterator).vVertex.at(i).dX;
                dY = (*iIterator).vVertex.at(i).dY;
                double dDummy1 = (dX - dX_origin) / dResolution_elevation;
                long lColumn_index = long(round(dDummy1));
                double dDummy2 = (dY_origin - dY) / dResolution_elevation;
                long lRow_index = long(round(dDummy2));     
                poExteriorRing.addPoint(lColumn_index, lRow_index);
              }
            poExteriorRing.closeRings();
            OGRPolygon polygon;
            polygon.addRing(&poExteriorRing);

            GDALDataset  *poVRTDS;
            poDS_elevation->GetGeoTransform(adfGeoTransform);
            poVRTDS = poDriver->CreateCopy( "./test.tiff", poDS_elevation, FALSE, NULL, NULL, NULL );

            GDALWarpOptions *psWarpOptions = GDALCreateWarpOptions();
            ...
            psWarpOptions->hCutline = &polygon;                
            GDALWarpOperation oOperation;
            oOperation.Initialize( psWarpOptions );
            oOperation.ChunkAndWarpImage( 0, 0,
                            GDALGetRasterXSize( poDS_elevation ),
                            GDALGetRasterYSize( poDS_elevation ) );
            GDALClose( poVRTDS );

다음에 따라 이미지 인덱스에 다각형 정점을 구성해야한다고 가정합니다. CUTLINE : 이것은 절단 선에 대한 WKT 지오메트리를 포함 할 수 있습니다. GDALWarpOperation :: Initialize ()에 의해 지오메트리로 변환되고 GDALWarpOptions hCutline 필드에 할당됩니다. 좌표는 소스 픽셀 / 라인 좌표로 표현되어야합니다. 참고 : 이것은 gdalwarp 유틸리티의 -cutline 옵션에 대한 가정과 다릅니다!https://gdal.org/api/gdalwarp_cpp.html

답변

1 Chang Aug 24 2020 at 04:20

몇 번의 시도 끝에 블로그 게시물에 따라 문제를 해결할 수있었습니다. http://www.jeepxie.net/article/293437.html

핵심 부분은 좌표를 변환해야한다는 것입니다.

eError = TransformCutlineToSource( hWrkSrcDS, hCutline,
                                  &(psWO->papszWarpOptions),
                                  psOptions->papszTO );

hCutline과 cutline을 동시에 사용해서는 안됩니다.