Wie berechnet man die Anzahl der Zellen mit einem bestimmten Wert?

11

Ich habe eine Rasterdatei, in der alle Zellen Werte zwischen -3 und 7 haben, kein Datenwert ist -9999. Wie kann ich die Anzahl der Zellen mit einem bestimmten Wert berechnen, z. B. 6? Kann ich den Taschenrechner benutzen?

Astrid
quelle

Antworten:

16

Zwei mögliche einfache Wege:
1.)

  • Installieren Sie den QGIS-Rasterrechner, falls er noch nicht verfügbar ist (Sie haben nicht angegeben, welche QGIS-Version Sie verwenden).
  • Verwenden Sie den QGIS-Rasterrechner mit einer Formel wie dieser "Corine@1" = 23. Dadurch werden alle Zellen mit dem Wert 23 in ein neues Raster extrahiert
  • Verwenden Sie dann das Werkzeug "Rasterebenenstatistik" in der SEXTANTE-Toolbox für QGIS, um die Gesamtsumme der Zellen zu berechnen.

Geben Sie hier die Bildbeschreibung ein

2.) Wenn Sie einen genaueren Überblick über die Anzahl der Rasterzellen wünschen, können Sie das LecoS-Plugin für QGIS verwenden.

  • Stellen Sie sicher, dass Sie Numpy, Scipy und PIL auf Ihrem Computer installiert haben. Eine Anleitung dazu unter Windows finden Sie in meinem Blog oder hier .
  • Laden Sie LecoS vom Plugin-Installationsprogramm herunter und aktivieren Sie es. Es sollten keine Fehler auftreten.
  • Führen Sie das Landbedeckungsstatistik-Tool (Menü-Raster -> Landschaftsökologie -> Landbedeckungsstatistik) mit Ihrer Rasterform aus. Stellen Sie sicher, dass Ihre Form eine korrekte Projektion, einen festgelegten Wert ohne Daten und auch quadratische Rasterzellen aufweist.
  • Wählen Sie die unten gezeigten Optionen. Sie können die Ergebnisse in einer CSV-Datei speichern. Die Ausgaben enthalten die gesamte Landbedeckung (Zellennummer * Rasterzellengröße ^ 2) für alle Ihre Landbedeckungsklassen. Geben Sie hier die Bildbeschreibung ein
Brachvogel
quelle
1
Nur um zu beachten, dass die Toolbox heutzutage Processing heißt .
Luís de Sousa
9

EDIT 3 : Ich habe den folgenden Code in ein gut verwendbares SEXTANTE-Skript konvertiert, das folgende Ausgabe liefert: Geben Sie hier die Bildbeschreibung ein

Eine ausführliche Anleitung und den Download-Link finden Sie hier .


Sie können die Python-Konsole für diese Aufgabe verwenden. Kopieren Sie den unten angegebenen Code, fügen Sie ihn in eine Textdatei ein und speichern Sie ihn beispielsweise als "some_script.py". Wenn Sie das nächste Mal die Zellenwerte zählen müssen, öffnen Sie die Python-Konsole in QGIS, klicken Sie auf die Schaltfläche "Editor anzeigen" und öffnen Sie dieses Skript dort. Ersetzen Sie dann 'raster_path' in der vierten Zeile im Skript durch den tatsächlichen Pfad zu Ihrem Raster und speichern Sie die Änderungen. Führen Sie dann das Skript aus und in der Konsolenausgabe (links vom Editor auf dem Screenshot unten) sehen Sie die Anzahl der Zellen für jeden Wert, den Sie im Raster haben.

Beachten Sie, dass python-numpy installiert sein muss, damit dieses Skript funktioniert.

BEARBEITEN: Wenn Sie keine genauen Werte benötigen, aber lieber die Verteilung der Werte sehen möchten, können Sie den hier beschriebenen Ansatz verwenden .

EDIT 2: Vorabversion des Skripts bereitgestellt. Jetzt funktioniert es mit Multiband-Rastern und verarbeitet NaN-Werte.

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])

Geben Sie hier die Bildbeschreibung ein

SS_Rebelious
quelle
Es ist tatsächlich viel einfacher als die Verwendung einer Schleife. Sie können die Zählungen direkt mit numpy abrufen : count = dict(zip(*numpy.unique(a, return_counts=True))). Möglicherweise müssen Sie jedoch sicherstellen, dass Sie 64-Bit-Python ausführen, um Speicherfehler zu vermeiden. Obwohl ich nicht getestet habe, wie das geht NaN.
jpmc26