วิธีรับ GDAL เพื่อสร้างสถิติสำหรับ GTiff ใน Python


14

ฉันสร้าง raster 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)

มันจะกลับมา (ต่ำสุด, สูงสุด, เฉลี่ย, 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>

ฉันไม่รู้วิธีการ pythonic ใด ๆ ในการสร้าง / จัดการไฟล์ xml แต่ด้วยลักษณะที่เรียบง่ายของ xml ที่มาพร้อมกับมันควรจะค่อนข้างน่ารักในการสร้างมันขึ้นมาพร้อมกับการดำเนินงานของไฟล์ I / O


5
ปรากฎว่าband.GetStatistics(0,1)จริง ๆ แล้วจะคำนวณสถิติและเพิ่มลงในข้อมูลเมตาของ GeoTIFF ในไฟล์เดียว ไม่ต้องใช้ไฟล์อื่น อย่างไรก็ตามจากการทดสอบกับผลิตภัณฑ์ของ Esri จะใช้งานได้กับ ArcGIS 10.0 ขึ้นไปไม่ใช่ ArcGIS 9.3 หรือก่อนหน้า
Mike T

ฟังก์ชั่นได้อธิบายไว้ในGDAL หน้า อาร์กิวเมนต์สองตัวที่ส่งผ่านไปยังฟังก์ชันนั้นคือ bApproxOK (ถ้าสถิติ TRUE อาจคำนวณจากภาพรวมหรือส่วนย่อยของไทล์ทั้งหมด) และ bForce (หากสถิติ FALSE จะถูกส่งคืนเท่านั้นหากทำได้โดยไม่ต้องทำการสแกนภาพซ้ำ) .

3

หากสถิติถูกคำนวณแล้วและรวมอยู่ในไฟล์ภายในแล้วgdalinfo -statsจะไม่สร้างไฟล์สถิติ PAM เพิ่มเติม (.aux.xml) สำหรับการใช้ GDAL 2.1.0 แต่มันง่ายมากที่จะใช้. xml สำหรับคุณเอง นี่คือบางส่วนของโมดูล Python ที่อธิบายการทำสิ่งนั้น สำหรับฉันฉันใช้The 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.