Bagaimana cara menghitung jumlah sel dengan nilai yang diberikan?


11

Saya memiliki file raster di mana semua sel memiliki nilai antara -3 dan 7, tidak ada nilai data -9999. Bagaimana saya bisa menghitung jumlah sel dengan nilai tertentu, misalnya 6? Bisakah saya menggunakan kalkulator?

Jawaban:


16

Dua cara mudah yang mungkin:
1.)

  • Instal kalkulator raster QGIS jika belum tersedia (Anda tidak menentukan versi QGIS mana yang Anda gunakan)
  • Gunakan kalkulator raster QGIS dengan rumus seperti ini "Corine@1" = 23. Ini akan mengekstrak semua sel dengan nilai 23 ke dalam raster baru
  • Kemudian gunakan alat "Statistik Lapisan Raster" di dalam kotak alat SEXTANTE untuk QGIS untuk menghitung jumlah total sel.

masukkan deskripsi gambar di sini

2.) Jika Anda ingin ikhtisar yang lebih canggih atas jumlah sel raster Anda bisa menggunakan plugin LecoS untuk QGIS.

  • Pastikan Anda telah menginstal Numpy, Scipy dan PIL di komputer Anda. Temukan instruksi bagaimana melakukannya di Windows di Blog saya atau di sini .
  • Unduh LecoS dari penginstal Plugin dan aktifkan. Tidak ada kesalahan yang muncul.
  • Jalankan alat statistik Landcover (Menu Raster -> Ekologi Lansekap -> statistik Landcover) dengan bentuk raster Anda. Pastikan bentuk Anda memiliki proyeksi yang benar, nilai tanpa data, dan juga sel raster kuadrat.
  • Pilih opsi seperti yang ditampilkan di bawah ini. Anda dapat menyimpan hasilnya dalam file .csv. Outputnya berisi total landcover (cellnumber * raster cellsize ^ 2) untuk semua kelas landcover Anda. masukkan deskripsi gambar di sini

1
Hanya untuk dicatat bahwa hari ini kotak alat disebut Pemrosesan .
LuĂ­s de Sousa

9

EDIT 3 : Saya mengubah kode di bawah ini menjadi skrip SEXTANTE yang cukup dapat digunakan yang memberikan output sebagai berikut: masukkan deskripsi gambar di sini

Instruksi terperinci dan tautan unduhan dapat ditemukan di sini .


Anda dapat menggunakan konsol python untuk tugas ini. Salin kode yang disediakan di bawah ini, rekatkan ke file teks dan simpan sebagai "some_script.py" misalnya. Lain kali Anda harus menghitung nilai sel konsol python terbuka di QGIS, tekan tombol 'tunjukkan editor' dan buka skrip ini di sana. Kemudian ganti 'raster_path' di baris keempat dalam skrip dengan path aktual ke raster Anda dan simpan perubahan. Kemudian jalankan script dan di output konsol (di sebelah kiri dari editor pada screenshot di bawah) Anda akan melihat jumlah sel untuk setiap nilai yang Anda miliki di raster.

Perhatikan bahwa Anda harus memasang python-numpy agar skrip ini berfungsi.

EDIT: Juga, jika Anda tidak membutuhkan nilai yang tepat tetapi Anda lebih suka ingin melihat distribusi nilai, Anda dapat menggunakan pendekatan yang dijelaskan di sini .

EDIT 2: skrip versi lebih lanjut disediakan. Sekarang ini berfungsi dengan multi band raster dan memproses nilai-nilai NaN.

from osgeo import gdal
import sys
import math

path = "raster_path"

gdalData = gdal.Open(path)
if gdalData is None:
  sys.exit( "ERROR: can't open raster" )

# get width and heights of the raster
xsize = gdalData.RasterXSize
ysize = gdalData.RasterYSize

# get number of bands
bands = gdalData.RasterCount

# process the raster
for i in xrange(1, bands + 1):
  band_i = gdalData.GetRasterBand(i)
  raster = band_i.ReadAsArray()

  # create dictionary for unique values count
  count = {}

  # count unique values for the given band
  for col in range( xsize ):
    for row in range( ysize ):
      cell_value = raster[row, col]

      # check if cell_value is NaN
      if math.isnan(cell_value):
        cell_value = 'Null'

      # add cell_value to dictionary
      try:
        count[cell_value] += 1
      except:
        count[cell_value] = 1

  # print results sorted by cell_value
  for key in sorted(count.iterkeys()):
    print "band #%s - %s: %s" %(i, key, count[key])

masukkan deskripsi gambar di sini


Ini sebenarnya jauh lebih mudah daripada menggunakan loop. Anda bisa mendapatkan jumlah langsung menggunakan numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Anda mungkin perlu memastikan Anda menjalankan Python 64-bit untuk menghindari kesalahan memori. Meskipun saya belum menguji bagaimana itu menangani NaN.
jpmc26
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.