주어진 값으로 셀 수를 계산하는 방법은 무엇입니까?


11

모든 셀에 -3과 7 사이의 값이있는 래스터 파일이 있습니다. 데이터 값은 -9999입니다. 6과 같은 특정 값을 가진 셀 수를 어떻게 계산할 수 있습니까? 계산기를 사용할 수 있습니까?

답변:


16

가능한 두 가지 쉬운 방법 :
1.)

  • QGIS 래스터 계산기를 사용할 수없는 경우 설치합니다 (사용중인 QGIS 버전을 지정하지 않은 경우)
  • 이와 같은 공식으로 QGIS 래스터 계산기를 사용하십시오 "Corine@1" = 23. 값이 23 인 모든 셀을 새 래스터로 추출합니다.
  • 그런 다음 QGIS 용 SEXTANTE 도구 상자에서 "래스터 레이어 통계"도구를 사용하여 총 셀 합계를 계산하십시오.

여기에 이미지 설명을 입력하십시오

2.) 래스터 셀 수에 대해보다 정교한 개요를 원한다면 QGIS 용 LecoS 플러그인을 사용할 수 있습니다.

  • 컴퓨터에 Numpy, Scipy 및 PIL이 설치되어 있는지 확인하십시오. 내 블로그 또는 여기 에서 Windows에서 수행하는 방법에 대한 지침을 찾으 십시오 .
  • 플러그인 설치 프로그램에서 LecoS를 다운로드하여 활성화하십시오. 오류가 나타나지 않아야합니다.
  • 래스터 모양으로 Landcover 통계 도구 (메뉴 래스터-> 가로 생태학-> Landcover 통계)를 실행하십시오. 모양에 올바른 투영, 설정된 데이터 없음 값 및 사각형 래스터 셀이 있는지 확인하십시오.
  • 아래 표시된 옵션을 선택하십시오. 결과를 .csv 파일로 저장할 수 있습니다. 출력에는 모든 랜드 커버 클래스에 대한 총 랜드 커버 (cellnumber * raster cellsize ^ 2)가 포함됩니다. 여기에 이미지 설명을 입력하십시오

1
요즘 도구 상자의 이름은 Processing 입니다.
루이스 드 수사

9

편집 3 : 아래 코드를 다음과 같은 출력을 제공하는 매우 유용한 SEXTANTE 스크립트로 변환했습니다. 여기에 이미지 설명을 입력하십시오

자세한 지침 및 다운로드 링크는 여기를 참조하십시오 .


이 작업에 파이썬 콘솔을 사용할 수 있습니다. 아래에 제공된 코드를 복사하여 텍스트 파일에 붙여넣고 예를 들어 "some_script.py"로 저장하십시오. 다음에 QGIS에서 python console을 열어 셀 값을 계산해야 할 때 'show editor'버튼을 누르고이 스크립트를 엽니 다. 그런 다음 스크립트의 네 번째 행에있는 '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.