Wie man GDAL dazu bringt, Statistiken für GTiff in Python zu erstellen

13

Ich erstelle regelmäßig meine eigenen GeoTIFF-Raster mit GDAL in Python, zB:

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

Wenn das Ergebnis jedoch mit ArcCatalog / ArcGIS angezeigt wird, sieht es entweder schwarz oder grau aus, da es keine Statistiken enthält. Dies wird gelöst, indem Sie mit der rechten Maustaste auf das Raster klicken und "Statistiken berechnen ..." in ArcCatalog auswählen (es gibt verschiedene andere Möglichkeiten, dies zu tun) oder gdalinfo in einer Eingabeaufforderung verwenden:

gdalinfo -stats MyRaster.tif

wird generiert MyRaster.tif.aux.xml, mit dessen Hilfe ArcGIS das Raster ordnungsgemäß skaliert. Die PAM-Datei (Persistent Auxiliary Metadata) enthält die Statistiken, insbesondere die Mindest- und Höchstwerte:

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

Meine Frage: Gibt es eine integrierte Methode, mit der GDAL eine Statistikdatei erstellen kann (außer mit dem gdalinfo -statsBefehl)? Oder muss ich meine eigene schreiben?

Mike T
quelle

Antworten:

13

Sie können die GetStatistics-Methode verwenden, um die Statistiken abzurufen.

z.B.

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

es wird zurückgegeben (Min, Max, Mean, StdDev)

so kann die xml gelesen werden:

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

Ich kenne keine pythonische Methode, um XML-Dateien zu erstellen / zu bearbeiten. Angesichts der Vereinfachung der zugehörigen XML-Datei sollte es jedoch ziemlich schwierig sein, eine mit Datei-E / A-Operationen zu erstellen

nickves
quelle
4
Es stellt sich heraus, dass band.GetStatistics(0,1)die Statistiken tatsächlich berechnet und zu den GeoTIFF-Metadaten in der einzelnen Datei hinzugefügt werden. Keine weiteren Dateien erforderlich. Tests mit Esri-Produkten können jedoch nur mit ArcGIS 10.0 und höher durchgeführt werden, nicht mit ArcGIS 9.3 oder früher.
Mike T
Die Funktion ist auf der GDAL-Seite beschrieben . Basierend darauf sind die beiden an die Funktion übergebenen Argumente bApproxOK (wenn TRUE-Statistiken basierend auf Übersichten oder einer Teilmenge aller Kacheln berechnet werden können) und bForce (wenn FALSE-Statistiken nur zurückgegeben werden, wenn sie ohne erneutes Scannen des Bildes durchgeführt werden können). .
3

Wenn die Statistiken bereits berechnet und intern in die Datei aufgenommen wurden, gdalinfo -statserstellen Sie keine zusätzliche PAM-Statistikdatei (.aux.xml) für die Verwendung von GDAL 2.1.0. Aber es ist sehr einfach, die .xml für sich selbst zu implementieren. Im Folgenden werden einige integrierte Python-Module erläutert, die diese Aufgaben ausführen. Für mich selbst habe ich die ElementTree XML-API mit dem folgenden Code verwendet:

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

Das Ergebnis sieht so aus:

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