Come calcolare il numero di celle con un dato valore?


11

Ho un file raster in cui tutte le celle hanno valori compresi tra -3 e 7, nessun valore di dati è -9999. Come posso calcolare il numero di celle con un valore specifico, ad esempio 6? Posso usare la calcolatrice?

Risposte:


16

Due possibili modi semplici:
1.)

  • Installa il calcolatore raster QGIS se non è già disponibile (non hai specificato quale versione di QGIS stai usando)
  • Utilizzare la calcolatrice raster QGIS con una formula come questa "Corine@1" = 23. Ciò estrarrà tutte le celle con valore 23 in un nuovo raster
  • Quindi utilizzare lo strumento "Statistiche livello raster" all'interno della casella degli strumenti SEXTANTE per QGIS per calcolare la somma totale delle celle.

inserisci qui la descrizione dell'immagine

2.) Se si desidera una panoramica più sofisticata del numero di celle raster, è possibile utilizzare il plug-in LecoS per QGIS.

  • Assicurati di aver installato Numpy, Scipy e PIL sul tuo computer. Trova un'istruzione su come farlo su Windows sul mio blog o qui .
  • Scarica LecoS dal programma di installazione del plugin e abilitalo. Non dovrebbero apparire errori.
  • Esegui lo strumento delle statistiche Landcover (Menu Raster -> Ecologia del paesaggio -> Statistiche Landcover) con la tua forma raster. Assicurati che la tua forma abbia una proiezione corretta, un valore senza dati impostato e anche celle raster quadrate.
  • Scegli le opzioni come mostrato di seguito. È possibile salvare i risultati in un file .csv. Gli output contengono il landcover totale (numero di cella * dimensione celle raster ^ 2) per tutte le classi di landcover. inserisci qui la descrizione dell'immagine

1
Solo per notare che in questi giorni la casella degli strumenti si chiama Elaborazione .
Luís de Sousa,

9

EDIT 3 : ho convertito il codice seguente in script SEXTANTE abbastanza utilizzabili che danno il seguente output: inserisci qui la descrizione dell'immagine

Le istruzioni dettagliate e il link per il download sono disponibili qui .


È possibile utilizzare la console Python per questa attività. Copia il codice fornito di seguito, incollalo in un file di testo e salvalo come "some_script.py", ad esempio. La prossima volta dovrai contare i valori delle celle per aprire la console Python in QGIS, premere il pulsante "Mostra editor" e aprire questo script lì. Quindi sostituire 'raster_path' nella quarta riga dello script con il percorso effettivo del raster e salvare le modifiche. Quindi esegui lo script e nell'output della console (a sinistra dall'editor nella schermata seguente) vedrai il numero di celle per ogni valore che hai nel raster.

Nota che per far funzionare questo script dovrai aver installato python-numpy.

EDIT: Inoltre, se non hai bisogno di valori esatti ma preferisci vedere la distribuzione dei valori, puoi usare l'approccio descritto qui .

EDIT 2: versione più avanzata dello script fornita. Ora funziona con raster multibanda ed elabora i valori 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])

inserisci qui la descrizione dell'immagine


In realtà è molto più facile che usare un loop. È possibile ottenere i conteggi direttamente utilizzando NumPy : count = dict(zip(*numpy.unique(a, return_counts=True))). Tuttavia, potrebbe essere necessario assicurarsi di eseguire Python a 64 bit per evitare errori di memoria. Anche se non ho testato come funziona NaN.
jpmc26,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.