Je možné použít nějaké gdal API k volání gdal_translate z kódu Pythonu? Nemám na mysli pouhé provedení souboru gdal_translate.exe ze systému souborů, ale spíše jej nějak nazvat v kódu, takže nepotřebuji znát přesný adresář, ve kterém je spustitelný soubor gdal_translate?

Komentáře

Odpovědět

Od verze GDAL 2.1 (více informací zde ) lze jako funkce knihovny použít obslužné programy GDAL a OGR. Například:

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 

Komentáře

  • Všechny možnosti, které gdal.Translate() záběry jsou uvedeny zde: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' zkusil jsem to použít a nedělat ' žádné chyby, ale výstupní soubor není ' t vytvořeno. Nějaké nápady proč?
  • také nedostáváte žádný výstupní soubor a žádné chyby. Výstupní cesty a parametry projWin jsou správné.

Odpověď

Viz GDAL Výukový program 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 

Chcete-li více řízení výstupu, jako je změna velikosti, podmnožina atd … použijte VRT jako vstup, takto to interně dělá gdal_translate.

Komentáře

  • bohužel toto ' nezahrnuje rejekci, že?
  • @butcher – ne. Protože otázka nezmiňovala reprojekci. Samozřejmě můžete rastry reprojektovat pomocí API gdal python. Pokud chcete vědět, jak na to, položte novou otázku.
  • Už jsem to udělal: gis.stackexchange.com/questions/103874/… , ale thius byl označen jako duplikát 🙁
  • @butcher – to bylo uzavřeno jako duplikát této otázky. Vaše otázka se také týká gdal_translate . Víte, že gdal_translate nereprojektuje? Chcete-li reprojektovat, použijte gdalwarp nebo metodu API gdal python – gdal.ReprojectImage

Odpověď

Ano, můžete zavolat nástroje GDAL z prostředí Pythonu. V přístupu jsou velmi malé rozdíly v závislosti na tom, zda je nástroj vlastní exe nebo také část kódu pythonu. Ať tak či onak, musíte použít modul podproces :

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) 

Všimnete si, že kolem svých cest přidávám uvozovky s uvozovkami. Důvodem je, že ve Windows jsem měl tr s cestami, zvláště s mezerami nebo kde jeden ze znaků „\“ vytvoří další náhodný znak uniklý. Chci tedy zachovat správnou cestu tak, jak byla.

Pokud používáte některou z obslužných programů pythonu, udělejte to samé, až na to, že váš exe na začátku řetězce příkazu subprocess je nyní “ C: \ python32 \ python.exe „(nebo jakoukoli verzi, kterou máte) a vaším druhým prvkem je obslužný program python, který chcete použít.

Je zřejmé, že můžete iterovat i přes svůj souborový systém, místo abyste používali hard- kódované konstanty, ale toto je jen příklad.

EDIT – zobecnění pro doplňky QGIS
QGIS při spuštění vytváří / upravuje řadu proměnných prostředí. Takže můžete vytvořit zobecněné proměnné cesty do knihoven / utilit GDAL pomocí těchto (viz Nastavení-> Možnosti-> Systém) namísto pevně zakódovaných cest ve výše uvedeném příkladu.

Komentáře

  • Takže to nemohu ' udělat? importovat gdal_translate a poté zavolat .main ()?
  • Ne – to nebude fungovat '. gdal_translate není balíček Pythonu, takže python o tom ' nic neví. Zobrazí se chyba " ImportError Žádný modul s názvem gdal_translate ". Místo toho použijte modul podprocesu.
  • ok jedna podobná otázka s použitím gdal_retile.py .. Snažil jsem se udělat následující: import gdal_retile gdal_retile.main (" -v -r bilineární -úrovně 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid – optfile files.txt "), ale zobrazí se chyba: Nerozpoznaná možnost příkazu: – Nějaký nápad proč?
  • Offhand mohu ' Nevidím problém, kromě mého odhadu je, že se mu nemusí líbit přepínač ' –optfile '. Ta druhá není zdokumentována.
  • @MappaGnosis Existuje v knihovně Python gdal alternativa gdal_translate?

Odpověď

Dělám to pomocí různých příkazů gdal pomocí os.system, které můžete použít k volání funkcí jen z příkazového řádku:

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

Je to také popsáno v přednášce 7 zde: http://www.gis.usu.edu/~chrisg/python/2009/

Komentáře

  • Příkazy GDAL jsou k dispozici jako funkce pythonu v GDAL 2.1 až RFC 59.1 . Také subprocess.call je bezpečnější než os.system.
  • Někdo potřebuje napsat dobrý příklad těchto funkcí Pythonu; několik hodin jsem zápasil s gdal.Warp(), abych správně získal PG: zdroj dat jako cutlineDSName k řízení cutlineSQL. (Vím, že? Několik hodin ve skutečnosti něco řešíte? Hrůza! < / kidding >). Nakonec to funguje a zdá se být výrazně rychlejší než os.system() nebo subprocess.call(). ' dělá ~ 2 miliony cutlines, takže jsem ' nevěděl, jestli ' je ve skutečnosti rychlejší do nějaké dnešní noci … ale ' funguje přesně správně.

Odpověď

Zde je rychlý kód pro každého, kdo chce ukládat pásma z vícepásmového TIF do více souborů pomocí GDAL Translate v Pythonu.

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 

To by mohlo být užitečné pro další zpracování (např. pomocí Rasteria, jako zde ).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *