É possível usar alguma API gdal para chamar gdal_translate
a partir do código Python? Não quero dizer simplesmente executar o gdal_translate.exe do sistema de arquivos, mas sim chamá-lo de alguma forma no código para que eu não precise saber o diretório exato em que o executável gdal_translate está?
Comentários
- Sim, a partir de gdal-2.1. Esta resposta deve ser aceita como correta.
Resposta
Desde GDAL 2.1 (mais informações aqui ), os utilitários GDAL e OGR podem ser usados como funções de biblioteca. Por exemplo:
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
Comentários
- Todas as opções que
gdal.Translate()
as tomadas estão listadas aqui: gdal.org/python/osgeo.gdal-module.html#TranslateOptions - I ' tentei usar isso e não ' não obtive nenhum erro, mas o arquivo de saída não ' t criado. Alguma idéia do porquê?
- também não obtendo nenhum arquivo de saída e sem erros. Caminhos de saída e parâmetros projWin estão corretos.
Resposta
Veja o GDAL Tutorial da API .
#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
Se você quiser mais controle de saída, como redimensionamento, subconjunto, etc … use um VRT como entrada, é assim que gdal_translate faz isso internamente.
Comentários
- infelizmente isso não ' t inclui rejeição, não é?
- @butcher – no. Porque a pergunta não mencionava a reprojeção. Claro, você pode reprojetar rasters com a API gdal python. Se quiser saber como, faça uma nova pergunta.
- Já fiz isso aqui: gis.stackexchange.com/questions/103874/… mas thius foi marcado como uma duplicata 🙁
- @butcher – que foi fechado como uma duplicata desta pergunta. Sua pergunta também é sobre gdal_translate . Você está ciente de que gdal_translate não reprojeta? Se quiser reprojetar, use gdalwarp ou o método de API gdal python – gdal.ReprojectImage
Resposta
Sim, você pode chamar os utilitários GDAL de dentro do Python. Existem diferenças muito pequenas na abordagem, dependendo se o utilitário é um exe por si só ou também um pedaço de código Python. De qualquer forma, você precisa usar o módulo subprocesso :
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)
Você notará que adiciono aspas de escape em torno dos meus caminhos. Isso ocorre porque, no Windows, tive tr ouble com caminhos, especialmente aqueles com espaços ou onde um dos caracteres “\” cria outro caractere de escape acidental. Portanto, eu apenas preservo o caminho adequado no aspec como se fosse.
Se você estiver usando um dos utilitários do python, faça a mesma coisa, exceto que seu exe no início da string de comando do subprocesso agora é ” C: \ python32 \ python.exe “(ou qualquer versão que você tenha) e seu segundo elemento é o utilitário python que você deseja usar.
Obviamente, você também pode iterar em seu sistema de arquivos em vez de usar hard- constantes codificadas, mas este é apenas um exemplo.
EDITAR – Generalizando para plug-ins QGIS
QGIS cria / modifica uma série de variáveis de ambiente na inicialização. Portanto, você pode construir variáveis de caminho generalizadas para as bibliotecas / utilitários GDAL usando-as (consulte Configurações-> Opções-> Sistema) em vez dos caminhos embutidos no código no exemplo acima.
Comentários
- Então posso ' fazer isso? import gdal_translate e depois chame o .main ()?
- Não – isso não ' funcionará. gdal_translate não é um pacote Python, então o python não ' sabe nada sobre ele. Você receberá um erro dizendo " ImportError No Module chamado gdal_translate ". Use o módulo de subprocesso para chamá-lo.
- ok uma pergunta semelhante ao uso de gdal_retile.py .. Eu tentei fazer o seguinte: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = SIM \ " -targetDir cablepiramid – optfile files.txt ") mas recebo o erro: Opção de comando não reconhecida: – Alguma ideia do porquê?
- De imediato, posso ' não vejo o problema, exceto que meu palpite é que pode não gostar da opção ' –optfile '. Este último não está documentado.
- @MappaGnosis Existe uma alternativa de gdal_translate dentro da biblioteca gdal Python?
Resposta
Eu faço isso com vários comandos gdal usando os.system que você pode usar para chamar funções apenas a partir da linha de comando:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
Também é descrito na aula 7 aqui: http://www.gis.usu.edu/~chrisg/python/2009/
Comentários
- Os comandos GDAL estão disponíveis como funções python em GDAL 2.1 a RFC 59.1 . Além disso,
subprocess.call
é mais seguro do queos.system
. - Alguém precisa escrever um bom exemplo dessas funções Python; lutei com
gdal.Warp()
por algumas horas para obter umPG:
fonte de dados comocutlineDSName
para conduzir ocutlineSQL
. (Eu sei, certo? Algumas horas realmente trabalhando em algo ? O horror! < / kidding >). Acabei funcionando, eventualmente, e parece ser significativamente mais rápido do queos.system()
ousubprocess.call()
. Ele ' está fazendo cerca de 2 milhões de cortes, então ganhei ' para saber se ' está na verdade mais rápido até hoje à noite … mas ' está funcionando perfeitamente.
Resposta
Aqui está um código rápido para quem deseja salvar bandas de um TIF multibanda composto em arquivos individuais usando GDAL Translate em 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
Isso pode ser útil para processamento posterior (por exemplo, usando Rasterio, como aqui ).