Comment calculer le nombre de cellules avec une valeur donnée?


11

J'ai un fichier raster où toutes les cellules ont des valeurs comprises entre -3 et 7, aucune valeur de données n'est -9999. Comment puis-je calculer le nombre de cellules avec une valeur spécifique, par exemple 6? Puis-je utiliser la calculatrice?

Réponses:


16

Deux façons simples possibles:
1.)

  • Installez la calculatrice raster QGIS si elle n'est pas déjà disponible (vous n'avez pas spécifié la version de QGIS que vous utilisez)
  • Utilisez la calculatrice raster QGIS avec une formule comme celle-ci "Corine@1" = 23. Cela extraira toutes les cellules de valeur 23 dans un nouveau raster
  • Utilisez ensuite l'outil "Statistiques de la couche raster" dans la boîte à outils SEXTANTE pour QGIS pour calculer la somme totale des cellules.

entrez la description de l'image ici

2.) Si vous souhaitez une vue d'ensemble plus sophistiquée du nombre de cellules raster, vous pouvez utiliser le plug-in LecoS pour QGIS.

  • Assurez-vous d'avoir installé Numpy, Scipy et PIL sur votre ordinateur. Trouvez une instruction comment le faire sur Windows sur mon blog ou ici .
  • Téléchargez LecoS à partir du programme d'installation du plugin et activez-le. Aucune erreur ne devrait apparaître.
  • Exécutez l'outil de statistiques Landcover (Menu Raster -> Ecologie du paysage -> Statistiques Landcover) avec votre forme raster. Assurez-vous que votre forme a une projection correcte, une valeur sans données définie et également des cellules raster carrées.
  • Choisissez les options comme indiqué ci-dessous. Vous pouvez enregistrer les résultats dans un fichier .csv. Les sorties contiennent la couverture terrestre totale (numéro de cellule * taille de cellule raster ^ 2) pour toutes vos classes de couverture terrestre. entrez la description de l'image ici

1
Juste pour noter que ces jours-ci la boîte à outils s'appelle Traitement .
Luís de Sousa

9

EDIT 3 : J'ai converti le code ci-dessous en script SEXTANTE assez utilisable qui donne la sortie suivante: entrez la description de l'image ici

Des instructions détaillées et le lien de téléchargement peuvent être trouvés ici .


Vous pouvez utiliser la console python pour cette tâche. Copiez le code fourni ci-dessous, collez-le dans un fichier texte et enregistrez-le sous "some_script.py" par exemple. La prochaine fois, vous devrez compter les valeurs des cellules. Ouvrez la console Python dans QGIS, appuyez sur le bouton «Afficher l'éditeur» et ouvrez ce script là. Remplacez ensuite «raster_path» dans la quatrième ligne du script par le chemin réel vers votre raster et enregistrez les modifications. Ensuite, exécutez le script et dans la sortie de la console (à gauche de l'éditeur sur la capture d'écran ci-dessous), vous verrez le nombre de cellules pour chaque valeur que vous avez dans le raster.

Notez que vous devrez installer python-numpy pour que ce script fonctionne.

EDIT: De plus, si vous n'avez pas besoin de valeurs exactes mais que vous préférez voir la distribution des valeurs, vous pouvez utiliser l'approche décrite ici .

EDIT 2: version plus avancée du script fournie. Maintenant, il fonctionne avec des rasters multi-bandes et traite les valeurs 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])

entrez la description de l'image ici


C'est en fait beaucoup plus facile que d'utiliser une boucle. Vous pouvez obtenir les comptes directement à l' aide numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Cependant, vous devrez peut-être vous assurer que vous exécutez Python 64 bits pour éviter les erreurs de mémoire. Bien que je n'aie pas testé comment cela fonctionne NaN.
jpmc26
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.