GDAL을 사용하여 벡터 레이어로 래스터 클리핑


26

Osgeo 설치 프로그램을 사용하여 GDAL을 설치했습니다. 프로그래밍 방식으로 벡터 레이어로 래스터 레이어를 자르려면 어떻게해야합니까? 이것에 도움이되는 GDAL API가 있습니까? 저는 파이썬을 사용하고 있습니다.

답변:


13

나는 확실하지 GDAL의 API에 대한, 존재 해요 void* GDALWarpOptions::hCutline워프 옵션 으로부터 참조 워프 API 튜토리얼 하지만, 명시 적으로 예. 프로그래밍 방식의 답변이 필요하십니까? 명령 줄 유틸리티는 다음과 같이 즉시 사용할 수 있습니다.

  1. 관심 영역 클리핑 다각형 만 포함하는 shapefile을 만듭니다.
  2. ogrinfo클리핑 모양 파일의 범위를 결정하는 데 사용
  3. 사용 gdal_translate형태의 확장에 클립
  4. 매개 변수 gdalwarp와 함께 사용-cutline

2 단계와 3 단계는 최적화를위한 것 gdalwarp -cutline ...입니다.

Linux 기반 솔루션을 위해 Linfinity의 다각형사용하여 GDAL로 래스터 클리핑을 참조하십시오 . 또 다른 컷 라인 예제는 Michael Corey의 Mapnik 용 언덕 음영을 만드는 튜토리얼에서 볼 수 있습니다 .


Matt, trac.osgeo.org/gdal/ticket/1599컷 라인 이이를 달성 한 것처럼 보입니다.
Mike T


10

이 주제는 항상 돌아 오는 것 같습니다. 나는 GDAL> 1.8이 너무 진보되어 있다는 것을 몰랐다.

Mike Toews의 의견은 매우 유용하지만 간단하게 예를 들면 다음과 같습니다.

gdalwarp -of GTiff -cutline DATA/area_of_interest.shp -cl area_of_interest  -crop_to_cutline DATA/PCE_in_gw.asc  data_masked7.tiff 

훌륭한 서브 프로세스 모듈을 사용하여이 명령을 파이썬 스크립트 안에 넣을 수 있습니다.

나에게 정말로 문제가 된 한 가지는 가능한 한 간단하고 많은 외부 의존성이 필요하지 않음을 의미하는 최소한의 해결책을 그 문제에 제공해야한다는 것입니다. Joel Lawhead의 튜토리얼에서 Python Imaging Library를 사용하는 것이 깔끔하지만 Numpy masked arrays 사용 솔루션을 생각해 냈습니다.
더 나은지 모르겠지만 (3 년 전보다) 내가 아는 것이 었습니다.
원래 원래 래스터 내에 유효한 데이터 영역을 만들었지 만 (예 : 출력 래스터의 범위와 동일) 래스터를 더 작게 만드는 아이디어 (예 : -crop_to_cutline)를 좋아했기 때문에 world2PixelJoel Lawhead에서 채택했습니다 . 내 자신의 해결책은 다음과 같습니다.

def RasterClipper():
    craster = MaskRaster()
    contraster2 = 'PCE_in_gw.aux'
    craster.reader("DATA/"+contraster2.replace('aux','asc'))
    xres, yres = craster.extent[1], craster.extent[1]
    craster.fillrasterpoints(xres, yres)
    craster.getareaofinterest("DATA/area_of_interest.shp")
    minX, maxX=craster.new_extent [0]-5,craster.new_extent[1]+5
    minY, maxY= craster.new_extent [2]-5,craster.new_extent[3]+5
    ulX, ulY=world2Pixel(craster.extent, minX, maxY)
    lrX, lrY=world2Pixel(craster.extent, maxX, minY)
    craster.getmask(craster.corners)
    craster.mask=np.logical_not(craster.mask)
    craster.mask.resize(craster.Yrange.size,craster.Xrange.size)
    # choose all data points inside the square boundaries of the AOI,
    # replace all other points with NULL
    craster.cdata= np.choose(np.flipud(craster.mask), (craster.data, -9999))
    # resise the data set to be the size of the squared polygon
    craster.ccdata=craster.cdata[ulY:lrY, ulX:lrX]
    craster.writer("ccdata2m.asc",craster.ccdata, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
    # in second step we rechoose all the data points which are inside the
    # bounding vertices of AOI
    # need to re-define our raster points
    craster.xllcorner, craster.yllcorner = minX, minY
    craster.xurcorner, craster.yurcorner = maxX, maxY
    craster.fillrasterpoints(10,10)
    craster.getmask(craster.boundingvertices) # just a wrapper around matplotlib.nxutils.points_in_poly
    craster.data=craster.ccdata
    craster.clip2(new_extent_polygon=craster.boundingvertices)
    craster.data = np.ma.MaskedArray(craster.data, mask=craster.mask)
    craster.data = np.ma.filled(craster.data, fill_value=-9999)
    # write the raster to disk
    craster.writer("ccdata2m_clipped.asc",craster.data, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)

class MaskRaster및 그 방법 에 대한 자세한 설명 은 내 프로젝트의 github을 참조하십시오 .

이 코드를 사용하면 여전히 GDAL을 사용해야합니다. 그러나 계획은 미래의 순수한 파이썬에서 사용할 수 있습니다. 소프트웨어의 대상 독자가 너무 많은 종속성에 어려움을 겪기 때문입니다 (데비안을 사용하여 소프트웨어를 개발하고 클라이언트는 Windows 7을 사용합니다 ...).


나는 당신이 제공 한 명령 행 예제를 좋아하지만 -crop_to_cutline 인수가 무엇을 설명 할 수 있습니까? 클리핑 모양 파일이 -cutline으로 지정되어 있는지 그 목적이 무엇인지 잘 모르겠습니다.
hendra

1
-cutline 옵션은 래스터를 다각형 레이어의 내부 경계 상자에 자릅니다. 예를 들어, 출력 래스터의 범위가 더 작 으면 출력 래스터도 더 작아집니다. 이것이 없으면 출력 래스터는 원본과 같은 크기이지만 관심 영역 밖의 모든 지점에서 NULL을 갖습니다.
Oz123
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.