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
- Ano, od gdal-2.1. Tuto odpověď je třeba přijmout jako správnou.
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ískalPG:
zdroj dat jakocutlineDSName
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()
nebosubprocess.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 ).