13 votos

GDAL RasterizeLayer no Quemar Todos los Polígonos de Trama

Estoy tratando de grabar un shapefile en un ráster utilizando GDAL del RasterizeLayer. Me pre-crear un área de interés de la trama desde un shapefile, dado un determinado tamaño de píxel. Esta ZONA sirve como una base para todos los siguientes rasterizations (el mismo número de collumns y filas, la misma proyección y geotransform).

El problema se produce, sin embargo, cuando voy a grabar las formas de su propia trama, basada en el mismo tamaño de píxel y proyecciones. El enlace de más abajo (no tienen suficiente rep de subir la imagen), se muestra el original shapefile en color beige y el rosa oscuro donde RasterizeLayer ha quemado datos. La luz de color rosa es nodata los valores de la rosa oscuro datos raster. El gris es el AOI basa en que el shapefile de grabación se completó.

Dada la extensión de los shapefile de polígonos, yo esperaría a ver quemar los valores en la parte inferior dos esquinas, así como los dos píxeles debajo de los datos que muestra. Obviamente, sin embargo, este no es el caso.

Imagen para el Problema de - Terminado Trama Quemaduras

La siguiente es el código que he utilizado para generar estas. Todas las figuras fueron creadas usando QGIS, y fueron creados en la misma proyección. (Cabe señalar que la disposición en cuadrícula en la imagen que se muestra fue sólo para dar una idea de el tamaño de píxel de que estaba utilizando.)

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])

Mi pregunta por tanto es: Es esto un error en GDAL? O es RasterizeLayer la grabación de datos, basado en algo más que sólo la presencia o ausencia de un polígono dentro de una determinada área de píxeles?

Edit: Los archivos que yo estaba usando se puede encontrar aquí.

13voto

hernan43 Puntos 566

He estado jugando con GDALRasterizeLayers esta semana y tener una idea bastante buena de lo que está haciendo. De forma predeterminada, se rasterise un píxel si el píxel del centro está dentro del polígono. Si no hay nada en el centro, no será rasterised, incluso si son partes de un polígono dentro de los límites de píxeles. Para permitir que el rasterising para trabajar la forma en que desea, pruebe el "ALL_TOUCHED" opción:

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X