답변:
솔직히 a 또는 에서 gdalbuildvrt 를 사용 하여이 작업을 수행하는 것이 더 쉽습니다 .subprocess
os.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
)를 만들 수 있습니다.
overviews
요소를 지원 하지만 gdalbuildvrt는이 요소를 사용하지 않습니다. 파이썬에서 이것이 어떻게 추가 될 수 있는지에 대한 스텁을 제공해 주셔서 감사합니다.
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 플러스 진행 콜백과 같은 몇 가지 여분을 사용할 수가있다.
BuildOverviews()
(실제로 내가 찾았을 때 찾은 것입니다 RegenerateOverviews
) — 시도해보십시오.
@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
그렇지 않으면 파일이 디스크에 기록되지 않습니다.
closing
파이썬 이 없기 vrt
때문에에 할당하여 범위를 벗어나야 합니다 None
.