GDALを取得してPythonでGTiffの統計を作成する方法


13

私は定期的にPythonでGDALを使用して自分の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.xmlArcGISがラスターを適切にスケーリングするために使用するを生成します。PAM(Persistent Auxiliary Metadata)ファイルには、統計、特に最小値と最大値が含まれています。

<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ファイルを作成/操作するためのPythonの方法を知りませんが、付随するxmlの単純な性質を考えると、ファイルI / O操作で作成するのはかなり簡単です


4
これは、ことが判明しband.GetStatistics(0,1)、実際に統計を計算し、単一のファイルにGeoTIFFのメタデータに追加します。他のファイルは必要ありません。ただし、Esri製品を使用したテストでは、ArcGIS 9.3以前ではなく、ArcGIS 10.0以上でのみ動作します。
マイクT

この機能はGDALページで説明されています。それに基づいて、関数に渡される2つの引数はbApproxOK(TRUE統計が概要またはすべてのタイルのサブセットに基づいて計算される場合)およびbForce(FALSE統計が画像を再スキャンせずに実行できる場合にのみ返されます) 。

3

統計が既に計算されてファイルに内部的に含まれている場合、gdalinfo -statsGDAL 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> 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.