Est-il possible dutiliser une API gdal pour appeler gdal_translate à partir du code Python? Je ne veux pas dire simplement exécuter gdal_translate.exe à partir du système de fichiers, mais plutôt lappeler en code pour ne pas avoir besoin de connaître le répertoire exact de lexécutable gdal_translate?

Commentaires

  • Oui, à partir de gdal-2.1. Cette réponse doit être acceptée comme correcte.

Réponse

Depuis GDAL 2.1 (plus dinfos ici ), les utilitaires GDAL et OGR peuvent être utilisés comme fonctions de bibliothèque. Par exemple:

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 

Commentaires

  • Toutes les options gdal.Translate() les prises sont répertoriées ici: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' jai essayé dutiliser ceci et je nai ' aucune erreur mais le fichier de sortie nest pas ' t créé. Des idées pourquoi?
  • également aucun fichier de sortie et aucune erreur. Les chemins de sortie et les paramètres projWin sont corrects.

Réponse

Voir le GDAL Tutoriel 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 

Si vous voulez plus de contrôle de sortie, comme le redimensionnement, le sous-ensemble, etc … utilisez un VRT en entrée, voici comment gdal_translate le fait en interne.

Commentaires

  • malheureusement cela ninclut ' la reporjection, nest-ce pas?
  • @butcher – non. Parce que la question ne mentionnait pas de reprojection. Bien sûr, vous pouvez reprojeter des rasters avec lAPI gdal python. Si vous voulez savoir comment faire, posez une nouvelle question.
  • Je lai déjà fait ici: gis.stackexchange.com/questions/103874/… mais cela a été marqué comme un doublon 🙁
  • @butcher – qui a été fermé comme un double de cette question. Votre question porte également sur gdal_translate . Savez-vous que gdal_translate ne reprojete pas? Si vous souhaitez reprojeter, utilisez gdalwarp ou la méthode API gdal python – gdal.ReprojectImage

Réponse

Oui, vous pouvez appeler les utilitaires GDAL depuis Python. Il y a de très petites différences dans lapproche selon que lutilitaire est un exe à part entière ou également un morceau de code python. Dans les deux cas, vous devez utiliser le module sous-processus :

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) 

Vous remarquerez que jajoute des guillemets échappés autour de mes chemins. Cest parce que, sous Windows, jai eu tr double avec des chemins, en particulier ceux avec des espaces ou où lun des caractères « \ » crée un autre caractère échappé accidentellement. Donc, je préserve juste le chemin approprié dans aspec pour ainsi dire.

Si vous utilisez lun des utilitaires python, faites la même chose sauf que votre exe au début de la chaîne de commande du sous-processus est maintenant  » C: \ python32 \ python.exe « (ou quelle que soit la version que vous avez) et votre deuxième élément est lutilitaire python que vous souhaitez utiliser.

De toute évidence, vous pouvez également parcourir votre système de fichiers plutôt que dutiliser hard- constantes codées, mais ce nest quun exemple.

EDIT – Généralisation pour les plugins QGIS
QGIS crée / modifie un certain nombre de variables denvironnement au démarrage. Ainsi, vous pouvez créer des variables de chemin généralisées vers les bibliothèques / utilitaires GDAL en utilisant ces derniers (voir Paramètres-> Options-> Système) au lieu des chemins codés en dur dans lexemple ci-dessus.

Commentaires

  • Je peux donc ' faire cela? import gdal_translate puis appelez le .main ()?
  • Non – cela ne fonctionnera pas '. gdal_translate nest pas un package Python, donc python ne ' nen sait rien. Vous obtiendrez une erreur indiquant " ImportError No Module nommé gdal_translate ". Utilisez le module de sous-processus pour lappeler à la place.
  • ok une question similaire avec lutilisation de gdal_retile.py .. Jai essayé de faire ce qui suit: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid – optfile files.txt ") mais jobtiens lerreur: Option de commande non reconnue: – Une idée de pourquoi?
  • Désormais, je peux ' Je ne vois pas le problème, sauf que je suppose quil pourrait ne pas aimer le commutateur ' –optfile '. Ce dernier nest pas documenté.
  • @MappaGnosis Existe-t-il une alternative à gdal_translate dans la bibliothèque Python gdal?

Réponse

Je fais cela avec diverses commandes gdal en utilisant os.system que vous pouvez utiliser pour appeler des fonctions simplement à partir de la ligne de commande:

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

Cest également décrit dans la conférence 7 ici: http://www.gis.usu.edu/~chrisg/python/2009/

Commentaires

  • Les commandes GDAL sont disponibles sous forme de fonctions python dans GDAL 2.1 à RFC 59.1 . subprocess.call est également plus sûr que os.system.
  • Quelquun doit rédiger un bon exemple de ces fonctions Python; jai lutté avec gdal.Warp() pendant quelques heures pour obtenir correctement un PG: source de données en tant que cutlineDSName pour conduire le cutlineSQL. (Je sais, nest-ce pas? Quelques heures en train de travailler quelque chose ? Lhorreur! < / kidding >). Cela a finalement fonctionné, et il semble être nettement plus rapide que os.system() ou subprocess.call(). Il ' fait environ 2 millions de coupes, donc jai gagné ' si cela ' est en fait plus rapide jusquà ce soir … mais cela ' fonctionne parfaitement.

Réponse

Voici un code rapide pour quiconque souhaite enregistrer des bandes dun TIF multi-bande composite dans des fichiers individuels à laide de GDAL Translate en 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 

Cela pourrait être utile pour un traitement ultérieur (par exemple en utilisant Rasterio, comme ici ).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *