Python ที่เทียบเท่ากับ gdalbuildvrt


12

มีวิธีในการทำงานเช่นเดียวกับยูทิลิตี gdalbuildvrt โดยใช้การผูก GDAL Python หรือไม่ จนถึงตอนนี้ฉันยังไม่พบวิธีการอื่นนอกเหนือจากการสร้าง vrt ของชุดข้อมูลเดียวและแก้ไข xml ด้วยตนเอง ฉันต้องการสร้าง vrt จากหลายภาพแรสเตอร์ เป็นไปได้ไหมถ้าใช้ Python แท้? ตัวเลือกอื่น ๆ ของฉันคือใช้ subprocess เพื่อเรียก gdalbuildvrt

คำตอบ:


10

สุจริตมันง่ายต่อการทำเช่นนี้โดยใช้gdalbuildvrtในหรือsubprocessos.system

หากคุณต้องการทำสิ่งนี้ผ่าน Python ก็สามารถทำได้ ใช้วิธีการสร้างชุดข้อมูลมาตรฐานภายใน GDAL หลามเราสามารถสร้างชุดข้อมูลฐานVRT

from osgeo import gdal

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

โปรดทราบว่าเรากำลังสร้างชุดข้อมูลโดยไม่มีแบนด์ในตอนแรก จากเอกสารในVRTsว่าชุดข้อมูล 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 ฉันมีประสบการณ์กับ Python มากกว่า command line ดังนั้นฉันหวังว่าฉันจะทำสิ่งนี้ได้โดยตรงใน Python แต่มันก็ไม่คุ้มกับปัญหาที่จะสับสนกับการสร้างสตริง XML ตามที่คุณอธิบาย เป็นเรื่องที่ดีที่จะรู้ว่าฉันสามารถทำได้หากต้องการในอนาคต
ไบรอัน

เพิ่งพบกรณีใช้งานเพื่อให้เทียบเท่างูหลาม: เพิ่มคุณสมบัติที่ไม่รองรับ ตัวอย่างเช่นรูปแบบไฟล์ vrt รองรับoverviewsองค์ประกอบ แต่ gdalbuildvrt ไม่ได้ใช้ ขอบคุณที่ให้ต้นขั้วว่าจะเพิ่มสิ่งนี้อย่างไรในไพ ธ อน
matt wilkie

@om_henners มีวิธีใดในการ drv.CreateCopy ('path / to / file.vrt', input_ds) พร้อมพา ธ สัมบูรณ์ไปยังไฟล์ input_ds ในไพ ธ อน? มีญาติToVRT = "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 ใช้ได้ map โดยตรงกับพารามิเตอร์ของBuildVRTOptionsบวกมีความพิเศษบางอย่างเช่นความคืบหน้า callbacks ใช้ได้


สิ่งนี้ดูเหมือนจะเป็นเครื่องมือ CLI บางตัวเท่านั้น ตัวอย่างเช่นฉันกำลังพยายามให้ gdaladdo ทำงาน แต่มันไม่ปรากฏขึ้น เช่นเดียวกับ gdalwarp คุณรู้หรือไม่ว่าพวกเขาวางแผนที่จะสนับสนุนสิ่งเหล่านี้เช่นกัน? จะมีประโยชน์มาก
fpolig01

@ fpolig01 ที่สุดของพวกเขามี - ดูRegenerateOverviews()และWarp()ในการอ้างอิง API อาร์กิวเมนต์มักตรงกับคำสั่ง CLI
rcoup

@rccoup ขอบคุณสำหรับการตอบกลับ RegenerateOverviews () เหมือนกับ gdaladdo หรือไม่ คุณมีตัวอย่างของมันทำงานหรือไม่ ฉันพยายามทำสิ่งที่คล้ายกับ gdaladdo -r โดยเฉลี่ย "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 Tutorialกล่าวว่า: "โปรดทราบว่าเมธอด 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.