Cara mendapatkan GDAL untuk membuat statistik untuk GTiff di Python


13

Saya secara teratur membuat raster GeoTIFF saya sendiri dengan GDAL dengan Python, misalnya:

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

namun ketika hasilnya dilihat dengan ArcCatalog / ArcGIS, hasilnya terlihat hitam atau abu-abu, karena tidak memiliki statistik. Ini dipecahkan dengan mengklik kanan raster dan memilih "Calculate Statistics ..." di ArcCatalog (ada beberapa cara lain untuk melakukan ini), atau menggunakan gdalinfo di prompt perintah:

gdalinfo -stats MyRaster.tif

akan menghasilkan MyRaster.tif.aux.xml, yang digunakan oleh ArcGIS untuk skala raster dengan benar. File PAM (Persistent Auxiliary Metadata) berisi statistik, terutama nilai minimum dan maksimum:

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

Pertanyaan saya: apakah ada cara bawaan untuk mendapatkan GDAL untuk membuat file statistik (selain menggunakan gdalinfo -statsperintah)? Atau apakah saya perlu menulis sendiri?

Jawaban:


13

Anda dapat menggunakan Metode GetStatistics untuk mendapatkan statistik.

misalnya.

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

itu akan kembali (Min, Max, Mean, StdDev)

jadi xml dapat dibaca:

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

Saya tidak tahu cara pythonic untuk membuat / memanipulasi file xml. Tetapi mengingat sifat sederhana dari xml yang menyertainya, seharusnya cukup trival untuk membuatnya dengan operasi I / O file


4
Ternyata itu band.GetStatistics(0,1)benar-benar akan menghitung statistik, dan menambahkannya ke metadata GeoTIFF dalam file tunggal. Tidak diperlukan file lain. Namun dari pengujian dengan produk Esri, itu hanya bekerja dengan ArcGIS 10.0 dan lebih tinggi, bukan ArcGIS 9.3 atau sebelumnya.
Mike T

Fungsi ini dijelaskan pada Halaman GDAL . Berdasarkan hal itu, dua argumen yang diteruskan ke fungsi adalah bApproxOK (jika statistik TRUE dapat dihitung berdasarkan tinjauan umum atau subset dari semua ubin) dan bForce (jika statistik FALSE hanya akan dikembalikan jika dapat dilakukan tanpa memindai ulang gambar) .

3

Jika statistik sudah dihitung dan dimasukkan dalam file secara internal, gdalinfo -statstidak akan membuat file statistik PAM tambahan (.aux.xml) untuk menggunakan GDAL 2.1.0. Tetapi sangat mudah untuk mengimplementasikan .xml untuk Anda sendiri. Berikut adalah beberapa modul Python bawaan yang dijelaskan untuk melakukan hal itu. Untuk saya sendiri saya menggunakan ElementTree XML API dengan kode di bawah ini:

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

Hasilnya terlihat seperti:

<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> 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.