Cách lấy GDAL để tạo số liệu thống kê cho GTiff trong Python


13

Tôi thường xuyên tạo các trình quét GeoTIFF của riêng mình với GDAL bằng Python, ví dụ:

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

tuy nhiên khi kết quả được xem với ArcCatalog / ArcGIS, nó trông có màu đen hoặc xám, vì nó không có số liệu thống kê. Điều này được giải quyết bằng cách nhấp chuột phải vào raster và chọn "Tính toán thống kê ..." trong ArcCatalog (có một số cách khác để làm điều này) hoặc sử dụng gdalinfo trong dấu nhắc lệnh:

gdalinfo -stats MyRaster.tif

sẽ tạo ra MyRaster.tif.aux.xml, được ArcGIS sử dụng để chia tỷ lệ raster đúng cách. Tệp PAM (Siêu dữ liệu phụ trợ liên tục) chứa các số liệu thống kê, đáng chú ý nhất là các giá trị tối thiểu và tối đa:

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

Câu hỏi của tôi: có cách tích hợp nào để có được GDAL để tạo tệp thống kê (ngoài việc sử dụng gdalinfo -statslệnh) không? Hay tôi cần phải tự viết?

Câu trả lời:


13

Bạn có thể sử dụng Phương thức GetStatistic để lấy số liệu thống kê.

ví dụ.

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

nó sẽ trở lại (Min, Max, Mean, StdDev)

vì vậy xml có thể được đọc:

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

Tôi không biết bất kỳ cách pythonic nào để tạo / thao tác với tệp xml. Nhưng với tính chất đơn giản của xml đi kèm, nó sẽ khá tuyệt vời để tạo một tệp với các thao tác I / O của tệp


4
Nó chỉ ra rằng band.GetStatistics(0,1)sẽ thực sự tính toán các số liệu thống kê và thêm nó vào siêu dữ liệu GeoTIFF trong một tệp. Không có tập tin khác cần thiết. Tuy nhiên, từ thử nghiệm với các sản phẩm Esri, nó chỉ hoạt động với ArcGIS 10.0 trở lên, không phải ArcGIS 9.3 trở về trước.
Mike T

Chức năng được mô tả trên Trang GDAL . Dựa vào đó, hai đối số được truyền cho hàm là bApproxOK (nếu số liệu thống kê TRUE có thể được tính dựa trên tổng quan hoặc tập hợp con của tất cả các ô) và bForce (nếu thống kê FALSE sẽ chỉ được trả về nếu có thể được thực hiện mà không quét lại hình ảnh) .

3

Nếu các số liệu thống kê đã được tính toán và được bao gồm trong tệp bên trong, gdalinfo -statssẽ không tạo tệp thống kê PAM bổ sung (.aux.xml) để sử dụng GDAL 2.1.0. Nhưng nó rất dễ thực hiện .xml cho riêng bạn. Dưới đây là một số mô-đun Python tích hợp được giải thích để thực hiện công cụ đó. Đối với bản thân tôi, tôi đã sử dụng API XML ElementTree với mã dưới đây:

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

Kết quả trông như sau:

<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> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.