GDAL RasterizeLayerはすべてのポリゴンをラスターに焼き付けませんか?


12

GDALのRasterizeLayerを使用して、シェープファイルをラスターに焼き付けようとしています。特定のピクセルサイズを指定して、異なるシェープファイルから対象エリアラスタを事前に作成します。このAOIは、その後のすべてのラスター化(同じ数の列と行、同じ投影と地理変換)のベースとして機能します。

ただし、同じピクセルサイズと投影に基づいて、シェイプを独自のラスターに書き込むときに問題が発生します。下のリンク(画像を投稿するのに十分な担当者がいない)は、元のシェープファイルを黄褐色で示し、RasterizeLayerがデータを書き込んだ場所に濃いピンク色を示しています。淡いピンクは、濃いピンクのラスターデータのnodata値です。灰色は、シェープファイルの書き込みが完了したAOIに基づいています。

シェープファイルポリゴンの範囲を考えると、表示されるデータの下にある2つのピクセルだけでなく、下の2つの角にも書き込み値が表示されると予想されます。ただし、明らかにそうではありません。

問題のあるラスター書き込みのイメージ

以下は、これらを生成するために使用したコードです。すべての形状はQGISを使用して作成され、すべて同じ投影で作成されました。(表示されている写真のグリッディングは、使用しているピクセルサイズを示すためのものであることに注意してください。)

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

これはGDALのバグですか、それともRasterizeLayerは、指定されたピクセル領域内のポリゴンの有無以外の何かに基づいてデータを書き込みますか?

私が使用していたファイルはここにあります


「activity_3.shp」および「AOI_Raster.tif」へのリンクを提供できますか?私は自分の側で再作成できるかどうかを見たいです。
リッチ

回答:


10

私は今週GDALRasterizeLayersで遊んでいますが、それが何をしているのかについてかなり良い考えを持っています。デフォルトでは、ピクセルの中心がポリゴン内にある場合、ピクセルをラスタライズします。中央に何もない場合、ピクセルの制限内にポリゴンの一部がある場合でも、ラスタライズされません。ラスタライズを意図したとおりに機能させるには、「ALL_TOUCHED」オプションを試してください。

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

はい!['ALL_TOUCHED=TRUE']残念ながら、明らかにポリゴンレイヤーのみが固定されているようです。私のポイントシェープファイルレイヤーはまだ非常に不安定で、配置された場所から1ピクセル上に表示されます。
ラーク

最終的にはこのように見えます。これは他の投影法と同じ投影法であり、これが何らかの形で魔法のように修正されることを望んでいましたが、実際に配置されている場所から頑固に1ピクセル焼失するようです。
ラーク

それは確かにバグに値するように見えます。そこでは、燃焼点がdx / 2とdy / 2によって相殺されます。そのバグは最新のトランクでもまだ続くのだろうか。
マイクT

ありません!1.9.0で動作します。本当にありがとう!
ラーク

1
ここにもかなり良いレシピがあります:gis.stackexchange.com/a/16916/9942
j08lue
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.