使用Rio Calc¶
使用Rasterio的rio calc命令,可以在命令行上进行简单的栅格数据处理。它使用 snuggs numpy s-expression引擎。这个 snuggs README 解释表达式一般是如何编写和计算的。本文档解释了RioCalc的具体细节,并提供了一些示例。
表达¶
rio calc表达式看起来像
(func|operator arg [*args])
在哪里? func
可以是模块中任何函数的名称 numpy
或里约Calc的一个内置设备: read
, fillnodata
或 sieve
;和 operator
可以是任何标准的python算术或逻辑运算符。参数本身可能是表达式。
拷贝一个文件¶
下面是复制数据集的一个简单示例。表达式 (read 1)
计算第一个输入数据集(具有形状的数组)的所有带 (3, 718, 791)
在这种情况下。
注:rio calc的指数起始于 1
.
$ rio calc "(read 1)" tests/data/RGB.byte.tif out.tif
反转文件的带顺序¶
表达式 (read i j)
计算第i个输入数据集的第j个带。这个 asarray
函数将逆序读取的带区收集到具有形状的数组中 (3, 718, 791)
用于输出。
$ rio calc "(asarray (read 1 3) (read 1 2) (read 1 1))" tests/data/RGB.byte.tif out.tif
多个文件的堆叠带¶
可以从多个输入文件中读取带区。此示例是复制文件的另一种(较慢)方法。
$ rio calc "(asarray (read 1 1) (read 2 2) (read 3 3))" \
> tests/data/RGB.byte.tif tests/data/RGB.byte.tif tests/data/RGB.byte.tif \
> out.tif
命名数据集¶
可以在表达式中按名称引用数据集,并使用 take
功能。
$ rio calc "(asarray (take a 3) (take a 2) (take a 1))" \
> --name "a=tests/data/RGB.byte.tif" out.tif
第三个使用名称重新完成的示例是:
$ rio calc "(asarray (take a 1) (take b 2) (take b 3))" \
> --name "a=tests/data/RGB.byte.tif" --name "b=tests/data/RGB.byte.tif" \
> --name "c=tests/data/RGB.byte.tif" out.tif
阅读和记录¶
功能 read
和 take
在前面的例子中有一点重叠,但是有很大的不同。前者涉及I/O,后者不涉及I/O。你也可以 take
来自任何数组,如本例中所示。
$ rio calc "(take (read 1) 1)" tests/data/RGB.byte.tif out.tif
算术运算¶
算术运算可以像numpy一样执行。下面是一个使用相同因子缩放数据集的所有三个波段的示例。
$ rio calc "(+ 2 (* 0.95 (read 1)))" tests/data/RGB.byte.tif out.tif
这里有一个比较复杂的例子,用不同的因素来缩放波段。
$ rio calc "(asarray (+ 2 (* 0.95 (read 1 1))) (+ 3 (* 0.9 (read 1 2))) (+ 4 (* 0.85 (read 1 3))))" tests/data/RGB.byte.tif out.tif
逻辑运算¶
逻辑运算可以与算术运算结合使用。在本例中,输入值大于或等于40时,输出值为255。
$ rio calc "(* (>= (read 1) 40) 255)" tests/data/RGB.byte.tif out.tif