gdalbuildvrt와 동등한 Python


12

GDAL Python 바인딩을 사용하여 gdalbuildvrt 유틸리티와 동일한 작업을 수행하는 방법이 있습니까? 지금까지 단일 데이터 세트의 vrt를 만들고 수동으로 xml을 편집하는 것 외에는이 작업을 수행 할 수있는 방법을 찾지 못했습니다. 여러 래스터 (기본적으로 모자이크 수행)에서 vrt를 만들고 싶습니다. 순수한 파이썬을 사용하여 가능합니까? 내 다른 옵션은 하위 프로세스를 사용하여 단순히 gdalbuildvrt를 호출하는 것입니다.

답변:


10

솔직히 a 또는 에서 gdalbuildvrt 를 사용 하여이 작업을 수행하는 것이 더 쉽습니다 .subprocessos.system

파이썬을 통해이 작업을 수행하려면 수행 할 수 있습니다. GDAL Python에서 표준 데이터 세트 생성 방법을 사용하여 기본 데이터 세트 VRT를 쉽게 생성 할 수 있습니다 .

from osgeo import gdal

drv = gdal.GetDriverByName("VRT")
vrt = drv.Create("test.vrt", x_size, y_size, 0)

처음에는 밴드가없는 데이터 세트를 만들고 있습니다. VRT 의 문서에서 VRT 데이터 세트는 AddBand인수 를 허용 할 수있는 몇 가지 데이터 세트 유형 중 하나입니다 .

vrt.AddBand(gdal.GDT_Float32)
band = vrt.GetRasterBand(1)

이제 각 밴드에 대해 메타 데이터 항목을 수동으로 설정해야합니다.

simple_source = '<SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
    '<SourceBand>%i</SourceBand>' % source_band + \
    '<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Real" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
    '<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
    '<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadataItem("SimpleSource", simple_source)
band.SetMetadataItem("NoDataValue", -9999)

SetMetadatItem첫 번째는 메타 데이터 항목의 문자열이고 두 번째는 항목 자체의 두 가지 인수를 사용합니다. 즉, 메타 데이터 항목의 하위 세트를 지정할 수 없으므로 데이터 소스의 경우 전체 컨텐츠를 문자열로 설정해야합니다.

이 방법을 사용 ComplexSource하여 값의 조회 테이블을 포함하는 복잡한 소스 ( ), KernelFilteredSource임의의 크기와 모양의 커널 필터 소스 ( ) 및 마스크 밴드 ( MaskBand)를 만들 수 있습니다.


@om_henners 감사합니다-하위 프로세스를 사용하여 gdalbuildvrt를 호출했습니다. 나는 커맨드 라인보다는 파이썬에 더 익숙하기 때문에 파이썬에서 직접 할 수 있기를 바랐지만 설명대로 XML 문자열을 만드는 데 어려움을 겪을 가치는 없습니다. 그래도 나중에 필요할 경우 그렇게 할 수 있다는 것을 아는 것이 좋습니다.
Brian

지원되지 않는 기능 추가 : 파이썬과 동등한 유스 케이스를 찾았습니다. 예를 들어 vrt 파일 형식은 overviews요소를 지원 하지만 gdalbuildvrt는이 요소를 사용하지 않습니다. 파이썬에서 이것이 어떻게 추가 될 수 있는지에 대한 스텁을 제공해 주셔서 감사합니다.
matt wilkie

@om_henners 파이썬에서 input_ds 파일의 절대 경로로 drv.CreateCopy ( 'path / to / file.vrt', input_ds)하는 방법이 있습니까? relativeToVRT = "1"옵션이 있지만 VRT를 만드는 동안 어떻게 변경하거나 설정합니까?
Dmitriy Litvinov

8

GDAL 2.1부터 CLI 도구는 라이브러리 함수로 사용 가능하며 실제로 CLI 도구는 내부적으로 호출됩니다.

예를 들면 다음과 같습니다.

gdalbuildvrt -r cubic -addalpha my.vrt one.tif two.tif

다음과 같습니다.

from osgeo import gdal

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)

가능한 CLI 옵션은 직접의 매개 변수에 매핑 BuildVRTOptions 플러스 진행 콜백과 같은 몇 가지 여분을 사용할 수가있다.


이것은 특정 CLI 도구에만 해당됩니다. 예를 들어, gdaladdo를 작동 시키려고하지만 표시되지 않습니다. gdalwarp와 동일합니다. 그들이 이것들을 지원할 계획인지 아십니까? 매우 도움이 될 것입니다.
fpolig01

참조 - @ fpolig01 대부분이있다 RegenerateOverviews()Warp()API 참조 . 인수는 일반적으로 CLI 명령과 일치합니다.
rcoup

@rccoup 답장을 보내 주셔서 감사합니다. RegenerateOverviews ()가 gdaladdo와 동일합니까? 작동하는 예가 있습니까? gdaladdo -r average "D : \ image.tif"와 비슷한 작업을 수행하려고합니다.
fpolig01

@ fpolig01 이 게시물은 제안합니다BuildOverviews() (실제로 내가 찾았을 때 찾은 것입니다 RegenerateOverviews) — 시도해보십시오.
rcoup

8

@rcoup 의 대답은 다음과 같이 수정하면 나에게 효과적입니다 .

from osgeo import gdal 

vrt_options = gdal.BuildVRTOptions(resampleAlg='cubic', addAlpha=True)
my_vrt = gdal.BuildVRT('my.vrt', ['one.tif', 'two.tif'], options=vrt_options)
my_vrt = None

그렇지 않으면 파일이 디스크에 기록되지 않습니다.


JensL 감사합니다! 디스크에 쓰는 my_vrt = None의 직관을 설명 할 수 있습니까? 정말 이상한 것 같다
mmann1123

3
@ mmann1123 : 그렇지 않으면 작동하지 않으며 GDAL API 자습서에서 다음과 같이 말했습니다. "CreateCopy () 메서드는 쓰기 가능한 데이터 세트를 반환하며 디스크에 데이터 세트 쓰기 및 플러시를 완료하려면 올바르게 닫아야합니다. Python의 경우 "dst_ds"가 범위를 벗어나면 자동으로 발생합니다. " closing파이썬 이 없기 vrt때문에에 할당하여 범위를 벗어나야 합니다 None.
JensL

실제로, 그들은이 문제를 방금 수정했습니다 ( osgeo-org.1560.x6.nabble.com/… 참조 )
umbe1987
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.