如何获取GDAL以在Python中为GTiff创建统计信息


14

我定期使用GDAL在Python中创建自己的GeoTIFF栅格,例如:

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命令)?还是我需要自己写?

Answers:


13

您可以使用GetStatistics方法获取统计信息。

例如。

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

它将返回(最小值,最大值,均值,标准差)

因此可以读取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文件的任何pythonic方式,但是鉴于随附xml的简单性,使用文件I / O操作创建一个xml应该很简单


5
事实证明,band.GetStatistics(0,1)这实际上将计算统计信息,并将其添加到单个文件中的GeoTIFF元数据中。不需要其他文件。但是,从使用Esri产品进行测试来看,它仅适用于ArcGIS 10.0及更高版本,不适用于ArcGIS 9.3或更低版本。
Mike T

该功能在GDAL页面上进行了描述。基于此,传递给该函数的两个参数是bApproxOK(如果可以基于概览或所有图块的一个子集来计算TRUE统计信息)和bForce(如果仅在可以完成而无需重新扫描图像的情况下返回FALSE统计信息) 。

3

如果已经计算出统计信息并将其包含在内部文件中,则gdalinfo -stats不会为使用GDAL 2.1.0创建额外的PAM统计信息文件(.aux.xml)。但是,非常容易实现自己的.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> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.