답변:
나는 확실하지 GDAL의 API에 대한, 존재 해요 void* GDALWarpOptions::hCutline
에 워프 옵션 으로부터 참조 워프 API 튜토리얼 하지만, 명시 적으로 예. 프로그래밍 방식의 답변이 필요하십니까? 명령 줄 유틸리티는 다음과 같이 즉시 사용할 수 있습니다.
ogrinfo
클리핑 모양 파일의 범위를 결정하는 데 사용gdal_translate
형태의 확장에 클립gdalwarp
와 함께 사용-cutline
2 단계와 3 단계는 최적화를위한 것 gdalwarp -cutline ...
입니다.
Linux 기반 솔루션을 위해 Linfinity의 다각형 을 사용하여 GDAL로 래스터 클리핑을 참조하십시오 . 또 다른 컷 라인 예제는 Michael Corey의 Mapnik 용 언덕 음영을 만드는 튜토리얼에서 볼 수 있습니다 .
GeospatialPython의 Joel Lawhead는 Clip raster 에서 잘 작성된 튜토리얼 인 shapefile을 사용하여 완전한 Python 예제를 제공 합니다. 당신은 설치해야합니다 파이썬 이미지 라이브러리 (있는 당신이해야 할 수도 있습니다 Osgeo4W에 포함되지 않습니다 (PIL)를 윈도우 레지스트리에 o4w 파이썬를 추가 작업에 프로그램을 설치 얻을).
이 주제는 항상 돌아 오는 것 같습니다. 나는 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)를 좋아했기 때문에 world2Pixel
Joel 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을 사용합니다 ...).