使用GDAL裁剪带有矢量层的栅格


26

我已经使用Osgeo安装程序安装了GDAL。如何以编程方式裁剪栅格图层和矢量图层?有可用的GDAL API可以帮助我吗?我正在使用Python。

Answers:


13

我不确定gdal api,在Warp API教程中引用void* GDALWarpOptions::hCutlineWarp Options,但没有明确的示例。您确定需要程序化答案吗?命令行实用程序可以立即使用:

  1. 创建一个仅包含感兴趣区域裁剪多边形的shapefile
  2. 用于ogrinfo确定裁剪shapefile的范围
  3. 用于gdal_translate裁剪形状范围
  4. gdalwarp-cutline参数一起使用

第2步和第3步是用于优化的,您可以通过just来完成gdalwarp -cutline ...

有关基于linux的解决方案,请参阅使用 Linfinity的多边形使用GDAL裁剪栅格,这些栅格都封装在一个脚本中。在Michael Corey的教程为Mapnik创建山体阴影的教程中可以看到另一个插队的示例。


马特,您可能还记得trac.osgeo.org/gdal/ticket/1599看起来像cutline满足了这一点
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 

您可以使用出色的子流程模块将此命令包装在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 ...)。


我喜欢您提供的命令行示例,但是可以解释一下-crop_to_cutline参数的作用吗?我不确定剪切形状文件是由-cutline指定的。
hendra 2012年

1
-cutline选项将栅格裁剪到多边形层的内部边界框。例如,如果范围较小,则输出栅格也将较小。如果没有此设置,则输出栅格的大小将与原始栅格大小相同,但是在您感兴趣的区域之外的所有点都将为NULL。
Oz123
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.