Lendo, modificando e escrevendo um geotiff com GDAL em python


11

Estou tentando aprender as cordas do processamento de imagens de Sensoriamento Remoto usando ligações Python GDAL e numpy. Como primeira tentativa, estou lendo um arquivo geotiff Landsat8, faça uma manipulação simples e escreva o resultado em um novo arquivo. O código abaixo parece funcionar bem, exceto que a varredura original é despejada no arquivo de saída, em vez da varredura manipulada.

Quaisquer comentários ou sugestões são bem-vindos, mas observa em particular por que a varredura manipulada não aparece no resultado.

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Eu uso o Python 2.7.1 em uma máquina com Windows 7 de 32 bits.


Consegui fazê-lo funcionar em um DEM (Ubuntu, python 2.7.1) e produziu o resultado esperado, com tudo abaixo do valor médio definido como 10000 e gravado em um novo tiff. Você não está copiando a geotransformação para a nova imagem, para que ela não seja projetada; portanto, é necessário levar isso em consideração ao tentar visualizá-la (há uma linha única para fazer isso, mas precisarei desenterrá-la). Se você pode editar sua pergunta com a saída de gdainfo -stats original.tiffe gdal-config --versiontambém isso poderia ajudar.
Steven Kay

Oi, obrigado por olhar para isso! Eu sei que negligenciei a geotransformação, pensei em mastigar isso mais tarde. Eu vejo toda a imagem de saída (usando o Irfanview), então não acho que seja isso. Gerarei as informações que você solicitou quando estiver de volta hoje à noite.
HDR

Olá, estou com dificuldades para fornecer as informações solicitadas. Estou usando a ligação Python GDAL e não tenho certeza de como os comandos que você especifica correspondem a um comando Python. De qualquer forma, estou usando o GDAL-1.11.2-cp27-none-win32, conforme adquirido aqui . Vou atualizar minha postagem com algumas estatísticas sobre o .tiff original.
HDR

o que seria arr_min?
fluidmotion

arr_min = 0. Atualizei a postagem para mostrar isso. Obrigado!
HDR

Respostas:


13

Seu script está ausente do método ds.FlushCache, que salva em disco o que você tem na memória ao final das modificações. Veja abaixo uma versão corrigida do seu exemplo. Observe que eu também adicionei duas linhas para definir a projeção e geotransformar como entrada

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

O arquivo de saída não é projetado. Estou lendo um arquivo HDF5 e seleciono a projeção da banda que desejo exportar, que GetProjection()fornece o EPSG correto, mas parece não ser aplicado. Urdidura GDAL ausente? Obrigado!
Michael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.