GDAL RasterizeLayer tidak Membakar Semua Poligon ke Raster?


12

Saya mencoba untuk membakar shapefile ke raster menggunakan GDAL's RasterizeLayer. Saya pra-membuat area yang menarik raster dari shapefile yang berbeda, mengingat ukuran piksel tertentu. AOI ini kemudian berfungsi sebagai basis untuk semua rasterisasi berikut (jumlah kolom dan baris yang sama, proyeksi dan geotransformasi yang sama).

Masalahnya terjadi, bagaimanapun, ketika saya pergi untuk membakar bentuk ke raster mereka sendiri, berdasarkan pada ukuran dan proyeksi piksel yang sama. Tautan di bawah ini (tidak memiliki cukup perwakilan untuk memposting gambar), menunjukkan shapefile asli di tan, dan merah muda gelap tempat RasterizeLayer membakar data. Merah muda muda adalah nilai nodata untuk data raster merah muda gelap. Abu-abu adalah AOI berdasarkan yang membakar selesai shapefile.

Mengingat luasnya poligon shapefile, saya akan berharap untuk melihat nilai bakar di dua sudut bawah, serta dua piksel di bawah data yang ditampilkan. Namun, jelas bukan itu masalahnya.

Gambar untuk Masalah - Selesai Raster Burns

Sebagai berikut adalah kode yang saya gunakan untuk menghasilkan ini. Semua bentuk dibuat menggunakan QGIS, dan semuanya dibuat dalam proyeksi yang sama. (Perlu dicatat bahwa kisi-kisi dalam gambar yang ditampilkan hanya untuk memberikan gambaran tentang ukuran piksel yang saya gunakan.)

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

Apakah ini bug dalam GDAL, atau apakah RasterizeLayer membakar data berdasarkan pada sesuatu selain dari hanya ada atau tidak adanya poligon dalam area piksel yang ditentukan?

File-file yang saya gunakan dapat ditemukan di sini .


Bisakah Anda memberikan tautan ke 'activity_3.shp' dan 'AOI_Raster.tif'? Saya ingin melihat apakah saya bisa membuat ulang di ujung saya.
Kaya

Jawaban:


10

Saya sudah bermain dengan GDALRasterizeLayers minggu ini dan punya ide bagus tentang apa yang dilakukannya. Secara default, ini akan merasterisasi piksel jika pusat piksel berada dalam poligon. Jika tidak ada apa-apa di tengah, itu tidak akan dirasterisasi, bahkan jika ada bagian dari poligon dalam batas piksel. Untuk memungkinkan rasterisasi bekerja seperti yang Anda inginkan, coba opsi "ALL_TOUCHED":

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

IYA! Tampaknya ['ALL_TOUCHED=TRUE'], meskipun sayangnya, itu hanya memperbaiki lapisan poligon. Lapisan shapefile titik saya masih super miring, dan muncul satu piksel lebih dari tempat mereka ditempatkan.
Lark

Itu akhirnya tampak seperti ini . Ini dalam proyeksi yang sama dengan yang lain, dan saya berharap ini entah bagaimana secara ajaib akan memperbaikinya juga, tapi sepertinya membakar satu pixel dari lokasi sebenarnya.
Lark

Itu jelas terlihat layak bug, di mana titik bakar diimbangi oleh dx / 2 dan dy / 2. Saya ingin tahu apakah bug itu masih berlanjut dengan trunk terbaru.
Mike T

Itu tidak! Ia bekerja di 1.9.0. Terima kasih banyak!
Lark

1
Ada juga resep yang cukup baik di sini: gis.stackexchange.com/a/16916/9942
j08lue
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.