GDAL RasterizeLayer non brucia tutti i poligoni su raster?


12

Sto cercando di masterizzare uno shapefile su un raster usando RasterizeLayer di GDAL. Pre-creo un'area di interesse raster da un file di forma diverso, data una dimensione pixel specifica. Questo AOI funge quindi da base per tutte le successive rasterizzazioni (stesso numero di colonne e file, stessa proiezione e geotrasformazione).

Il problema si verifica, tuttavia, quando vado a masterizzare le forme sul loro raster, in base alle stesse dimensioni dei pixel e alle proiezioni. Il link in basso (non ha abbastanza rappresentante per pubblicare l'immagine), mostra lo shapefile originale in marrone chiaro e il rosa scuro dove RasterizeLayer ha masterizzato i dati. Il rosa chiaro è valori nodati per i dati raster rosa scuro. Il grigio è l'AOI in base al quale è stata completata l'ustione dello shapefile.

Date le estensioni dei poligoni dello shapefile, mi aspetterei di vedere i valori di burn nei due angoli inferiori, così come i due pixel sotto i dati che mostrano. Ovviamente, tuttavia, non è così.

Immagine per problema - ustioni raster finite

Di seguito è riportato il codice che ho usato per generare questi. Tutte le forme sono state create usando QGIS e sono state create nella stessa proiezione. (Va notato che la griglia nell'immagine mostrata era solo per dare un'idea della dimensione dei pixel che stavo usando.)

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

È un bug in GDAL o RasterizeLayer sta bruciando dati basati su qualcosa di diverso dalla semplice presenza o mancanza di un poligono all'interno di un'area pixel specificata?

I file che stavo usando possono essere trovati qui .


Puoi fornire un link a 'activity_3.shp' e 'AOI_Raster.tif'? Voglio vedere se riesco a ricreare da parte mia.
Ricco

Risposte:


10

Ho giocato con GDALRasterizeLayers questa settimana e ho una buona idea di cosa stia facendo. Per impostazione predefinita, rasterizzerà un pixel se il centro del pixel si trova all'interno del poligono. Se non c'è nulla al centro, non verrà rasterizzato, anche se ci sono parti di un poligono entro i limiti dei pixel. Per consentire al rasterizzazione di funzionare nel modo desiderato, prova l'opzione "ALL_TOUCHED":

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

SÌ! Apparentemente ['ALL_TOUCHED=TRUE'], anche se sfortunatamente, sono stati risolti solo i livelli poligonali. I livelli dei miei shapefile puntuali sono ancora super impertinenti e si presentano un pixel oltre il punto in cui sono posizionati.
Lark,

Si finisce per assomigliare questo . È nella stessa proiezione degli altri, e speravo che anche in qualche modo potesse risolverlo magicamente, ma sembra bruciare ostinatamente un pixel da dove si trova effettivamente.
Lark,

Sembra certamente degno di bug, in cui il punto di combustione è compensato da dx / 2 e dy / 2. Mi chiedo se quel bug persista ancora con l'ultimo trunk.
Mike T,

Non è così! Funziona in 1.9.0. Grazie mille!
Lark,

1
C'è anche una buona ricetta qui: gis.stackexchange.com/a/16916/9942
j08lue,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.