GDAL RasterizeLayer không ghi tất cả đa giác thành Raster?


12

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.

Hình ảnh cho sự cố- Bỏng Raster đã hoàn thành

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 .


Bạn có thể cung cấp một liên kết đến 'Activity_3.shp' và 'AOI_Raster.tif' không? Tôi muốn xem nếu tôi có thể tạo lại vào cuối của tôi.
Giàu

Câu trả lời:


10

Tôi đã chơi với GDALRasterizeLayers tuần này và có một ý tưởng khá hay về những gì nó đang làm. Theo mặc định, nó sẽ rasterise pixel nếu tâm pixel nằm trong đa giác. Nếu không có gì ở trung tâm, nó sẽ không được raster, ngay cả khi có các phần của đa giác trong giới hạn pixel. Để cho phép rasterising hoạt động theo cách bạn dự định, hãy thử tùy chọn "ALL_TOUCHED":

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

ĐÚNG! ['ALL_TOUCHED=TRUE']Mặc dù, rõ ràng là chỉ có các lớp đa giác cố định. Các lớp shapefile điểm của tôi vẫn cực kỳ hấp dẫn và hiển thị một pixel so với vị trí chúng được đặt.
Lark

Nó kết thúc như thế này . Nó nằm trong cùng một hình chiếu với những cái khác, và tôi đã hy vọng điều này bằng cách nào đó cũng sẽ sửa chữa nó một cách kỳ diệu, nhưng nó dường như chỉ bướng bỉnh đốt cháy một pixel khỏi vị trí thực sự của nó.
Lark

Điều đó chắc chắn có vẻ đáng lỗi, trong đó điểm ghi được bù bởi dx / 2 và dy / 2. Tôi tự hỏi nếu lỗi đó vẫn còn tồn tại với thân cây mới nhất.
Mike T

Nó không! Nó hoạt động trong 1.9.0. Cám ơn rất nhiều!
Lark

1
Ngoài ra còn có một công thức khá hay ở đây: gis.stackexchange.com/a/16916/9942
j08lue
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.