GDAL RasterizeLayer不会将所有多边形刻录到Raster吗?


12

我正在尝试使用GDAL的RasterizeLayer将shapefile刻录到栅格。给定特定的像素大小,我从另一个shapefile中预先创建了一个感兴趣的区域栅格。然后,此AOI将用作所有后续栅格化(相同数量的列和行,相同的投影和地理转换)的基础。

但是,当我基于相同的像素大小和投影将形状刻录到自己的栅格时,会发生问题。下面的链接(没有足够的代表来发布图像),以棕褐色显示原始shapefile,以及RasterizeLayer刻录数据的深粉红色。浅粉红色是深粉红色栅格数据的nodata值。灰色是完成形状文件刻录的AOI。

给定shapefile多边形的范围,我希望看到底部两个角处的刻录值,以及显示的数据下方的两个像素。但是,显然不是这种情况。

问题完成的光栅烧伤的图像

以下是我用来生成这些代码的代码。所有形状都是使用QGIS创建的,并且都在同一投影中创建。(应该注意的是,所示图片中的网格只是用来说明我所使用的像素大小。)

from osgeo import ogr
from osgeo import gdal

aoi_uri = 'AOI_Raster.tif'
aoi_raster = gdal.Open(aoi_uri)

def new_raster_from_base(base, outputURI, format, nodata, datatype):

    cols = base.RasterXSize
    rows = base.RasterYSize
    projection = base.GetProjection()
    geotransform = base.GetGeoTransform()
    bands = base.RasterCount

    driver = gdal.GetDriverByName(format)

    new_raster = driver.Create(str(outputURI), cols, rows, bands, datatype)
    new_raster.SetProjection(projection)
    new_raster.SetGeoTransform(geotransform)

    for i in range(bands):
        new_raster.GetRasterBand(i + 1).SetNoDataValue(nodata)
        new_raster.GetRasterBand(i + 1).Fill(nodata)

    return new_raster

shape_uri = 'activity_3.shp'
shape_datasource = ogr.Open(shape_uri)
shape_layer = shape_datasource.GetLayer()

raster_out = 'new_raster.tif'

raster_dataset = new_raster_from_base(aoi_raster, raster_out, 'GTiff',
                                -1, gdal.GDT_Int32)
band = raster_dataset.GetRasterBand(1)
nodata = band.GetNoDataValue()

band.Fill(nodata)

gdal.RasterizeLayer(raster_dataset, [1], shape_layer, burn_values=[1])

这是GDAL中的错误,还是RasterizeLayer刻录数据不是基于指定像素区域中是否存在多边形?

我正在使用的文件可以在这里找到。


您可以提供指向“ activity_3.shp”和“ AOI_Raster.tif”的链接吗?我想看看是否可以重新创建。
Rich

Answers:


10

我本周一直在与GDALRasterizeLayers一起玩,对它的工作有一个很好的了解。默认情况下,如果像素中心在多边形内,它将栅格化一个像素。如果中心没有任何内容,即使在像素范围内有多边形的一部分,也不会对其进行栅格化。要使栅格化按您的预期方式工作,请尝试“ ALL_TOUCHED”选项:

gdal.RasterizeLayer(raster_dataset, [1], shape_layer, None, None, [1], ['ALL_TOUCHED=TRUE'])

是!显然['ALL_TOUCHED=TRUE'],尽管不幸的是,只有固定的多边形层。我的point shapefile图层仍然超级稀疏,并从放置位置开始显示一个像素。
云雀

最终看起来像这样。它与其他投影具有相同的投影,我希望它也可以通过某种方式神奇地修复它,但是它似乎顽固地将其实际位置的一个像素烧掉了。
云雀

这当然值得一看,但它的烧点被dx / 2和dy / 2抵消了。我不知道该错误是否仍然存在于最新的中继中。
Mike T

它不是!它适用于1.9.0。非常感谢!
云雀

1
这里也有一个很好的食谱:gis.stackexchange.com/a/16916/9942
j08lue
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.