用于逻辑运算符和其他功能的gdal_calc栅格计算器语法


13

gdal_calc的文档中,使用numpy语法声明了命令行栅格计算器。稍后有几个示例,其中一个示例:

gdal_calc.py -A input.tif --outfile = result.tif --calc =“ A *(A> 0)” --NoDataValue = 0- 表示将零以下的值设置为null

不幸的是,没有逻辑运算符的示例,例如:

--calc =“ A *(A> 0和A> B)”- 表示如果A大于零且B较大,则保留A,并将其余值设置为null

基于Numpy / Scipy逻辑函数,我希望将逻辑运算符写为:

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

我尝试了一下,它似乎可以工作,但是我想向您保证这是正确的。

以类似的方式,如果您想要最少的A和B:

--calc =“ A *(A <= B)+ B *(A> B)”

您可以这样写:

--calc =“ minimum(A,B)”

我的问题是我找不到任何食谱来确保我做对了。是否有一些不错的食谱,其中包含有关gdal_calc什么是和不可能的高级示例?

Answers:


10

在gdal_calc.py的源代码中,直接使用进行计算eval

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

这表明任何在命令行上求值的格式正确的表达式都可以使用。根据文档,您可以将gdalnumeric语法与+-/*和和/或numpy函数一起使用。您可以在交互式外壳程序中使用小型虚拟数组测试功能,然后在gdal_calc中使用相同的调用。

请记住,将多个numpy函数链接在一起很可能会产生临时的内存阵列,从而大大增加内存使用量,尤其是在处理大图像时。

您可以在numpy文档中查看所有功能的列表:例程。您所追求的可能在此处:数学或此处:例程.logic

这就是诸如minimum之类的函数的来源,仅仅是名称空间已被导入。确实是numpy.minimum等


1
谢谢本,这是我没有头绪的另一种方式。仍然在一些菜谱中,它将解释可能使用的内容,因为eval不包括实际上可以在表达式中使用的minimum()等函数。
米罗

8

根据本杰明的答案,您可以使用logical_or()或logical_and()。参见http://docs.scipy.org/doc/numpy/reference/routines.logic.html。以下示例对我来说效果很好。这会将177至185(含)之间的所有值都设置为0,然后将其视为nodata。

gdal_calc.py -A input.tif --outfile=output.tif --calc="A*logical_or(A<=177,A>=185)" --NoDataValue=0

1

我有一个栅格,其值在-1和3之间,其中零是有效数字。我在制作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
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.