Як зателефонувати gdal_translate з коду Python?


40

Чи можна використовувати API gdal для виклику gdal_translateз коду Python? Я не маю на увазі просто виконати gdal_translate.exe з файлової системи, а скоріше називати його якось у коді, тому мені не потрібно знати точний каталог, у якому виконується виконуваний файл gdal_translate?


4
Так, станом на gdal-2.1. Цю відповідь слід сприймати як правильну.
Піт

Відповіді:


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

Дивіться посібник з API GDAL .

#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 це робить всередині.


на жаль, це не включає репортаж, чи не так?
Ріккардо

1
@butcher - ні. Тому що питання не згадувало про перепроектування. Звичайно, ви можете перепрофілювати растри за допомогою API gdal python. Якщо ви хочете знати як, задайте нове запитання.
user2856

Я це зробив уже тут: gis.stackexchange.com/questions/103874/…, але тій був позначений як дублікат :-(
Ріккардо

2
@butcher - це було закрито як дублікат цього питання. Ваше запитання також задає питання про gdal_translate. Чи знаєте ви, що gdal_translate не відхиляє? Якщо ви хочете повторно спроектувати, використовуйте gdalwarp або метод API gdal python - gdal.ReprojectImage
user2856

10

Так, ви можете викликати утиліти GDAL з Python. Існують дуже незначні відмінності в підході, залежно від того, чи утиліта є exe сама по собі або також фрагмент коду python. У будь-якому випадку, хоча вам потрібно використовувати модуль підпроцесу :

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)

Ви помітите, що я додаю втечені лапки навколо моїх шляхів. Це тому, що в Windows у мене виникли проблеми з шляхами, особливо з пробілами або там, де один із символів '\' робить інший випадково втечений символ. Отже, я просто зберігаю правильний шлях у аспекті як би там не було.

Якщо ви використовуєте одну з утиліт Python, просто зробіть те саме, крім вашого exe на початку командного рядка підпроцеси тепер "C: \ python32 \ python.exe" (або будь-якої версії у вас є), і ваш другий елемент є утиліта python, яку ви хочете використовувати.

Очевидно, ви також можете переглядати файлову систему, а не використовувати жорстко закодовані константи, але це лише приклад.

EDIT - Узагальнення плагінів
QGIS QGIS створює / модифікує ряд змінних середовища при запуску. Отже, ви можете побудувати узагальнені змінні шляху до бібліотек / утиліт GDAL, використовуючи ці (див. Налаштування-> Параметри-> Система) замість жорстко кодованих шляхів у наведеному вище прикладі.


Тож я не можу цього зробити? імпортувати gdal_translate, а потім викликати .main ()?
Кеті Е.

Ні - це не спрацює. gdal_translate не є пакетом Python, тому python нічого про це не буде знати. Ви отримаєте помилку із записом "ImportError No Module з іменем gdal_translate". Використовуйте модуль підпроцесора, щоб викликати його замість.
MappaGnosis

добре одне подібне запитання з використанням gdal_retile.py .. Я намагався зробити наступне: імпортувати gdal_retile gdal_retile.main ("- v -r bilinear -levels 4 -ps 2048 2048 -co \" tiled = YES \ "-targetDir cablepyramid - -optfile files.txt "), але я отримую помилку: Нерозпізнаний варіант команди: - Будь-яка ідея, чому?
Кеті Е.

Я не бачу проблеми, крім моєї здогадки, що це може не сподобатися перемикачу "--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.
Дмитро Чубаров

1
Комусь потрібно написати хороший приклад цих функцій Python; Я боровся gdal.Warp()протягом декількох годин, щоб правильно отримати PG:джерело даних, як cutlineDSNameкерувати cutlineSQL. (Я знаю, правда? Пару годин насправді щось відпрацьовували ? Жах! </kidding>). Зрозуміло, що це працює в кінцевому рахунку, і, здається, це значно швидше, ніж os.system()або subprocess.call(). Це ~ 2 мільйони скорочень, тому я не знаю, чи дійсно швидше до деякого часу сьогодні ввечері ... але це працює абсолютно правильно.
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, як тут ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.