GDAL RasterizeLayer가 모든 다각형을 래스터에 굽지 않습니까?


12

GDAL의 RasterizeLayer를 사용하여 모양 파일을 래스터에 구우려고합니다. 특정 픽셀 크기가 주어지면 다른 모양 파일에서 관심 영역 래스터를 미리 만듭니다. 그런 다음이 AOI는 모든 후속 래스터 화 (동일한 수의 열 및 행, 동일한 투영 및 지오 변환)의 기반이됩니다.

그러나 동일한 픽셀 크기와 투영을 기반으로 도형을 자체 래스터로 구울 때 문제가 발생합니다. 아래 링크 (이미지를 게시 할 충분한 담당자가 없음)는 원래 모양 파일을 황갈색으로 표시하고 RasterizeLayer가 데이터를 구운 어두운 분홍색을 표시합니다. 밝은 분홍색은 어두운 분홍색 래스터 데이터에 대한 데이터 값이 아닙니다. 회색은 쉐이프 파일 레코딩이 완료된 AOI입니다.

shapefile 다각형의 범위를 감안할 때 하단 두 모서리와 표시되는 데이터 아래의 두 픽셀에 레코딩 값이 표시됩니다. 그러나 이것은 사실이 아닙니다.

문제가 발생한 래스터 번 이미지

다음은 이러한 코드를 생성하는 데 사용한 코드입니다. 모든 모양은 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'에 대한 링크를 제공 할 수 있습니까? 나는 내 끝에 다시 만들 수 있는지 확인하고 싶습니다.
Rich

답변:


10

나는 이번 주에 GDALRasterizeLayers 와 함께 놀고 있었고 그것이하는 일에 대해 아주 잘 알고 있습니다. 기본적으로 픽셀 중심이 다각형 내에 있으면 픽셀이 래스터 화됩니다. 중앙에 아무것도 없으면 픽셀 제한 내에 다각형의 일부가 있어도 래스터 화되지 않습니다. 래스터 화가 원하는 방식으로 작동하게하려면 "ALL_TOUCHED"옵션을 시도하십시오.

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

예! ['ALL_TOUCHED=TRUE']불행히도 다각형 레이어 만 고정 된 것은 분명 합니다. 내 포인트 셰이프 파일 레이어는 여전히 엉뚱하고 배치 된 위치에서 1 픽셀 위에 표시됩니다.
Lark

이것은 이렇게 보입니다 . 그것은 다른 것과 같은 투영에 있으며, 이것이 어떻게 든 마술처럼 그것을 고치기를 바랐지만 실제로는 그것이 위치한 곳에서 한 픽셀을 완고하게 태우는 것처럼 보입니다.
Lark

타기 지점이 dx / 2와 dy / 2로 상쇄되는 버그가 있습니다. 그 버그가 여전히 최신 트렁크로 지속되는지 궁금합니다.
Mike T

그렇지 않습니다! 1.9.0에서 작동합니다. 정말 고마워!
Lark

1
아주 좋은 조리법도 여기에 있습니다 : gis.stackexchange.com/a/16916/9942
j08lue은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.