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
- Ja, per gdal-2.1. Dette svaret bør godtas som riktig.
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 ennos.system
. - Noen trenger å skrive opp et godt eksempel på disse Python-funksjonene. Jeg kjempet med
gdal.Warp()
i et par timer for å få enPG:
datakilde somcutlineDSName
for å kjørecutlineSQL
. (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 ennos.system()
ellersubprocess.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 ).