วิธีการโทร gdal_translate จากรหัสหลาม?


40

เป็นไปได้ไหมที่จะใช้ gdal API โทรgdal_translateจากรหัส Python? ฉันไม่ได้หมายถึงเพียงแค่เรียกใช้ gdal_translate.exe จากระบบไฟล์ แต่จะเรียกมันว่าอย่างใดในรหัสดังนั้นฉันไม่จำเป็นต้องรู้ไดเรกทอรีที่แน่นอนว่าไฟล์ gdal_translate นั้นอยู่ในอะไร


4
ใช่ตั้งแต่ gdal-2.1 คำตอบนี้ควรได้รับการยอมรับว่าถูกต้อง
Pete

คำตอบ:


27

ตั้งแต่ 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

2
ตัวเลือกทั้งหมดที่gdal.Translate()อยู่ในรายการมีอยู่ที่นี่: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
Marcelo Villa

23

ดู 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 ทำงานภายใน


น่าเสียดายที่นี่ไม่รวมถึงการถูกปฏิเสธ
Riccardo

1
@butcher - ไม่ เพราะคำถามไม่ได้พูดถึงการคัดค้าน แน่นอนว่าคุณสามารถปฏิเสธ rasters ได้ด้วย gdal python API หากคุณต้องการทราบวิธีถามคำถามใหม่
2856

ฉันทำไปแล้วที่นี่: gis.stackexchange.com/questions/103874/ …แต่ thius ถูกทำเครื่องหมายว่าซ้ำ :-(
Riccardo

2
@butcher - ถูกปิดเหมือนซ้ำกับคำถามนี้ คำถามของคุณยังถามเกี่ยวกับ gdal_translate คุณทราบหรือไม่ว่า gdal_translate ไม่ได้ปฏิเสธ หากคุณต้องการที่จะปฏิเสธให้ใช้ gdalwarp หรือวิธี gdal python API - gdal.ReprojectImage
2856

10

ใช่คุณสามารถโทรหา 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_translate แล้วเรียก. main ()?
Katie E.

ไม่ - นั่นไม่ได้ผล gdal_translate ไม่ใช่แพ็คเกจ Python ดังนั้น python จะไม่รู้อะไรเลยเกี่ยวกับมัน คุณจะได้รับข้อผิดพลาดว่า "ImportError No Module ชื่อ gdal_translate" ใช้โมดูลย่อยเพื่อเรียกแทน
MappaGnosis

ตกลงหนึ่งคำถามที่คุ้นเคยกับการใช้ gdal_retile.py .. ฉันพยายามทำสิ่งต่อไปนี้: import gdal_retile gdal_retile.main ("- v -r bilinear -levels 4 -ps 2048 2048 -co \" tiled = YES \ "-targetDir cablepyramid - -optfile files.txt ") แต่ฉันได้รับข้อผิดพลาด: ตัวเลือกคำสั่งที่ไม่รู้จัก: - มีความคิดว่าทำไม?
Katie E.

Offhand ฉันมองไม่เห็นปัญหายกเว้นว่าฉันเดาว่ามันอาจจะไม่เหมือนกับสวิตช์ '--optfile' หลังไม่มีเอกสาร
MappaGnosis

@MappaGnosis มีทางเลือกของ gdal_translate ในห้องสมุด Python gdal ไหม?
multigoodverse

7

ฉันทำสิ่งนี้กับคำสั่ง gdal ต่างๆโดยใช้ os.system ซึ่งคุณสามารถใช้เพื่อเรียกใช้ฟังก์ชั่นเช่นเดียวกับจากบรรทัดคำสั่ง:

os.system("gdal_translate -of GTiff " + sourcefile + " " +  destinationfile)

อธิบายไว้ในบทบรรยายที่ 7 ที่นี่: http://www.gis.usu.edu/~chrisg/python/2009/


คำสั่ง GDAL มีอยู่เป็นฟังก์ชั่นหลามใน GDAL 2.1 ผ่านRFC 59.1 นอกจากนี้ยังมีความปลอดภัยกว่าsubprocess.call os.system
Dmitri Chubarov

1
บางคนจำเป็นต้องเขียนตัวอย่างที่ดีของฟังก์ชัน Python เหล่านั้น ผมปล้ำกับgdal.Warp()สองสามชั่วโมงเพื่อให้ถูกต้องได้รับPG:แหล่งข้อมูลเป็นที่จะขับรถcutlineDSName cutlineSQL(ฉันรู้ใช่มั้ยสองสามชั่วโมง จริง ๆ แล้วทำอะไรออกมาได้บ้างสยองขวัญ! </kidding>) ทำให้มันใช้งานได้ในที่สุดและดูเหมือนว่าจะเร็วกว่าos.system()หรือsubprocess.call()มาก มันกำลังทำ ~ 2 ล้าน cutlines ดังนั้นฉันจะไม่รู้ว่าจริง ๆ แล้วมันเร็วกว่านี้สักพักหนึ่งคืนนี้ ... แต่มันก็ใช้ได้จริง
GT

3

นี่คือรหัสด่วนสำหรับทุกคนที่ต้องการบันทึกแบนด์จาก 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 เช่นที่นี่ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.