Как получить GDAL для создания статистики для GTiff в Python


14

Я регулярно создаю свои собственные растры GeoTIFF с помощью GDAL на Python, например:

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

однако, когда результат просматривается с помощью ArcCatalog / ArcGIS, он выглядит либо черным, либо серым, поскольку не имеет статистики. Это можно решить либо щелкнув правой кнопкой мыши по растру и выбрав «Рассчитать статистику ...» в ArcCatalog (есть несколько других способов сделать это), либо используя gdalinfo в командной строке:

gdalinfo -stats MyRaster.tif

будет сгенерирован MyRaster.tif.aux.xml, который используется ArcGIS для правильного масштабирования растра. Файл PAM (постоянные вспомогательные метаданные) содержит статистику, в частности минимальные и максимальные значения:

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

Мой вопрос: есть ли встроенный способ получения GDAL для создания файла статистики (кроме использования gdalinfo -statsкоманды)? Или мне нужно написать свое?

Ответы:


13

Вы можете использовать метод GetStatistics, чтобы получить статистику.

например.

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

он вернется (Min, Max, Mean, StdDev)

так что 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>

Я не знаю никакого питонского способа создания / манипулирования XML-файлом. Но, учитывая упрощенную природу сопровождающего XML-файла, он должен быть довольно тривиальным, чтобы создать его с помощью операций ввода-вывода файла.


5
Получается, что на band.GetStatistics(0,1)самом деле вычислит статистику и добавит ее в метаданные GeoTIFF в одном файле. Никаких других файлов не требуется. Однако после тестирования с продуктами Esri он работает только с ArcGIS 10.0 и выше, но не с ArcGIS 9.3 или более ранней.
Майк Т

Функция описана на странице GDAL . Исходя из этого, два аргумента, переданные функции: bApproxOK (если статистика TRUE может быть вычислена на основе обзоров или подмножества всех плиток) и bForce (если статистика FALSE будет возвращена, только если это можно сделать без повторного сканирования изображения) ,

3

Если статистика уже рассчитана и включена в файл внутри, не gdalinfo -statsсоздавайте дополнительный файл статистики PAM (.aux.xml) для использования GDAL 2.1.0. Но очень легко реализовать .xml для себя. Вот несколько встроенных модулей Python, описанных для этого. Для себя я использовал ElementTree XML API с кодом ниже:

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

Результат выглядит так:

<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> 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.