特定の値を持つセルの数を計算する方法は?


11

すべてのセルの値が-3〜7で、データ値が-9999でないラスターファイルがあります。6などの特定の値を持つセルの数を計算するにはどうすればよいですか?計算機を使用できますか?

回答:


16

2つの簡単な方法:
1.)

  • QGISラスター計算機がインストールされていない場合はインストールします(使用しているQGISバージョンを指定しませんでした)
  • このような式でQGISラスター計算機を使用し"Corine@1" = 23ます。これにより、値23のすべてのセルが新しいラスターに抽出されます
  • 次に、QGISのSEXTANTEツールボックス内の「ラスターレイヤー統計」ツールを使用して、セルの合計を計算します。

ここに画像の説明を入力してください

2.)ラスターセルの数に関するより洗練された概要が必要な場合は、QGISのLecoSプラグインを使用できます。

  • Numpy、Scipy、PILがコンピューターにインストールされていることを確認してください。私のブログまたはここでWindows上でそれを行う方法の指示を見つけてください。
  • プラグインインストーラーからLecoSをダウンロードして有効にします。エラーは表示されません。
  • ラスター形状で土地被覆統計ツール(メニューラスター->景観生態学->土地被覆統計)を実行します。形状に正しい投影、設定されたデータなしの値、正方形のラスタセルがあることを確認してください。
  • 以下に表示されるオプションを選択します。結果を.csvファイルに保存できます。出力には、すべての土地被覆クラスの合計土地被覆(セル番号*ラスターcellsize ^ 2)が含まれます。 ここに画像の説明を入力してください

1
最近では、ツールボックスはProcessingと呼ばれています。
ルイスデスーサ

9

編集3:私は以下のコードを非常に使用可能なSEXTANTEスクリプトに変換し、次の出力を提供します: ここに画像の説明を入力してください

詳細な手順とダウンロードリンクは、ここにあります


このタスクにはPythonコンソールを使用できます。下記のコードをコピーし、テキストファイルに貼り付けて、たとえば「some_script.py」として保存します。セル値をカウントする必要がある場合は、QGISでPythonコンソールを開き、「エディターの表示」ボタンを押して、そこでスクリプトを開きます。次に、スクリプトの4行目の「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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.