Як отримати 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, пояснені для цього. Для себе я використав API XML ElementTree з кодом нижче:

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.