Is het mogelijk om een of andere gdal API te gebruiken om gdal_translate aan te roepen vanuit Python-code? Ik bedoel niet gewoon het uitvoeren van het gdal_translate.exe vanuit het bestandssysteem, maar noem het liever op de een of andere manier in code, zodat ik niet de exacte map hoef te weten waarin het uitvoerbare bestand gdal_translate is?

Opmerkingen

  • Ja, vanaf gdal-2.1. Dit antwoord zou als correct moeten worden geaccepteerd.

Antwoord

Sinds GDAL 2.1 (meer info hier ), kunnen GDAL- en OGR-hulpprogrammas worden gebruikt als bibliotheekfuncties. Bijvoorbeeld:

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 

Reacties

  • Alle opties die gdal.Translate() takes worden hier vermeld: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' ik heb geprobeerd dit te gebruiken en ' geen fouten te krijgen, maar het uitvoerbestand is niet ' t gemaakt. Enig idee waarom?
  • krijgt ook geen uitvoerbestand en geen fouten. Uitvoerpaden en projWin-parameters zijn correct.

Antwoord

Zie de GDAL API-zelfstudie .

#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 

Als u meer outputcontrole wilt, zoals formaat wijzigen, subsetting, enz … gebruik een VRT als invoer, dit is hoe gdal_translate het intern doet.

Reacties

  • helaas bevat ' geen herprojectie, nietwaar?
  • @butcher – no. Omdat er in de vraag geen sprake was van herprojectie. Natuurlijk kun je rasters opnieuw projecteren met de gdal python API. Als je wilt weten hoe, stel dan een nieuwe vraag.
  • Ik heb het hier al gedaan: gis.stackexchange.com/questions/103874/… maar deze is gemarkeerd als een duplicaat 🙁
  • @butcher – dat is gesloten als een duplicaat van deze vraag. Uw vraag stelt ook vragen over gdal_translate . Weet u dat gdal_translate niet opnieuw projecteert? Als u opnieuw wilt projecteren, gebruikt u gdalwarp of de gdal python API-methode – gdal.ReprojectImage

Answer

Ja, je kunt de GDAL-hulpprogrammas aanroepen vanuit Python. Er zijn zeer kleine verschillen in de aanpak, afhankelijk van of het hulpprogramma is een exe op zich of ook een stukje Python-code. Hoe dan ook, je moet de module subproces gebruiken:

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) 

U zult opmerken dat ik ontsnapte aanhalingstekens rond mijn paden plaats. Dit komt omdat ik in Windows tr ouble met paden, vooral die met spaties of waar een van de “\” karakters een ander toevallig ontsnapt karakter maakt. Dus bewaar ik als het ware het juiste pad in aspec.

Als je een van de python-hulpprogrammas gebruikt, doe dan hetzelfde, behalve dat je exe aan het begin van de opdrachtreeks van het subproces nu is ” C: \ python32 \ python.exe “(of welke versie je ook hebt) en je tweede element is het Python-hulpprogramma dat je wilt gebruiken.

Uiteraard kun je ook je bestandssysteem herhalen in plaats van hard- gecodeerde constanten, maar dit is slechts een voorbeeld.

EDIT – Generaliseren voor QGIS-plug-ins
QGIS creëert / wijzigt een aantal omgevingsvariabelen bij het opstarten. U kunt dus gegeneraliseerde padvariabelen naar de GDAL-bibliotheken / hulpprogrammas bouwen met deze (zie Instellingen-> Opties-> Systeem) in plaats van de hardgecodeerde paden in het bovenstaande voorbeeld.

Opmerkingen

  • Dus ik kan dit ' niet doen? importeer gdal_translate en roep dan .main () aan?
  • Nee – dat heeft ' niet gewerkt. gdal_translate is geen Python-pakket, dus Python won ' er niets van af. U krijgt een foutmelding " ImportError Geen module met de naam gdal_translate ". Gebruik de subprocesmodule om het in plaats daarvan aan te roepen.
  • oké, een vergelijkbare vraag met het gebruik van gdal_retile.py .. Ik probeerde het volgende te doen: import gdal_retile gdal_retile.main (" -v -r bilineair -levels 4 -ps 2048 2048 -co \ " tiled = JA \ " -targetDir kabelpiramide – optfile files.txt ") maar ik krijg de foutmelding: Unrecognized command option: – Enig idee waarom?
  • Offhand kan ik ' zie het probleem niet, behalve dat ik vermoed dat het de ' –optfile ' switch misschien niet leuk vindt. Dit laatste is niet gedocumenteerd.
  • @MappaGnosis Is er een alternatief voor gdal_translate in de gdal-bibliotheek van Python?

Answer

Ik doe dit met verschillende gdal-commandos met os.system die je kunt gebruiken om functies aan te roepen vanaf de opdrachtregel:

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

Het wordt ook beschreven in les 7 hier: http://www.gis.usu.edu/~chrisg/python/2009/

Reacties

  • GDAL-opdrachten zijn beschikbaar als Python-functies in GDAL 2.1 tot en met RFC 59.1 . Ook subprocess.call is veiliger dan os.system.
  • Iemand moet een goed voorbeeld schrijven van die Python-functies; ik heb een paar uur met gdal.Warp() geworsteld om een PG: gegevensbron als cutlineDSName om de cutlineSQL aan te sturen. (Ik weet het, toch? Een paar uur werkt echt iets uit ? De gruwel! < / grapje >). Het werkte uiteindelijk, en het lijkt aanzienlijk sneller te zijn dan os.system() of subprocess.call(). Het ' doet ~ 2 miljoen cutlines, dus ik heb ' gewonnen om te weten of het ' s eigenlijk sneller tot een tijd vanavond … maar het ' werkt precies goed.

Answer

Hier is een snelle code voor iedereen die banden wil opslaan van een samengestelde multi-band TIF naar individuele bestanden met GDAL Translate in 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 

Dit kan handig zijn voor verdere verwerking (bijv. door Rasterio te gebruiken, zoals hier ).

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *