Är det möjligt att använda något gdal API för att ringa gdal_translate
från Python-kod? Jag menar inte att bara köra gdal_translate.exe från filsystemet, utan snarare kalla det på något sätt i kod så att jag inte behöver veta exakt den katalog som gdal_translate körbar är i?
Kommentarer
- Ja, från och med gdal-2.1. Detta svar bör accepteras som korrekt.
Svar
Eftersom GDAL 2.1 (mer info här ) kan GDAL- och OGR-verktyg användas som biblioteksfunktioner. Till exempel:
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
Kommentarer
- Alla alternativ som
gdal.Translate()
tar listas här: gdal.org/python/osgeo.gdal-module.html#TranslateOptions - I ' har försökt använda detta och inte ' t får några fel men utdatafilen är inte ' t skapats. Några idéer varför?
- får ingen utdatafil och inga fel. Utgångsvägar och projWin-parametrar är korrekta.
Svar
Se GDAL API-handledning .
#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
Om du vill ha mer utmatningskontroll, som att ändra storlek, delmängd osv … använd en VRT som inmatning, så gör gdal_translate det internt.
Kommentarer
- tyvärr inkluderar detta inte ', eller hur?
- @butcher – nej. Eftersom frågan inte nämnde reprojektion. Naturligtvis kan du reprojektera rasters med gdal python API. Om du vill veta hur, ställ en ny fråga.
- Jag har gjort det redan här: gis.stackexchange.com/questions/103874/… men thius markerades som ett duplikat 🙁
- @butcher – det stängdes som en duplikat av denna fråga. Din fråga ställer också om gdal_translate Är du medveten om att gdal_translate inte reproject? Om du vill reproject, använd gdalwarp eller gdal python API-metoden – gdal.ReprojectImage
Svar
Ja du kan ringa GDAL-verktygen inifrån Python. Det finns mycket små skillnader i tillvägagångssättet beroende på om verktyget är en exe i sig eller också en bit pythonkod. Hur som helst men du behöver använda delprocess -modulen:
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)
Du kommer att märka att jag lägger till undantagna citattecken runt mina banor. Detta beror på att jag i Windows har haft tr ouble med stigar, särskilt sådana med mellanslag eller där en av ”\” karaktärerna gör en annan oavsiktlig flyktig karaktär. Så jag bevarar bara rätt väg i aspec som det var.
Om du använder ett av pythonverktygen, gör bara samma sak förutom att din exe i början av kommandosträngen underprocess är nu ” C: \ python32 \ python.exe ”(eller vilken version du har) och ditt andra element är det pythonverktyg du vill använda.
Uppenbarligen kan du också itera över ditt filsystem snarare än att använda hårddisk kodade konstanter, men detta är bara ett exempel.
EDIT – Generalisering för QGIS-plugins
QGIS skapar / modifierar ett antal miljövariabler vid start. Så du kan bygga generaliserade sökvariabler till GDAL-biblioteken / verktygen med hjälp av dessa (se Inställningar-> Alternativ-> System) istället för de hårdkodade banorna i exemplet ovan.
Kommentarer
- Så jag kan ' t göra det här? importera gdal_translate och ring sedan .main ()?
- Nej – det kommer inte att fungera '. gdal_translate är inte ett Python-paket, så python vann ' t vet något om det. Du får ett felmeddelande som säger " ImportError Ingen modul som heter gdal_translate ". Använd underprocessmodulen för att ringa den istället.
- ok en liknande fråga med att använda gdal_retile.py .. Jag försökte göra följande: importera gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir kabelpyramid – optfile files.txt ") men jag får felet: Okänt kommandealternativ: – Har du någon idé varför?
- Jag kan själv ' Se inte problemet förutom att jag gillar att det kanske inte gillar omkopplaren ' –optfile '. Det senare är inte dokumenterat.
- @MappaGnosis Finns det ett alternativ till gdal_translate i Python gdal-biblioteket?
Svar
Jag gör detta med olika gdal-kommandon med hjälp av os.system som du kan använda för att bara ringa funktioner från kommandoraden:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
Det beskrivs också i föreläsning 7 här: http://www.gis.usu.edu/~chrisg/python/2009/
Kommentarer
- GDAL-kommandon finns som pythonfunktioner i GDAL 2.1 till RFC 59.1 . Dessutom är
subprocess.call
säkrare änos.system
. - Någon måste skriva upp ett bra exempel på dessa Python-funktioner. Jag brottades med
gdal.Warp()
i ett par timmar för att få enPG:
datakälla somcutlineDSName
för att drivacutlineSQL
. (Jag vet, eller hur? Ett par timmar faktiskt träna något ? Skräck! < / skojar >). Fick det så småningom, och det verkar vara betydligt snabbare änos.system()
ellersubprocess.call()
. Det ' gör ~ 2 miljoner cutlines, så jag vann ' vet inte om det ' s faktiskt snabbare till någon tid ikväll … men det ' fungerar exakt rätt.
Svar
Här är en snabbkod för alla som vill spara band från en sammansatt multi-band TIF till enskilda filer med GDAL Translate i 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
Detta kan vara användbart för vidare bearbetning (t.ex. med Rasterio, som här ).