Come ottenere GDAL per creare statistiche per GTiff in Python


13

Creo regolarmente i miei raster GeoTIFF con GDAL in Python, ad esempio:

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

tuttavia, quando il risultato viene visualizzato con ArcCatalog / ArcGIS, appare nero o grigio, poiché non ha statistiche. Questo può essere risolto facendo clic con il tasto destro del mouse sul raster e scegliendo "Calcola statistiche ..." in ArcCatalog (ci sono molti altri modi per farlo), oppure usando gdalinfo nel prompt dei comandi:

gdalinfo -stats MyRaster.tif

genererà MyRaster.tif.aux.xml, che viene utilizzato da ArcGIS per ridimensionare correttamente il raster. Il file PAM (Persistent Auxiliare Metadata) contiene le statistiche, in particolare i valori minimo e massimo:

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

La mia domanda: esiste un modo integrato per ottenere GDAL per creare un file statistico (diverso dall'uso del gdalinfo -statscomando)? O devo scrivere il mio?

Risposte:


13

È possibile utilizzare il metodo GetStatistics per ottenere le statistiche.

per esempio.

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

tornerà (Min, Max, Mean, StdDev)

così l'xml può essere letto:

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

Non conosco alcun modo pitonico per creare / manipolare file xml, ma data la natura semplicistica dell'XML di accompagnamento dovrebbe essere abbastanza trival per crearne uno con operazioni di I / O su file


4
Si scopre che band.GetStatistics(0,1)in realtà calcolerà le statistiche e le aggiungerà ai metadati GeoTIFF nel singolo file. Nessun altro file richiesto. Tuttavia, dai test con i prodotti Esri, funziona solo con ArcGIS 10.0 e versioni successive, non ArcGIS 9.3 o versioni precedenti.
Mike T,

La funzione è descritta nella pagina GDAL . Sulla base di ciò, i due argomenti passati alla funzione sono bApproxOK (se le statistiche VERE possono essere calcolate sulla base di panoramiche o un sottoinsieme di tutte le tessere) e bForce (se le statistiche FALSE verranno restituite solo se può essere fatto senza ripetere la scansione dell'immagine) .

3

Se le statistiche sono già calcolate e incluse nel file internamente, gdalinfo -statsnon creare un file di statistiche PAM aggiuntivo (.aux.xml) per l'utilizzo di GDAL 2.1.0. Ma è molto facile implementare il .xml per conto tuo. Ecco alcuni moduli Python integrati spiegati per fare queste cose. Per quanto mi riguarda, ho usato l'API XML ElementTree con il codice seguente:

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

Il risultato è simile a:

<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> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.