使用Rio Calc

使用Rasterio的rio calc命令,可以在命令行上进行简单的栅格数据处理。它使用 snuggs numpy s-expression引擎。这个 snuggs README 解释表达式一般是如何编写和计算的。本文档解释了RioCalc的具体细节,并提供了一些示例。

表达

rio calc表达式看起来像

(func|operator arg [*args])

在哪里? func 可以是模块中任何函数的名称 numpy 或里约Calc的一个内置设备: readfillnodatasieve ;和 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

阅读和记录

功能 readtake 在前面的例子中有一点重叠,但是有很大的不同。前者涉及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