Python / GDAL mendapatkan nilai unik dalam raster bernilai diskrit

8

Saya ingin mendapatkan saran tentang cara paling efisien untuk mengembalikan daftar nilai unik dari raster bernilai diskrit menggunakan Python dan GDAL.

Saya telah berpikir bahwa cara yang paling jelas adalah dengan memeriksa tabel atribut raster, tetapi jika saya lakukan band.GetDefaultRAT()pada band dataset raster yang berisi tabel atribut (toh tabel tersebut terlihat di ArcCatalog), hasilnya selalu None:

>>> rat = band.GetDefaultRAT()
>>> rat == None
True

Dalam hal itu, saya akhirnya harus memindai setiap sel raster dan membuat daftar nilai unik secara manual. Apakah ini satu-satunya cara untuk melakukannya?

Atau adakah cara untuk membangun tabel atribut dengan Python dan GDAL, kemudian meminta untuk daftar nilai unik?

hendra
sumber
Versi GDAL manakah yang Anda gunakan btw?
RK
pertanyaan bodoh tapi apa itu RAT?
Nickves
RAT adalah singkatan dari Raster Attribute Table.
Markus M.

Jawaban:

10

Jika saya mengerti dengan benar, Anda dapat menggunakan fungsi np.unique dari numpy lib:

from osgeo import gdal
import numpy as np

ds = gdal.Open("myimg.ext")
band =  ds.GetRasterBand(1)
array = np.array(band.ReadAsArray())
values = np.unique(array)

atau Anda dapat memotretnya satu kali:

values = np.unique(np.array(ds.GetRasterBand(1).ReadAsArray()))
Nickes
sumber
Mengapa membungkus band.ReadAsArray()dalam np.arraypanggilan? Bukankah sudah mengembalikan array numpy?
jpmc26
1
Ya itu. Membungkusnya dalam np.array tidak memiliki kelemahan kinerja, karena ini bukan salinan tetapi ia menggunakan alamat memori yang sama dan membantu IDE Anda mengidentifikasi objek sehingga Anda dapat mengaktifkan pelengkapan otomatis.
Nickves