Er det mulig å bruke noe gdal API for å ringe gdal_translate fra Python-kode? Jeg mener ikke bare å kjøre gdal_translate.exe fra filsystemet, men kaller det på en eller annen måte i kode, så jeg trenger ikke å vite nøyaktig katalogen gdal_translate kjørbar er i?

Kommentarer

Svar

Siden GDAL 2.1 (mer info her ), kan GDAL og OGR-verktøy brukes som biblioteksfunksjoner. 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 alternativene som gdal.Translate() tar er oppført her: gdal.org/python/osgeo.gdal-module.html#TranslateOptions
  • I ' har prøvd å bruke dette og ikke ' t får noen feil, men utdatafilen er ikke ' t opprettet. Noen ideer hvorfor?
  • får heller ingen utdatafil og ingen feil. Utgangsstier og projWin-parameter er korrekte.

Svar

Se GDAL API-veiledning .

#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 ha mer utgangskontroll, for eksempel endring av størrelse, delmengde osv … bruk en VRT som input, slik gjør gdal_translate det internt.

Kommentarer

  • Dessverre inkluderer dette ikke ' t, eller hva?
  • @butcher – nei. Fordi spørsmålet ikke nevnte reprojeksjon. Selvfølgelig kan du gjenskape rasters med gdal python API. Hvis du vil vite hvordan, still et nytt spørsmål.
  • Jeg har gjort det allerede her: gis.stackexchange.com/questions/103874/… men thius ble merket som et duplikat 🙁
  • @butcher – det ble lukket som en duplikat av dette spørsmålet. Spørsmålet ditt spør også om gdal_translate . Er du klar over at gdal_translate ikke reproject? Hvis du vil reproject, bruk gdalwarp eller gdal python API-metoden – gdal.ReprojectImage

Svar

Ja, du kan ringe GDAL Utilities fra Python. Det er veldig små forskjeller i tilnærmingen avhengig av om verktøyet er en exe i seg selv eller også et stykke python-kode. Uansett må du bruke underprosess -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 vil legge merke til at jeg legger til rømte anførselstegn rundt stiene mine. Dette er fordi jeg i Windows har hatt tr farlig med stier, spesielt de med mellomrom eller hvor en av «\» tegnene gjør en annen utilsiktet rømt karakter. Så, jeg bevarer bare den rette banen i aspec som den var.

Hvis du bruker et av python-verktøyene, er det bare å gjøre det samme bortsett fra at din exe i begynnelsen av kommandostrengen underprosess er nå » C: \ python32 \ python.exe «(eller hvilken versjon du har) og det andre elementet ditt er python-verktøyet du vil bruke.

Du kan selvsagt også gjenta over filsystemet i stedet for å bruke hardt kodede konstanter, men dette er bare et eksempel.

EDIT – Generalisering for QGIS-plugins
QGIS oppretter / endrer et antall miljøvariabler ved oppstart. Så du kan bygge generaliserte stavariabler til GDAL-bibliotekene / verktøyene ved å bruke disse (se Innstillinger-> Alternativer-> System) i stedet for de hardkodede banene i eksemplet ovenfor.

Kommentarer

  • Så jeg kan ' t gjøre dette? importere gdal_translate og ring deretter .main ()?
  • Nei – det vil ikke fungere '. gdal_translate er ikke en Python-pakke, så python vant ' t vet noe om det. Du får en feilmelding som sier " ImportError Ingen modul kalt gdal_translate ". Bruk delprosessmodulen til å ringe den i stedet.
  • ok ett lignende spørsmål med bruk av gdal_retile.py .. Jeg prøvde å gjøre følgende: importere 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 feilen: Ukjent kommandoalternativ: – Noen ide hvorfor?
  • Uavhengig kan jeg ' t se problemet, bortsett fra at jeg antar at det ikke liker ' –optfile ' -bryteren. Sistnevnte er ikke dokumentert.
  • @MappaGnosis Er det et alternativ av gdal_translate i Python gdal-biblioteket?

Svar

Jeg gjør dette med forskjellige gdal-kommandoer ved hjelp av os.system som du kan bruke til å kalle funksjoner bare fra kommandolinjen:

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

Det er også beskrevet i forelesning 7 her: http://www.gis.usu.edu/~chrisg/python/2009/

Kommentarer

  • GDAL-kommandoer er tilgjengelige som pythonfunksjoner i GDAL 2.1 til RFC 59.1 . Også subprocess.call er tryggere enn os.system.
  • Noen trenger å skrive opp et godt eksempel på disse Python-funksjonene. Jeg kjempet med gdal.Warp() i et par timer for å få en PG: datakilde som cutlineDSName for å kjøre cutlineSQL. (Jeg vet, ikke sant? Et par timer faktisk trener noe ? Skrekken! < / tuller >). Fikk den til å fungere til slutt, og det ser ut til å være betydelig raskere enn os.system() eller subprocess.call(). Det ' gjør ~ 2 millioner kuttlinjer, så jeg vant ' vet ikke om det ' s faktisk raskere til en stund i kveld … men det ' fungerer helt riktig.

Svar

Her er en rask kode for alle som vil lagre bånd fra en sammensatt flerbånds-TIF til individuelle filer ved hjelp av 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 nyttig for videre behandling (f.eks. ved bruk av Rasterio, som her ).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *