Jak obliczyć liczbę komórek o danej wartości?

11

Mam plik rastrowy, w którym wszystkie komórki mają wartości od -3 do 7, żadna wartość danych to -9999. Jak obliczyć liczbę komórek o określonej wartości, np. 6? Czy mogę korzystać z kalkulatora?

Astrid
źródło

Odpowiedzi:

16

Dwa możliwe łatwe sposoby:
1.)

  • Zainstaluj kalkulator rastrowy QGIS, jeśli nie jest już dostępny (nie określiłeś używanej wersji QGIS)
  • Użyj kalkulatora rastrowego QGIS z taką formułą "Corine@1" = 23. Spowoduje to wyodrębnienie wszystkich komórek o wartości 23 do nowego rastra
  • Następnie użyj narzędzia „Statystyka warstw rastrowych” w zestawie narzędzi SEXTANTE dla QGIS, aby obliczyć całkowitą sumę komórek.

wprowadź opis zdjęcia tutaj

2.) Jeśli chcesz bardziej zaawansowanego przeglądu liczby komórek rastrowych, możesz użyć wtyczki LecoS dla QGIS.

  • Upewnij się, że zainstalowałeś Numpy, Scipy i PIL na swoim komputerze. Znajdź instrukcję, jak to zrobić w systemie Windows na moim blogu lub tutaj .
  • Pobierz LecoS z instalatora wtyczek i włącz go. Żadne błędy nie powinny się pojawiać.
  • Uruchom narzędzie statystyk Landcover (Menu Raster -> Ekologia krajobrazu -> Statystyka Landcover) z kształtem rastra. Upewnij się, że Twój kształt ma prawidłowe odwzorowanie, ustawioną wartość bez danych, a także kwadratowe komórki rastrowe.
  • Wybierz opcje, jak pokazano poniżej. Możesz zapisać wyniki w pliku .csv. Dane wyjściowe zawierają całkowitą osłonę (numer komórki * rozmiar komórki rastrowej ^ 2) dla wszystkich klas osłon. wprowadź opis zdjęcia tutaj
Kulik
źródło
1
Wystarczy zauważyć, że obecnie zestaw narzędzi nazywa się Przetwarzanie .
Luís de Sousa
9

EDYCJA 3 : Przekształciłem poniższy kod w całkiem użyteczny skrypt SEXTANTE, który daje następujące wyniki: wprowadź opis zdjęcia tutaj

Szczegółowa instrukcja i link do pobrania można znaleźć tutaj .


Do tego zadania możesz użyć konsoli Python. Skopiuj poniższy kod, wklej go do pliku tekstowego i zapisz na przykład jako „some_script.py”. Następnym razem będziesz musiał policzyć wartości komórek, otwórz konsolę python w QGIS, naciśnij przycisk „pokaż edytor” i otwórz tam ten skrypt. Następnie zamień „raster_path” w czwartym wierszu skryptu na rzeczywistą ścieżkę do rastra i zapisz zmiany. Następnie uruchom skrypt i w wynikach konsoli (po lewej stronie edytora na zrzucie ekranu poniżej) zobaczysz liczbę komórek dla każdej wartości, którą masz w rastrze.

Pamiętaj, że aby skrypt działał, musisz zainstalować Python-Numpy.

EDYCJA: Ponadto, jeśli nie potrzebujesz dokładnych wartości, ale wolisz zobaczyć rozkład wartości, możesz zastosować opisane tutaj podejście .

EDYCJA 2: udostępniono bardziej zaawansowaną wersję skryptu. Teraz działa z wielopasmowymi rastrami i przetwarza wartości 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])

wprowadź opis zdjęcia tutaj

SS_Rebelious
źródło
Jest to o wiele łatwiejsze niż używanie pętli. Można uzyskać liczbę bezpośrednio za pomocą numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Jednak może być konieczne upewnienie się, że używasz 64-bitowego języka Python, aby uniknąć błędów pamięci. Chociaż nie testowałem, jak to działa NaN.
jpmc26