Cómo obtener GDAL para crear estadísticas para GTiff en Python

13

Regularmente creo mis propios rásteres GeoTIFF con GDAL en Python, por ejemplo:

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

sin embargo, cuando el resultado se ve con ArcCatalog / ArcGIS, se ve negro o gris, ya que no tiene estadísticas. Esto se resuelve haciendo clic derecho en el ráster y eligiendo "Calcular estadísticas ..." en ArcCatalog (hay varias otras formas de hacerlo), o usando gdalinfo en un símbolo del sistema:

gdalinfo -stats MyRaster.tif

generará MyRaster.tif.aux.xml, que ArcGIS utiliza para escalar correctamente el ráster. El archivo PAM (metadatos auxiliares persistentes) contiene las estadísticas, especialmente los valores mínimos y máximos:

<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>

Mi pregunta: ¿hay una forma integrada de hacer que GDAL cree un archivo de estadísticas (que no sea usar el gdalinfo -statscomando)? ¿O necesito escribir el mío?

Mike T
fuente

Respuestas:

13

Puede usar el Método GetStatistics para obtener las estadísticas.

p.ej.

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

volverá (Min, Max, Mean, StdDev)

para que se pueda leer el xml:

<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>

No conozco ninguna forma pitónica de crear / manipular un archivo xml. Pero dada la naturaleza simplista del xml que lo acompaña, sería bastante divertido crear uno con operaciones de E / S de archivo

nickves
fuente
44
Resulta que band.GetStatistics(0,1)realmente calculará las estadísticas y las agregará a los metadatos de GeoTIFF en el archivo único. No se requieren otros archivos. Sin embargo, a partir de las pruebas con productos Esri, solo funciona con ArcGIS 10.0 y versiones posteriores, no con ArcGIS 9.3 o anteriores.
Mike T
La función se describe en la página GDAL . En base a eso, los dos argumentos pasados ​​a la función son bApproxOK (si se pueden calcular estadísticas VERDADERAS basadas en vistas generales o un subconjunto de todos los mosaicos) y bForce (si las estadísticas FALSAS solo se devolverán si se pueden hacer sin volver a escanear la imagen) .
3

Si las estadísticas ya están calculadas e incluidas en el archivo internamente, gdalinfo -statsno creará un archivo de estadísticas PAM adicional (.aux.xml) para usar GDAL 2.1.0. Pero es muy fácil implementar el .xml por ti mismo. Aquí hay algunos módulos integrados de Python explicados para hacer eso. Para mí, utilicé la API XML de ElementTree con el siguiente código:

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")

El resultado se ve así:

<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
fuente