如何计算具有给定值的像元数?


11

我有一个栅格文件,其中所有像元的值都在-3和7之间,没有数据值是-9999。如何计算具有特定值(例如6)的像元数?我可以使用计算器吗?

Answers:


16

两种可能的简单方法:
1.)

  • 如果尚未提供QGIS栅格计算器,请安装它(您未指定要使用的QGIS版本)
  • 将QGIS栅格计算器与这样的公式一起使用"Corine@1" = 23。这会将所有值23的像元提取到新栅格中
  • 然后,使用SEXTANTE工具箱中的“栅格图层统计信息”工具来获取QGIS,以计算像元总数。

在此处输入图片说明

2)如果您想更详细地了解栅格像元的数量,可以使用LecoS插件进行QGIS。

  • 确保已在计算机上安装了Numpy,Scipy和PIL。在Windows上的Blog此处找到有关如何执行此操作的说明。
  • 从插件安装程序下载LecoS并启用它。没有错误应该弹出。
  • 使用栅格形状运行Landcover统计信息工具(菜单Raster->景观生态-> Landcover统计信息)。确保您的形状具有正确的投影,设置的无数据值以及正方形栅格像元。
  • 选择如下所示的选项。您可以将结果保存为.csv文件。输出包含所有土地覆盖类别的总土地覆盖(像元数*栅格像元大小^ 2)。 在此处输入图片说明

1
只是要注意,这些天工具箱称为Processing
路易斯·德索萨

9

编辑3:我将下面的代码转换为相当有用的SEXTANTE脚本,该脚本提供以下输出: 在此处输入图片说明

详细说明和下载链接可以在此处找到。


您可以使用python控制台执行此任务。复制下面提供的代码,将其粘贴到文本文件中,然后将其另存为“ some_script.py”。下次您将需要计算单元格值时,请在QGIS中打开python控制台,单击“显示编辑器”按钮,然后在此处打开此脚本。然后,将脚本第四行中的“ 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])

在此处输入图片说明


实际上,这比使用循环要容易得多。你可以得到直接使用numpy的计数count = dict(zip(*numpy.unique(a, return_counts=True)))。不过,您可能需要确保运行64位Python以避免内存错误。尽管我还没有测试怎样处理NaN
jpmc26
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.