Как рассчитать количество клеток с заданным значением?

11

У меня есть растровый файл, где все ячейки имеют значения от -3 до 7, никакие значения данных не равны -9999. Как я могу рассчитать количество ячеек с определенным значением, например, 6? Могу ли я использовать калькулятор?

Astrid
источник

Ответы:

16

Два возможных простых способа:
1.)

  • Установите растровый калькулятор QGIS, если он еще не доступен (вы не указали, какую версию QGIS вы используете)
  • Используйте растровый калькулятор QGIS с такой формулой "Corine@1" = 23. Это извлечет все ячейки со значением 23 в новый растр
  • Затем используйте инструмент «Статистика растрового слоя» на панели инструментов SEXTANTE для QGIS, чтобы вычислить общую сумму ячеек.

введите описание изображения здесь

2.) Если вам нужен более сложный обзор количества растровых ячеек, вы можете использовать плагин LecoS для QGIS.

  • Убедитесь, что на вашем компьютере установлены Numpy, Scipy и PIL. Найдите инструкцию, как это сделать в Windows, в моем блоге или здесь .
  • Загрузите LecoS из установщика плагина и включите его. Никаких ошибок не должно появиться.
  • Запустите инструмент статистики Landcover (Меню Растр -> Экология ландшафта -> Статистика Landcover) со своей растровой формой. Убедитесь, что ваша фигура имеет правильную проекцию, заданное значение без данных, а также квадратные растровые ячейки.
  • Выберите параметры, как показано ниже. Вы можете сохранить результаты в файле .csv. Выходные данные содержат общее количество земель (номер ячейки * размер ячейки растра ^ 2) для всех ваших классов земель. введите описание изображения здесь
кроншнеп
источник
1
Просто чтобы отметить, что в наши дни набор инструментов называется Обработка .
Луис де Соуза
9

РЕДАКТИРОВАТЬ 3 : я преобразовал приведенный ниже код в довольно удобный скрипт SEXTANTE, который дает следующий вывод: введите описание изображения здесь

Подробную инструкцию и ссылку для скачивания можно найти здесь .


Вы можете использовать консоль Python для этой задачи. Скопируйте приведенный ниже код, вставьте его в текстовый файл и сохраните, например, как «some_script.py». В следующий раз вам нужно будет посчитать значения ячеек, открыть консоль Python в QGIS, нажать кнопку «Показать редактор» и открыть этот скрипт там. Затем замените 'raster_path' в четвертой строке скрипта на фактический путь к вашему растру и сохраните изменения. Затем запустите скрипт и в выводе консоли (слева от редактора на скриншоте ниже) вы увидите количество ячеек для каждого значения, которое есть в растре.

Обратите внимание, что для работы этого скрипта вам нужно установить python-numpy.

РЕДАКТИРОВАТЬ: Кроме того, если вам не нужны точные значения, но вы хотели бы видеть распределение значений, вы можете использовать подход, описанный здесь .

РЕДАКТИРОВАТЬ 2: более продвинутая версия скрипта предоставляется. Теперь он работает с многополосными растрами и обрабатывает значения 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])

введите описание изображения здесь

SS_Rebelious
источник
На самом деле это гораздо проще, чем использовать цикл. Вы можете получить отсчеты непосредственно с помощью NumPy : count = dict(zip(*numpy.unique(a, return_counts=True))). Возможно, вам придется убедиться, что вы используете 64-битный Python, чтобы избежать ошибок памяти. Хотя я не проверял, как это справляется NaN.
jpmc26