¿Cómo calcular el número de celdas con un valor dado?


11

Tengo un archivo ráster donde todas las celdas tienen valores entre -3 y 7, ningún valor de datos es -9999. ¿Cómo puedo calcular el número de celdas con un valor específico, por ejemplo, 6? ¿Puedo usar la calculadora?

Respuestas:


16

Dos posibles formas fáciles:
1.)

  • Instale la calculadora ráster QGIS si aún no está disponible (no especificó qué versión de QGIS está utilizando)
  • Use la calculadora ráster QGIS con una fórmula como esta "Corine@1" = 23. Esto extraerá todas las celdas con valor 23 en un nuevo ráster
  • Luego use la herramienta "Estadísticas de capa ráster" dentro de la caja de herramientas SEXTANTE para QGIS para calcular la suma total de celdas.

ingrese la descripción de la imagen aquí

2.) Si desea una visión general más sofisticada sobre el número de celdas ráster, puede usar el complemento LecoS para QGIS.

  • Asegúrese de haber instalado Numpy, Scipy y PIL en su computadora. Encuentre una instrucción sobre cómo hacerlo en Windows en mi blog o aquí .
  • Descargue LecoS desde el instalador del complemento y actívelo. No deben aparecer errores.
  • Ejecute la herramienta de estadísticas Landcover (Ráster de menú -> Ecología del paisaje -> Estadísticas de Landcover) con su forma ráster. Asegúrese de que su forma tenga una proyección correcta, un valor establecido sin datos y también celdas de trama cuadradas.
  • Elija las opciones que se muestran a continuación. Puede guardar los resultados en un archivo .csv. Las salidas contienen la cobertura terrestre total (número de celda * tamaño de celda ráster ^ 2) para todas sus clases de cobertura terrestre. ingrese la descripción de la imagen aquí

1
Solo para notar que en estos días la caja de herramientas se llama Procesando .
Luís de Sousa

9

EDITAR 3 : Convertí el código a continuación en un script SEXTANTE bastante utilizable que proporciona el siguiente resultado: ingrese la descripción de la imagen aquí

Las instrucciones detalladas y el enlace de descarga se pueden encontrar aquí .


Puede usar la consola de Python para esta tarea. Copie el código proporcionado a continuación, péguelo en un archivo de texto y guárdelo como "some_script.py", por ejemplo. La próxima vez que necesite contar los valores de celda, abra la consola de Python en QGIS, presione el botón 'mostrar editor' y abra este script allí. Luego reemplace 'raster_path' en la cuarta fila del script con la ruta real a su ráster y guarde los cambios. Luego ejecute el script y en la salida de la consola (a la izquierda del editor en la captura de pantalla a continuación) verá el número de celdas para cada valor que tenga en el ráster.

Tenga en cuenta que necesitará tener python-numpy instalado para que este script funcione.

EDITAR: Además, si no necesita valores exactos pero prefiere ver la distribución de valores, puede usar el enfoque descrito aquí .

EDIT 2: se proporciona una versión más avanzada del script. Ahora funciona con rásteres multibanda y procesa valores 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])

ingrese la descripción de la imagen aquí


En realidad, es mucho más fácil que usar un bucle. Puede llevar los conteos directamente utilizando numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Sin embargo, es posible que deba asegurarse de que está ejecutando Python de 64 bits para evitar errores de memoria. Aunque no he probado cómo se maneja eso NaN.
jpmc26
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.