Tôi đang cố gắng đốt một shapefile cho một raster bằng cách sử dụng RasterizeLayer của GDAL. Tôi tạo trước một khu vực raster quan tâm từ một shapefile khác, với một kích thước pixel cụ thể. AOI này sau đó đóng vai trò là cơ sở cho tất cả các lần raster sau (cùng số lượng collmen và hàng, cùng phép chiếu và geotransform).
Tuy nhiên, sự cố xảy ra khi tôi ghi các hình dạng vào raster của riêng chúng, dựa trên cùng kích thước pixel và các hình chiếu. Liên kết bên dưới (không có đủ đại diện để đăng ảnh), hiển thị shapefile gốc trong tan và màu hồng đậm nơi RasterizeLayer đã ghi dữ liệu. Màu hồng nhạt là giá trị nốt cho dữ liệu raster màu hồng đậm. Màu xám là AOI dựa trên đó quá trình đốt shapefile được hoàn thành.
Với các phạm vi của đa giác shapefile, tôi sẽ thấy các giá trị ghi ở hai góc dưới cùng, cũng như hai pixel bên dưới dữ liệu hiển thị. Rõ ràng, tuy nhiên, đây không phải là trường hợp.
Như sau đây là mã mà tôi đã sử dụng để tạo ra chúng. Tất cả các hình dạng được tạo bằng cách sử dụng QGIS và tất cả được tạo trong cùng một phép chiếu. (Cần lưu ý rằng việc chia lưới trong ảnh hiển thị chỉ là để đưa ra ý tưởng về kích thước pixel tôi đang sử dụng.)
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])
Đây có phải là một lỗi trong GDAL hay là RasterizeLayer đang đốt dữ liệu dựa trên thứ gì đó ngoài sự hiện diện hoặc thiếu đa giác trong một vùng pixel được chỉ định?
Các tập tin mà tôi đang sử dụng có thể được tìm thấy ở đây .