比较来自 rasterio 的两个数组中的值并执行操作

Comparing values in two arrays from rasterio and performing operations

我有一个 GeoTIFF,其中有两个波段,一个是“沉淀物反射率”(强度)和“沉淀物类型”(snow/rain/etc)。我想调整雪的降水值,以便在最终地图上为它们涂上不同的颜色。这是我目前正在做的事情以及我正在尝试做的事情。我正在使用的 tif 可用 here.

我正在使用光栅加载两个波段,如下所示:

import rasterio


src = rasterio.open("stack.tif")
ref=src.read(1) # This is the precip reflectivity
ptype=src.read(2) # This is the precip type

目前,ref 和 ptype 是两个数组,如下所示(-999 是一个无数据值):

[[-999. -999. -999. ... -999. -999. -999.]
 [-999. -999. -999. ... -999. -999. -999.]
 [-999. -999. -999. ... -999. -999. -999.]
 ...
 [-999. -999. -999. ... -999. -999. -999.]
 [-999. -999. -999. ... -999. -999. -999.]
 [-999. -999. -999. ... -999. -999. -999.]]

我想最终使用颜色图正确着色。对于“雪”的值(或为 ptype 输入 3,我想将 200 添加到该值以表示雪,对于所有其他值,我希望保持原样。

这让我想到了这个,是否有比较这些值或任何示例的最佳方法?

docs, reading a dataset with Rasterio returns an numpy.ndarray 中所述。

因此,您可以利用布尔比较来执行以下操作:

import numpy as np
import rasterio

fill_val = -999.0
snow_val = 3

# open original dataset
with rasterio.open("stack.tif") as src:
    ref = src.read(1) # This is the precip reflectivity
    ptype = src.read(2) # This is the precip type
    kwargs = src.meta.copy()

# modify valid `ref` data based on values in the `ptype` layer
ref[np.logical_and(ptype == snow_val, ref != fill_val)] += 200

# write the result to a new raster dataset with same structure
with rasterio.open("stack_modified.tif", "w", **kwargs) as dst:
    dst.write(ref, 1)
    dst.write(ptype, 2)

请注意,不要修改无数据(填充)值,这一点很重要,因为这会错误地导致它们被识别为有效数据。