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


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.