Answers:
我不确定gdal api,在Warp API教程中引用void* GDALWarpOptions::hCutline
了Warp Options,但没有明确的示例。您确定需要程序化答案吗?命令行实用程序可以立即使用:
ogrinfo
确定裁剪shapefile的范围gdal_translate
裁剪形状范围gdalwarp
与-cutline
参数一起使用第2步和第3步是用于优化的,您可以通过just来完成gdalwarp -cutline ...
。
有关基于linux的解决方案,请参阅使用 Linfinity的多边形使用GDAL裁剪栅格,这些栅格都封装在一个脚本中。在Michael Corey的教程为Mapnik创建山体阴影的教程中可以看到另一个插队的示例。
GeospatialPython的Joel Lawhead在Clip光栅中使用shapefile(一个写得很好的教程)提供了完整的python示例。您需要安装Osgeo4W中未包含的Python图像库(PIL)(为此,您可能需要在Windows注册表中添加o4w python才能使安装程序正常工作)。
似乎这个话题总是回来的。我本人并不知道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
您可以使用出色的子流程模块将此命令包装在python脚本中。
对我来说真正有问题的一件事是,我需要提供对该问题的最小解决方案,这意味着尽可能简单,并且不需要许多外部依赖。Joel Lawhead的教程中对Python Imaging Library的使用非常简洁,但是我想出了以下解决方案:使用Numpy掩码数组。
我不知道它是否更好,但这是我所知道的(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。但是,计划是将来在可能的地方使用纯Python,因为我的软件的目标受众在太多依赖项方面存在困难(我使用Debian开发软件,而客户端使用Windows 7 ...)。