Як обчислити кількість комірок із заданим значенням?


11

У мене є растровий файл, у якому всі комірки мають значення від -3 до 7, а значення даних - -9999. Як я можу обчислити кількість комірок із конкретним значенням, наприклад, 6? Чи можу я використовувати калькулятор?

Відповіді:


16

Два можливих простих способу:
1.)

  • Встановіть растровий калькулятор QGIS, якщо він ще не доступний (ви не вказали, яку версію QGIS використовуєте)
  • Використовуйте растровий калькулятор QGIS з такою формулою "Corine@1" = 23. Це дозволить витягнути всі клітини зі значенням 23 у новий растр
  • Потім використовуйте інструмент "Статистика рівня растрового шару" в панелі інструментів SEXTANTE для QGIS, щоб обчислити загальну суму комірок.

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

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

  • Переконайтесь, що на комп’ютері встановлено Numpy, Scipy та PIL. Знайдіть інструкцію, як це зробити в Windows на своєму блозі або тут .
  • Завантажте LecoS з інсталятора плагіна та ввімкніть його. Жодних помилок не повинно з’являтися.
  • Запустіть інструмент статистики Landcover (Меню Растр -> Екологія ландшафту -> Статистика обкладинки) зі своєю формою растру. Переконайтеся, що ваша форма має правильну проекцію, встановлене значення без даних, а також квадратні растрові комірки.
  • Виберіть параметри, як показано нижче. Ви можете зберегти результати у файлі .csv. Вихідні дані містять загальну обкладинку (кількість клітинок * растровий розмір клітинок ^ 2) для всіх ваших класів обкладинки. введіть тут опис зображення

1
Зауважимо лише, що в наші дні панель інструментів називається « Обробка» .
Luís de Sousa

9

EDIT 3 : Я перетворив код нижче в досить зручний сценарій SEXTANTE, який дає наступний вихід: введіть тут опис зображення

Детальну інструкцію та посилання для завантаження можна знайти тут .


Для цього завдання можна використовувати консоль python. Скопіюйте код, наданий нижче, вставте його в текстовий файл і збережіть, наприклад, "some_script.py". Наступного разу вам потрібно буде порахувати значення комірок відкрити консоль пітона в QGIS, натиснути кнопку "показати редактор" і відкрити цей скрипт там. Потім замініть "raster_path" у четвертому рядку сценарію на фактичний шлях до растру та збережіть зміни. Потім запустіть скрипт і на консольному виході (зліва від редактора на скріншоті нижче) ви побачите кількість комірок для кожного значення, яке ви маєте в растрі.

Зауважте, що для роботи цього сценарію вам потрібно буде встановити python-numpy.

EDIT: Крім того, якщо вам не потрібні точні значення, але ви хочете побачити розподіл значень, ви можете скористатися описаним тут підходом .

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

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


Це насправді набагато простіше, ніж використовувати цикл. Ви можете отримати рахунки безпосередньо, використовуючи numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Можливо, вам потрібно буде переконатися, що ви працюєте з 64-розрядним Python, щоб уникнути помилок пам'яті. Хоча я не перевіряв, як це справляється NaN.
jpmc26
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.