Este posibil să utilizați un API gdal pentru a apela gdal_translate din codul Python? Nu mă refer la simpla executare a gdal_translate.exe din sistemul de fișiere, ci mai degrabă o numesc cumva în cod, așa că nu trebuie să știu directorul exact în care se află executabilul gdal_translate?

Comentarii

  • Da, începând cu gdal-2.1. Acest răspuns ar trebui acceptat ca fiind corect.

Răspuns

Întrucât GDAL 2.1 (mai multe informații aici ), utilitățile GDAL și OGR pot fi utilizate ca funcții de bibliotecă. De exemplu:

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 

Comentarii

  • Toate opțiunile pe care gdal.Translate() capturile sunt listate aici: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' am încercat să folosesc acest lucru și nu ' nu primiți erori, dar fișierul de ieșire nu este ' t creat. Aveți idei de ce?
  • , de asemenea, nu obțineți fișier de ieșire și nici erori. Căile de ieșire și parametrii projWin sunt corecți.

Răspuns

Consultați GDAL Tutorial 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 

Dacă doriți mai mult control de ieșire, cum ar fi redimensionarea, subsetarea, etc … utilizați un VRT ca intrare, așa face gdal_translate intern.

Comentarii

  • din păcate, acest lucru nu ' nu include reporjection, nu-i așa?
  • @butcher – nr. Pentru că întrebarea nu menționa reproiecția. Desigur, puteți reproiecta rasterele cu API-ul gdal python. Dacă doriți să știți cum, puneți o întrebare nouă.
  • Am făcut-o deja aici: gis.stackexchange.com/questions/103874/… , dar acest lucru a fost marcat ca duplicat 🙁
  • @butcher – care a fost închis ca duplicat al acestei întrebări. . Știți că gdal_translate nu reproiectează? Dacă doriți să reproiectați, utilizați gdalwarp sau metoda API gdal python – gdal.ReprojectImage

Răspuns

Da, puteți apela utilitățile GDAL din Python. Există diferențe foarte mici în abordare, în funcție de utilitatea un exe în sine sau, de asemenea, o bucată de cod python. În orice caz, trebuie să utilizați modulul subproces :

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) 

Veți observa că am adăugat ghilimele evadate în jurul căilor mele. Acest lucru se datorează faptului că, pe Windows, am avut tr cu căi, mai ales cu spații sau în care unul dintre personajele „\” face un alt personaj accidental scăpat. Deci, păstrez calea corectă în aspec.

Dacă utilizați unul dintre utilitarele python, faceți același lucru, cu excepția exe-ului dvs. la începutul șirului de comandă subproces acum C: \ python32 \ python.exe „(sau oricare versiune aveți) și al doilea element este utilitarul python pe care doriți să îl utilizați.

Evident, puteți, de asemenea, să iterați peste sistemul de fișiere decât să utilizați constante codate, dar acesta este doar un exemplu.

EDIT – Generalizare pentru pluginurile QGIS
QGIS creează / modifică o serie de variabile de mediu la pornire. Deci, puteți construi variabile de cale generalizate către bibliotecile / utilitățile GDAL folosind acestea (consultați Setări-> Opțiuni-> Sistem) în loc de căile codate în exemplul de mai sus.

Comentarii

  • Deci nu pot ' să fac asta? importați gdal_translate și apoi apelați .main ()?
  • Nu – nu a funcționat '. gdal_translate nu este un pachet Python, așa că python nu a știut ' să nu știe nimic despre el. Veți primi o eroare spunând " ImportError Niciun modul numit gdal_translate ". Folosiți modulul de subproces pentru a-l apela.
  • ok o întrebări similare cu utilizarea gdal_retile.py .. Am încercat să fac următoarele: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid – optfile files.txt ") dar primesc eroarea: opțiune de comandă nerecunoscută: – Ai vreo idee de ce?
  • Offhand pot ' nu văd problema, cu excepția presupunerii mele este că s-ar putea să nu-i placă comutatorul ' –optfile '. Acesta din urmă nu este documentat.
  • @MappaGnosis Există o alternativă a gdal_translate în biblioteca Python gdal?

Răspuns

Fac asta cu diverse comenzi gdal folosind os.system pe care îl puteți utiliza pentru a apela funcții doar din linia de comandă:

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

Este descris și în cursul 7 aici: http://www.gis.usu.edu/~chrisg/python/2009/

Comentarii

  • Comenzile GDAL sunt disponibile ca funcții python în GDAL 2.1 prin RFC 59.1 . De asemenea, subprocess.call este mai sigur decât os.system.
  • Cineva trebuie să scrie un bun exemplu al acelor funcții Python; m-am luptat cu gdal.Warp() timp de câteva ore pentru a obține corect un PG: sursă de date ca cutlineDSName pentru a conduce cutlineSQL. (Știu, nu? Câteva ore De fapt, rezolvați ceva ? Groaza! < / kidding >). A funcționat în cele din urmă și pare a fi semnificativ mai rapid decât os.system() sau subprocess.call(). ' face ~ 2 milioane de linii, așa că nu am știut dacă ' s de fapt mai repede până ceva timp în seara asta … dar ' funcționează exact corect. h2> Răspuns

    Iată un cod rapid pentru oricine dorește să salveze benzile dintr-un TIF compozit cu mai multe benzi în fișiere individuale folosind GDAL Translate în 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 

    Acest lucru ar putea fi util pentru procesarea ulterioară (de exemplu, folosind Rasterio, cum ar fi aici ).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *