Ist es möglich, eine gdal-API zu verwenden, um gdal_translate aus Python-Code aufzurufen? Ich meine nicht einfach, die Datei gdal_translate.exe aus dem Dateisystem auszuführen, sondern sie irgendwie im Code aufzurufen, damit ich nicht genau wissen muss, in welchem Verzeichnis sich die ausführbare Datei gdal_translate befindet?

Kommentare

Antwort

Seit GDAL 2.1 (weitere Informationen hier ) können GDAL- und OGR-Dienstprogramme als Bibliotheksfunktionen verwendet werden. Zum Beispiel:

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 

Kommentare

  • Alle Optionen, die gdal.Translate() Takes sind hier aufgelistet: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' habe versucht, dies zu verwenden, und ' erhält keine Fehler, aber die Ausgabedatei ist nicht ' t erstellt. Irgendwelche Ideen warum?
  • auch keine Ausgabedatei und keine Fehler bekommen. Ausgabepfade und projWin-Parameter sind korrekt.

Antwort

Siehe GDAL API-Lernprogramm .

#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 

Wenn Sie mehr Ausgabesteuerung wünschen, z. B. Größenänderung, Teilmenge usw., verwenden Sie ein VRT als Eingabe, so macht es gdal_translate intern.

Kommentare

  • Leider beinhaltet dies nicht ' keine Reprojektion, oder?
  • @butcher – nein. Weil die Frage keine Reprojektion erwähnte. Natürlich können Sie Raster mit der gdal python API neu projizieren. Wenn Sie wissen möchten, wie es geht, stellen Sie eine neue Frage.
  • Ich habe dies bereits hier getan: gis.stackexchange.com/questions/103874/… , aber dies wurde als Duplikat markiert 🙁
  • @butcher – das wurde als Duplikat dieser Frage geschlossen. Ihre Frage fragt auch nach gdal_translate Ist Ihnen bekannt, dass gdal_translate nicht neu projiziert? Wenn Sie neu projizieren möchten, verwenden Sie gdalwarp oder die gdal python API-Methode – gdal.ReprojectImage

Antwort

Ja, Sie können die GDAL-Dienstprogramme in Python aufrufen. Je nachdem, ob es sich um ein Dienstprogramm handelt, gibt es geringfügige Unterschiede im Ansatz eine eigenständige Exe oder auch ein Teil des Python-Codes. In beiden Fällen müssen Sie jedoch das Modul subprocess verwenden:

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) 

Sie werden feststellen, dass ich um meine Pfade maskierte Anführungszeichen hinzufüge. Dies liegt daran, dass ich unter Windows tr hatte Probleme mit Pfaden, insbesondere solchen mit Leerzeichen oder wenn eines der „\“ Zeichen ein anderes versehentlich maskiertes Zeichen erzeugt. Ich behalte also sozusagen den richtigen Pfad in aspec bei.

Wenn Sie eines der Python-Dienstprogramme verwenden, machen Sie dasselbe, außer dass Ihre exe am Anfang der Befehlszeichenfolge für den Unterprozess jetzt lautet. “ C: \ python32 \ python.exe „(oder welche Version auch immer Sie haben) und Ihr zweites Element ist das Python-Dienstprogramm, das Sie verwenden möchten.

Natürlich können Sie auch über Ihr Dateisystem iterieren, anstatt Hard- zu verwenden. codierte Konstanten, aber dies ist nur ein Beispiel.

EDIT – Verallgemeinern für QGIS-Plugins
QGIS erstellt / ändert beim Start eine Reihe von Umgebungsvariablen. Sie können also generalisierte Pfadvariablen zu den GDAL-Bibliotheken / Dienstprogrammen erstellen, indem Sie diese (siehe Einstellungen-> Optionen-> System) anstelle der im obigen Beispiel fest codierten Pfade verwenden.

Kommentare

  • Also kann ich ' das nicht tun? Importieren Sie gdal_translate und rufen Sie dann .main () auf?
  • Nein – das wird ' nicht funktionieren. gdal_translate ist kein Python-Paket, daher weiß Python ' nichts darüber. Es wird eine Fehlermeldung angezeigt, dass " ImportError No Module mit dem Namen gdal_translate " lautet. Verwenden Sie stattdessen das Unterprozessmodul.
  • OK, eine ähnliche Frage zur Verwendung von gdal_retile.py. Ich habe Folgendes versucht: import gdal_retile gdal_retile.main (" -v -r bilineare-Ebenen 4 -ps 2048 2048 -co \ " gekachelt = JA \ " -targetDir Kabelpyramide – optfile files.txt "), aber ich erhalte die Fehlermeldung: Nicht erkannte Befehlsoption: – Irgendeine Idee warum?
  • Nebenbei kann ich ' Ich sehe das Problem nur, wenn ich vermute, dass der Schalter ' –optfile ' nicht gefällt. Letzteres ist nicht dokumentiert.
  • @MappaGnosis Gibt es eine Alternative von gdal_translate in der Python-gdal-Bibliothek?

Antwort

Ich mache dies mit verschiedenen gdal-Befehlen unter Verwendung von os.system, mit denen Sie nur Funktionen aufrufen können Ab Befehlszeile:

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

Dies wird auch in Vorlesung 7 hier beschrieben: http://www.gis.usu.edu/~chrisg/python/2009/

Kommentare

  • GDAL-Befehle sind als Python-Funktionen in GDAL 2.1 bis RFC 59.1 . Auch subprocess.call ist sicherer als os.system.
  • Jemand muss ein gutes Beispiel für diese Python-Funktionen schreiben. Ich habe ein paar Stunden lang mit gdal.Warp() gerungen, um eine PG: zu erhalten Datenquelle als cutlineDSName, um die cutlineSQL zu steuern. (Ich weiß, richtig? Ein paar Stunden tatsächlich etwas ausarbeiten ? Der Horror! < / Scherz >). Hat es irgendwann funktioniert, und Es scheint deutlich schneller zu sein als os.system() oder subprocess.call(). ' macht ~ 2 Millionen Schnittlinien, daher weiß ich ' nicht, ob es ' s tatsächlich schneller bis heute Abend … aber es ' funktioniert genau richtig.

Antwort

Hier ist ein Kurzcode für alle, die mit GDAL Translate in Python Bänder aus einem zusammengesetzten Multiband-TIF in einzelne Dateien speichern möchten.

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 

Dies kann für die weitere Verarbeitung nützlich sein (z. B. mit Rasterio, wie hier ).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.