เป็นไปได้ไหมที่จะใช้ gdal API โทรgdal_translate
จากรหัส Python? ฉันไม่ได้หมายถึงเพียงแค่เรียกใช้ gdal_translate.exe จากระบบไฟล์ แต่จะเรียกมันว่าอย่างใดในรหัสดังนั้นฉันไม่จำเป็นต้องรู้ไดเรกทอรีที่แน่นอนว่าไฟล์ gdal_translate นั้นอยู่ในอะไร
เป็นไปได้ไหมที่จะใช้ gdal API โทรgdal_translate
จากรหัส Python? ฉันไม่ได้หมายถึงเพียงแค่เรียกใช้ gdal_translate.exe จากระบบไฟล์ แต่จะเรียกมันว่าอย่างใดในรหัสดังนั้นฉันไม่จำเป็นต้องรู้ไดเรกทอรีที่แน่นอนว่าไฟล์ gdal_translate นั้นอยู่ในอะไร
คำตอบ:
ตั้งแต่ GDAL 2.1 (ข้อมูลเพิ่มเติมที่นี่ ) สามารถใช้ยูทิลิตี้ GDAL และ OGR เป็นฟังก์ชันห้องสมุดได้ ตัวอย่างเช่น
from osgeo import gdal
ds = gdal.Open('input.tif')
ds = gdal.Translate('output.tif', ds, projWin = [-75.3, 5.5, -73.5, 3.7])
ds = None
gdal.Translate()
อยู่ในรายการมีอยู่ที่นี่: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
ดู GDAL API การสอน
#Import gdal
from osgeo import gdal
#Open existing dataset
src_ds = gdal.Open( src_filename )
#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )
#Output to new format
dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )
#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None
หากคุณต้องการการควบคุมเอาต์พุตเพิ่มเติมเช่นการปรับขนาดการย่อย ฯลฯ ... ใช้VRTเป็นอินพุตนี่คือวิธีที่ gdal_translate ทำงานภายใน
ใช่คุณสามารถโทรหา GDAL Utilities ได้จากใน Python มีความแตกต่างเล็กน้อยในวิธีการขึ้นอยู่กับว่าอรรถประโยชน์เป็น exe ในสิทธิของตนเองหรือชิ้นส่วนของรหัสหลาม ไม่ว่าจะด้วยวิธีใดคุณต้องใช้โมดูลย่อย :
import subprocess
# constants
gdalTranslate = r'C:\Program Files\GDAL\gdal_translate.exe'
src = r"C:\somefolder\somefile.tif"
dst = r"C:\someotherfolder\myresul.tif"
cmd = "-ot float32 -outsize 25 25" # just for example!
# see note below
def youCanQuoteMe(item):
return "\"" + item + "\""
fullCmd = ' '.join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)])
subprocess.popen(fullCmd)
คุณจะสังเกตเห็นว่าฉันเพิ่มเครื่องหมายคำพูดที่ใช้ Escape รอบ ๆ เส้นทางของฉัน นี่เป็นเพราะบน Windows ฉันมีปัญหาเกี่ยวกับเส้นทางโดยเฉพาะอย่างยิ่งที่มีช่องว่างหรือที่หนึ่งในตัวละคร '\' ทำให้ตัวละครอื่นที่หลบหนีโดยไม่ตั้งใจ ดังนั้นฉันเพียงแค่รักษาเส้นทางที่เหมาะสมใน aspec เหมือนเดิม
หากคุณใช้ยูทิลิตี้หลามเพียงแค่ทำสิ่งเดียวกันยกเว้น exe ของคุณที่จุดเริ่มต้นของสตริงคำสั่ง subprocess ตอนนี้คือ "C: \ python32 \ python.exe" (หรือเวอร์ชันใดก็ตามที่คุณมี) และองค์ประกอบที่สองของคุณคือ ยูทิลิตี้หลามที่คุณต้องการใช้
เห็นได้ชัดว่าคุณสามารถทำซ้ำระบบไฟล์ของคุณแทนที่จะใช้ค่าคงที่แบบตายตัว แต่นี่เป็นเพียงตัวอย่าง
แก้ไข - การสรุปสำหรับปลั๊กอิน
QGIS QGIS สร้าง / แก้ไขตัวแปรสภาพแวดล้อมจำนวนหนึ่งเมื่อเริ่มต้น ดังนั้นคุณสามารถสร้างตัวแปรพา ธ ทั่วไปไปยังไลบรารี / ยูทิลิตี้ของ GDAL โดยใช้สิ่งเหล่านี้ (ดูการตั้งค่า> ตัวเลือก> ระบบ) แทนเส้นทางฮาร์ดโค้ดในตัวอย่างด้านบน
ฉันทำสิ่งนี้กับคำสั่ง gdal ต่างๆโดยใช้ os.system ซึ่งคุณสามารถใช้เพื่อเรียกใช้ฟังก์ชั่นเช่นเดียวกับจากบรรทัดคำสั่ง:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
อธิบายไว้ในบทบรรยายที่ 7 ที่นี่: http://www.gis.usu.edu/~chrisg/python/2009/
subprocess.call
os.system
gdal.Warp()
สองสามชั่วโมงเพื่อให้ถูกต้องได้รับPG:
แหล่งข้อมูลเป็นที่จะขับรถcutlineDSName
cutlineSQL
(ฉันรู้ใช่มั้ยสองสามชั่วโมง จริง ๆ แล้วทำอะไรออกมาได้บ้างสยองขวัญ! </kidding>) ทำให้มันใช้งานได้ในที่สุดและดูเหมือนว่าจะเร็วกว่าos.system()
หรือsubprocess.call()
มาก มันกำลังทำ ~ 2 ล้าน cutlines ดังนั้นฉันจะไม่รู้ว่าจริง ๆ แล้วมันเร็วกว่านี้สักพักหนึ่งคืนนี้ ... แต่มันก็ใช้ได้จริง
นี่คือรหัสด่วนสำหรับทุกคนที่ต้องการบันทึกแบนด์จาก TIF หลายหลายคอมโพสิตไปยังไฟล์แต่ละไฟล์โดยใช้ GDAL Translate ใน Python
import gdal
in_path = 'C:/GIS/Sample.tif' #input composite raster
out_path = 'C:/GIS/Output/' #output directory for individual bands as files
#Open existing raster ds
src_ds = gdal.Open(in_path)
for i in range(1,src_ds.RasterCount +1): #Save bands as individual files
out_ds = gdal.Translate(out_path + 'band' + str(i) + '.tiff', src_ds, format='GTiff', bandList=[i])
out_ds=None
สิ่งนี้อาจมีประโยชน์สำหรับการประมวลผลเพิ่มเติม (เช่นใช้ Rasterio เช่นที่นี่ )