논리 연산자 및 기타 함수를위한 gdal_calc 래스터 계산기 구문


13

에서 gdal_calc에 대한 문서 가 적혀있다 NumPy와 구문을 사용하여 명령 행 래스터 계산기를 . 나중에 그중 하나에 몇 가지 예가 있습니다.

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)"--NoDataValue = 0 - 수단 설정된 제로 값 이하 널로

불행히도 다음과 같은 논리 연산자에 대한 예는 없습니다.

--calc = "A * (A> 0, A> B)"- 수단은 더 큰 제로 큰 경우 B를 유지하고 나머지 널로 설정

Numpy / Scipy 논리 함수를 기반으로 논리 연산자를 다음과 같이 작성합니다.

--calc = "A * logical_and (A> 0, A> B)"

나는 이것을 시도했지만 작동하는 것 같지만 그것이 정확하다는 것을 확신하고 싶습니다.

A와 B의 최소값을 원하는 경우 비슷한 방식으로 :

--calc = "A * (A <= B) + B * (A> B)"

당신은 쓸 수 있습니다 :

--calc = "최소 (A, B)"

내 문제는 내가 올바르게 얻을 수있는 요리 책을 찾을 수 없다는 것입니다. gdal_calc로 가능하거나 불가능한 것에 대한 고급 예제가있는 훌륭한 요리 책이 있습니까?

답변:


10

gdal_calc.py의 소스에서 다음을 사용하여 직접 계산됩니다 eval.

myResult = eval(opts.calc, global_namespace, local_namespace)

명령 줄에서도 평가되는 올바른 형식의 표현식이 작동 할 것입니다. 설명서에 따르면 +-/*, 및 / 또는 numpy함수에 gdalnumeric 구문을 사용할 수 있습니다 . 대화식 쉘에서 작은 더미 배열을 사용하여 함수를 테스트 한 다음 gdal_calc에서 동일한 호출을 사용할 수 있습니다.

여러 numpy기능을 함께 연결 하면 특히 큰 이미지를 처리 ​​할 때 메모리 사용량을 크게 증가시킬 수있는 임시 메모리 내 어레이가 생성 될 수 있습니다.

모든 기능의 목록은 numpy 문서를 참조하십시오 : 루틴 . 당신이 따르는 것들은 아마도 math 또는 here : routines.logic 일 것 입니다.

최소와 같은 함수가 나오는 곳입니다. 네임 스페이스를 이미 가져온 것입니다. 실제로 numpy.minimum 등입니다.


1
벤, 고마워, 그건 내가 모르는 또 다른 방법이다. eval에는 실제로 표현에 사용할 수있는 minimum () 등의 함수가 포함되어 있지 않기 때문에 사용 가능한 것을 설명하는 일부 요리 책 후에도 여전히.
Miro


1

값의 범위가 -1에서 3 사이 인 래스터가 있었으며 0은 유효한 숫자입니다. gdal_calc 표현식을 만드는 데 문제가있어서 빠르고 격렬한 해결책을 만들었습니다.

#!/usr/bin/env python3

fileNameIn = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tif"
fileNameOut = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tiff"
dst_options = ['COMPRESS=DEFLATE',"PREDICTOR=3","TILED=YES"]
noDataValue = -3.4028234663852886e+38

from osgeo import gdal
import numpy

src_ds = gdal.Open(fileNameIn)
format = "GTiff"
driver = gdal.GetDriverByName(format)
dst_ds = driver.CreateCopy(fileNameOut, src_ds, False ,dst_options)

# Set location
dst_ds.SetGeoTransform(src_ds.GetGeoTransform())
# Set projection
dst_ds.SetProjection(src_ds.GetProjection())
srcband = src_ds.GetRasterBand(1)

dataraster = srcband.ReadAsArray().astype(numpy.float)
#Rplace the nan value with the predefiend noDataValue
dataraster[numpy.isnan(dataraster)]=noDataValue

dst_ds.GetRasterBand(1).WriteArray(dataraster)
dst_ds.GetRasterBand(1).SetNoDataValue(noDataValue)

dst_ds = None
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.