GDAL Python'da GTiff için istatistik oluşturmak için nasıl


14

Python'da GDAL ile düzenli olarak kendi GeoTIFF rasterlerimi oluşturuyorum, örneğin:

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

ancak sonuç ArcCatalog / ArcGIS ile görüntülendiğinde, istatistiki olmadığı için siyah veya gri renkte görünür. Bu, rasterlere sağ tıklayıp ArcCatalog'da "İstatistikleri Hesapla ..." seçeneğini seçerek (bunu yapmanın başka birkaç yolu vardır) veya bir komut isteminde gdalinfo kullanarak çözülür :

gdalinfo -stats MyRaster.tif

MyRaster.tif.aux.xmlRasG'i düzgün bir şekilde ölçeklemek için ArcGIS tarafından kullanılan üretecektir . PAM (Kalıcı Yardımcı Meta Veri) dosyası, en önemlisi minimum ve maksimum değerleri içeren istatistikleri içerir:

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

Benim sorum: GDAL'ı bir istatistik dosyası oluşturmak için yerleşik bir yol var mı ( gdalinfo -statskomutu kullanmak dışında )? Yoksa kendim yazmak zorunda mıyım?

Yanıtlar:


13

İstatistikleri almak için GetStatistics Yöntemini kullanabilirsiniz.

Örneğin.

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

dönecektir (Min, Maks, Ortalama, StdDev)

böylece xml okunabilir:

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

Ben xml dosyası oluşturmak / değiştirmek için herhangi bir pythonic yol bilmiyorum. Ama eşlik eden xml basit doğası göz önüne alındığında dosya G / Ç işlemleri ile bir oluşturmak için oldukça trival gerekir


6
band.GetStatistics(0,1)İstatistikleri gerçekten hesaplayacak ve tek dosyada GeoTIFF meta verilerine ekleyeceği ortaya çıktı . Başka dosya gerekmez. Ancak Esri ürünleri ile yapılan testlerden ArcGIS 9.3 ve üstü ile değil, sadece ArcGIS 10.0 ve üstü ile çalışır.
Mike T

1
Fonksiyon GDAL Sayfasında açıklanmıştır . Buna dayanarak, işleve iletilen iki argüman bApproxOK'dur (TRUE istatistikleri genel görünümlere veya tüm döşemelerin bir alt kümesine göre hesaplanabiliyorsa) ve bForce (FALSE istatistikleri yalnızca görüntüyü yeniden taramadan yapılabilirse döndürülürse) .

3

İstatistikler zaten hesaplanmış ve dosyaya dahili olarak dahil gdalinfo -statsedilmişse, GDAL 2.1.0'ı kullanmak için ek bir PAM istatistik dosyası (.aux.xml) oluşturmaz. Ancak .xml dosyasını kendiniz uygulamak çok kolaydır. İşte bunu yapmak için açıklanan bazı yerleşik Python modülleri. Kendim için aşağıdaki kod ile ElementTree XML API kullandım :

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

Sonuç şuna benzer:

<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> 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.