Como fazer com que o GDAL crie estatísticas para o GTiff em Python

13

Eu regularmente crio meus próprios rasters GeoTIFF com GDAL em Python, por exemplo:

from osgeo import gdal
from numpy import random
data = random.uniform(0, 10, (300, 200))
driver = gdal.GetDriverByName('GTiff')
ds = driver.Create('MyRaster.tif', 200, 300)
band = ds.GetRasterBand(1)
band.WriteArray(data)
ds = band = None # save, close

no entanto, quando o resultado é visualizado no ArcCatalog / ArcGIS, ele parece preto ou cinza, pois não possui estatísticas. Isso é resolvido clicando com o botão direito do mouse na varredura e escolhendo "Calcular Estatísticas ..." no ArcCatalog (existem várias outras maneiras de fazer isso) ou usando gdalinfo em um prompt de comando:

gdalinfo -stats MyRaster.tif

irá gerar MyRaster.tif.aux.xml, que é usado pelo ArcGIS para dimensionar adequadamente a varredura. O arquivo PAM (Metadados Auxiliares Persistentes) contém as estatísticas, principalmente os valores mínimo e máximo:

<PAMDataset>
  <PAMRasterBand band="1">
    <Metadata>
      <MDI key="STATISTICS_MINIMUM">0</MDI>
      <MDI key="STATISTICS_MAXIMUM">10</MDI>
      <MDI key="STATISTICS_MEAN">5.0189833333333</MDI>
      <MDI key="STATISTICS_STDDEV">2.9131294111984</MDI>
    </Metadata>
  </PAMRasterBand>
</PAMDataset>

Minha pergunta: existe uma maneira interna de fazer com que o GDAL crie um arquivo de estatísticas (além de usar o gdalinfo -statscomando)? Ou preciso escrever o meu?

Mike T
fonte

Respostas:

13

Você pode usar o método GetStatistics para obter as estatísticas.

por exemplo.

stats =   ds.GetRasterBand(1).GetStatistics(0,1)

retornará (Min, Max, Mean, StdDev)

para que o xml possa ser lido:

<PAMDataset>
  <PAMRasterBand band="1">
    <Metadata>
      <MDI key="STATISTICS_MINIMUM">stats[0]</MDI>
      <MDI key="STATISTICS_MAXIMUM">stats[1]</MDI>
      <MDI key="STATISTICS_MEAN">stats[2]</MDI>
      <MDI key="STATISTICS_STDDEV">stats[3]</MDI>
    </Metadata>
  </PAMRasterBand>
</PAMDataset>

Eu não conheço nenhuma maneira python para criar / manipular arquivos xml. Mas, dada a natureza simplista do xml que o acompanha, deve ser bastante interessante criar um com operações de E / S de arquivos

nickves
fonte
4
Acontece que band.GetStatistics(0,1)ele realmente calcula as estatísticas e as adiciona aos metadados GeoTIFF no arquivo único. Nenhum outro arquivo é necessário. No entanto, a partir dos testes com os produtos Esri, ele funciona apenas com o ArcGIS 10.0 e superior, não com o ArcGIS 9.3 ou anterior.
Mike T
A função está descrita na página GDAL . Com base nisso, os dois argumentos passados ​​para a função são bApproxOK (se as estatísticas TRUE puderem ser calculadas com base em visões gerais ou em um subconjunto de todos os blocos) e bForce (se as estatísticas FALSE forem retornadas apenas se for possível sem redigitalizar a imagem) .
3

Se as estatísticas já estiverem calculadas e incluídas no arquivo internamente, você gdalinfo -statsnão criará um arquivo de estatísticas adicionais do PAM (.aux.xml) para usar o GDAL 2.1.0. Mas é muito fácil implementar o .xml para você. Aqui estão alguns módulos Python internos explicados para fazer isso. Para mim, usei a API XML do ElementTree com o código abaixo:

import xml.etree.cElementTree as ET

stats = file.GetRasterBand(band).GetStatistics(0,1)

pamDataset = ET.Element("PAMDataset")
pamRasterband = ET.SubElement(pamDataset, "PAMRasterBand", band="1")
metadata = ET.SubElement(pamRasterband, "Metadata")
ET.SubElement(metadata, "MDI", key = "STATISTICS_MAXIMUM").text = str(stats[1])
ET.SubElement(metadata, "MDI", key = "STATISTICS_MEAN").text = str(stats[2])
ET.SubElement(metadata, "MDI", key = "STATISTICS_MINIMUM").text = str(stats[0])
ET.SubElement(metadata, "MDI", key = "STATISTICS_STDDEV").text = str(stats[3])

tree = ET.ElementTree(pamDataset)
tree.write(destFilePath + ".aux.xml")

O resultado se parece com:

<PAMDataset>
    <PAMRasterBand band="1">
        <Metadata>
            <MDI key="STATISTICS_MINIMUM">-40.65</MDI>
            <MDI key="STATISTICS_MEAN">10.2929293137</MDI>
            <MDI key="STATISTICS_MAXIMUM">45.050012207</MDI>
            <MDI key="STATISTICS_STDDEV">17.4892321447</MDI>
        </Metadata>
    </PAMRasterBand>
</PAMDataset> 
Manuel
fonte