Er det muligt at bruge noget gdal API til at ringe til gdal_translate
fra Python-kode? Jeg mener ikke blot at udføre gdal_translate.exe fra filsystemet, men snarere kalde det på en eller anden måde i kode, så jeg ikke behøver at vide den nøjagtige mappe, som gdal_translate eksekverbar er i?
Kommentarer
- Ja, pr. gdal-2.1. Dette svar skal accepteres som korrekt.
Svar
Da GDAL 2.1 (mere info her ), kan GDAL- og OGR-værktøjer bruges som biblioteksfunktioner. For eksempel:
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
- Alle de muligheder, der
gdal.Translate()
tager er angivet her: gdal.org/python/osgeo.gdal-module.html#TranslateOptions - I ' har forsøgt at bruge dette og ikke ' t får nogen fejl, men outputfilen er ikke ' t oprettet. Eventuelle ideer hvorfor?
- får også ingen outputfil og ingen fejl. Output stier og projWin-parametre er korrekte.
Svar
Se GDAL API-selvstudie .
#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
Hvis du vil have mere outputkontrol, såsom størrelse, underindstilling osv … brug en VRT som input, sådan gør gdal_translate det internt.
Kommentarer
- desværre inkluderer dette ikke ' t, ikke?
- @butcher – nr. Fordi spørgsmålet ikke nævnte reprojektion. Selvfølgelig kan du genudsende rasters med gdal python API. Hvis du vil vide hvordan, skal du stille et nyt spørgsmål.
- Jeg har allerede gjort det her: gis.stackexchange.com/questions/103874/… men thius blev markeret som et duplikat 🙁
- @butcher – det blev lukket som en duplikat af dette spørgsmål. Dit spørgsmål stiller også om gdal_translate Er du klar over, at gdal_translate ikke genudsendes? Hvis du vil genudsende, skal du bruge gdalwarp eller gdal python API-metoden – gdal.ReprojectImage
Svar
Ja, du kan ringe til GDAL-hjælpeprogrammer fra Python. Der er meget små forskelle i tilgangen afhængigt af om værktøjet er en exe i sig selv eller også et stykke python-kode. Uanset hvad skal du bruge subprocess -modulet:
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 vil bemærke, at jeg tilføjer undslipte anførselstegn omkring mine stier. Dette skyldes, at jeg i Windows har haft tr olieret med stier, især dem med mellemrum, eller hvor et af \ “tegnene gør et andet tilfældigt undsluppet tegn. Så jeg bevarer bare den rette sti i aspec som det var.
Hvis du bruger et af python-hjælpeprogrammerne, skal du bare gøre det samme undtagen din exe i starten af kommandostrengen underprocessen er nu ” C: \ python32 \ python.exe “(eller hvilken version du har), og dit andet element er det python-værktøj, du vil bruge.
Du kan selvfølgelig også gentage dit filsystem i stedet for at bruge hårdt kodede konstanter, men dette er kun et eksempel.
EDIT – Generalisering til QGIS-plugins
QGIS opretter / ændrer et antal miljøvariabler ved opstart. Så du kan oprette generaliserede stavariabler til GDAL-bibliotekerne / hjælpeprogrammerne ved hjælp af disse (se Indstillinger-> Indstillinger-> System) i stedet for de hårdkodede stier i eksemplet ovenfor.
Kommentarer
- Så jeg kan ' t gøre dette? importer gdal_translate og kalde derefter .main ()?
- Nej – der vandt ' t arbejde. gdal_translate er ikke en Python-pakke, så python vandt ' ikke ved noget om det. Du får en fejl, der siger " ImportError Intet modul ved navn gdal_translate ". Brug delprocessormodulet til at kalde det i stedet.
- ok et lignende spørgsmål med brug af gdal_retile.py .. Jeg forsøgte at gøre følgende: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir kabelpyramid – optfile files.txt ") men jeg får fejlen: Ikke-genkendt kommandomulighed: – Enhver idé hvorfor?
- Selvfølgelig kan jeg ' Se ikke problemet, undtagen mit gæt er, at det måske ikke kan lide kontakten ' –optfile '. Sidstnævnte er ikke dokumenteret.
- @MappaGnosis Er der et alternativ til gdal_translate i Python gdal-biblioteket?
Svar
Jeg gør dette med forskellige gdal-kommandoer ved hjælp af os.system, som du kan bruge til at kalde funktioner bare som fra kommandolinjen:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
Det er også beskrevet i forelæsning 7 her: http://www.gis.usu.edu/~chrisg/python/2009/
Kommentarer
- GDAL-kommandoer er tilgængelige som pythonfunktioner i GDAL 2.1 til RFC 59.1 . Også
subprocess.call
er sikrere endos.system
. - Nogen har brug for at skrive et godt eksempel på disse Python-funktioner; jeg kæmpede med
gdal.Warp()
i et par timer for at få enPG:
ordentligt datakilde somcutlineDSName
for at kørecutlineSQL
. (Jeg ved, ikke? Et par timer faktisk arbejder noget ud ? Rædslen! < / kidding >). Fik det til sidst, og det ser ud til at være betydeligt hurtigere endos.system()
ellersubprocess.call()
. Det ' udfører ~ 2 millioner cutlines, så jeg vinder ' ved ikke, om det ' s faktisk hurtigere indtil et stykke tid i aften … men det ' fungerer nøjagtigt korrekt.
Svar
Her er en hurtig kode til alle, der ønsker at gemme bånd fra en sammensat multi-bånd-TIF til individuelle filer ved hjælp af 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
Dette kan være nyttigt til videre behandling (f.eks. ved hjælp af Rasterio, som her ).