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

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 end os.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å en PG: ordentligt datakilde som cutlineDSName for at køre cutlineSQL. (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 end os.system() eller subprocess.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 ).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *