尚权资讯丨第二届全国80后律所主任论坛完美落幕

百度 ”王永源说,信息化有助于实现“藏粮于技”,将是中国农业未来发展的方向。

Earth Engine 中的 Hansen 等人 (2013) 全球森林变化数据集以 30 米的分辨率表示 2000 年至 2014 年间全球的森林变化。我们先从向地图添加 Hansen 等人的数据开始。您可以搜索“Hansen forest”并将全球森林变化数据导入(详细了解如何搜索和导入数据集),并将导入的数据命名为 gfc2014,也可以将以下代码复制到代码编辑器中:

代码编辑器 (JavaScript)

var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
Map.addLayer(gfc2014);

点击代码编辑器顶部的 Run 按钮,您应该会看到类似图 1 的内容。

森林变更默认值
图 1. Hansen 等人 (2013) 森林变化数据的默认可视化效果。

别担心,您很快就能让它看起来更漂亮。(详细了解 Earth Engine 中的默认影像可视化效果)。在本部分结束时,您将获得一张类似于图 2 的图片,其中绿色表示研究检测到 2000 年的森林覆盖区域,红色表示研究期间估计的森林损失,蓝色表示研究期间的森林增加,品红色表示森林既有损失也有增加的区域,非森林区域则被遮盖。

森林变化自定义
图 2. Hansen 等人 (2013) 森林变化数据的自定义可视化图表。

请注意,将多波段图像添加到地图时,系统会分别选择图像的前三个波段作为红色、绿色和蓝色,并根据每个波段的数据类型进行拉伸。之所以图像看起来是红色的,是因为前三个波段是 treecover2000lossgaintreecover2000 波段以百分比表示,其值远高于 loss(绿色)和 gain(蓝色),后者为二元值 ({0, 1})。因此,图片会显示为以红色为主。

“全球森林变化”数据中的波段包括:

频段名称说明Range
treecover2000像素中的树木覆盖率(百分比)。0 - 100
如果在研究期间发生过损失,则为 1。 0 或 1
增益如果在研究期间出现增益,则为 1。 0 或 1
lossyear发生年损失的年份(从 2001 年开始,从 1 开始编制索引),如果没有发生损失,则为零。0 - 12
first_b30根据 2000 年(或更早,如果 2000 年没有有效像素)的第一个有效像素构建的 Landsat 7 红波段。 0 - 255
first_b40根据 2000 年的第一个有效像素构建的 Landsat 7 近红外波段。0 - 255
first_b50第一个 Landsat 7 短波红外波段,由 2000 年的第一个有效像素构建而成。0 - 255
first_b70根据 2000 年的第一个有效像素构建的第二个 Landsat 7 短波红外波段。0 - 255
last_b30根据 2012 年的最新有效像素构建的 Landsat 7 红波段。 0 - 255
last_b40根据 2012 年最新的有效像素构建的 Landsat 7 近红外波段。0 - 255
last_b50第一个 Landsat 7 短波红外波段,由 2012 年最新的有效像素构建而成。0 - 255
last_b70根据 2012 年最新的有效像素构建的第二 Landsat 7 短波红外波段。0 - 255
datamask无数据 (0)、已映射的陆地表面 (1) 和永久性水体 (2)。0、1、2

如需以灰度图像显示 2000 年的森林覆盖率,您可以使用 Map.addLayer() 的第二个实参中指定的 treecover2000 波段:

代码编辑器 (JavaScript)

Map.addLayer(gfc2014, {bands: ['treecover2000']}, 'treecover2000');

这样会生成一张类似于图 3 的图片。

美国树木覆盖率
图 3. 美国 2000 年树木覆盖率的灰度图像。

下图显示的是使用 3 个波段(2015 年的 Landsat 波段 5、4 和 3)的图片。此波段组合将健康植被显示为绿色,将土壤显示为淡紫色:

代码编辑器 (JavaScript)

Map.addLayer(
    gfc2014, {bands: ['last_b50', 'last_b40', 'last_b30']}, 'false color');

结果应如图 4 所示。

美国假彩色
图 4. 美国 2015 年 Landsat 7 假彩色合成图。

全球森林变化数据集的一个精美可视化图表显示了 2000 年的森林面积(绿色)、森林损失(红色)和森林增加(蓝色)。具体来说,将 loss 设置为第一个频段(红色),将 treecover2000 设置为第二个频段(绿色),并将 gain 设置为第三个频段(蓝色):

代码编辑器 (JavaScript)

Map.addLayer(gfc2014, {bands: ['loss', 'treecover2000', 'gain']}, 'green');

损失和增益频段值是二进制的,因此在图片上几乎不可见,图片应类似于图 5。

美国森林覆盖率
图 5. 美国 2000 年的树木覆盖率(绿色)。

我们希望森林损失显示为鲜红色,森林增加显示为鲜蓝色。 为了解决这个问题,我们可以使用可视化参数 max 来设置图像数据的拉伸范围。请注意,max 可视化参数接受一个值列表,对应于每个频段的最大值:

代码编辑器 (JavaScript)

Map.addLayer(gfc2014, {
  bands: ['loss', 'treecover2000', 'gain'],
  max: [1, 255, 1]
}, 'forest cover, loss, gain');

结果应如图 6 所示。

美国森林变化
图 6. 美国森林损失(红色)、2000 年森林覆盖率(绿色)和森林增加量(蓝色)。

这样一来,森林区域会显示为绿色,森林损失区域会显示为红色,森林增加区域会显示为蓝色,同时存在森林增加和损失的区域会显示为紫红色。不过,仔细检查后会发现,这并不完全正确。损失标记为橙色,而不是红色。这是因为亮红色像素与下方的绿色像素混合后会产生橙色像素。同样,森林、损失和增益所在的像素为粉色,即绿色、鲜红色和鲜蓝色的组合。 有关说明,请参见图 7。

太平洋西北地区森林变化
图 7. 美国太平洋西北地区森林损失(红色)、2000 年覆盖率(绿色)和增加量(蓝色)。

如需获得本教程开头承诺的图片,您可以分别创建森林图、损失图、增益图以及同时包含损失和增益的图。按最适合展示的顺序将这些图片添加到地图中。

调色板

如需以不同颜色显示每张图片,您可以针对单波段图片使用 Map.addLayer()palette 参数。借助调色板,您可以设置图片显示的配色方案(详细了解调色板)。回想一下 Earth Engine API 教程中的内容,调色板中的颜色会线性拉伸到 minmax

例如,如需使用绿色调色板显示森林范围图片,您可以使用:

代码编辑器 (JavaScript)

Map.addLayer(gfc2014, {
  bands: ['treecover2000'],
  palette: ['000000', '00FF00']
}, 'forest cover palette');

结果应如图 8 所示。

森林面积 NA
图 8. 2000 年北美洲的森林覆盖率。

放大可更好地了解影像的分辨率。图 9 显示了巴拉圭马里斯卡尔·埃斯蒂加里维亚附近的一个区域。

巴拉圭的森林面积
图 9. 2000 年巴拉圭马里斯卡尔埃斯蒂加里维亚周围的森林覆盖率。

图 3 中显示的图片有点暗。问题在于,treecover2000 波段具有字节数据类型 ([0, 255]),但实际上这些值是百分比 ([0, 100])。如需调亮图片,您可以相应地设置 min 和/或 max 参数。然后,在这些极值之间拉伸调色板。

代码编辑器 (JavaScript)

Map.addLayer(gfc2014, {
  bands: ['treecover2000'],
  palette: ['000000', '00FF00'],
  max: 100
}, 'forest cover percent');

结果应如图 9 所示。请注意,在此示例中,仅设置了 maxmin 的默认值为零。

拉伸的巴拉圭
图 9. 2000 年巴拉圭马里斯卡尔埃斯蒂加里维亚周围的森林覆盖率,已拉伸到 [0, 100]。

遮盖

到目前为止,我们展示的所有图片都包含大片黑色区域,这些区域的数据为零。例如,海洋中没有树木。如需使这些区域透明,您可以遮盖其值。Earth Engine 中的每个像素都包含一个值和一个掩码。系统会根据遮罩设置的透明度来渲染图片,其中 0 表示完全透明,1 表示完全不透明。

您可以使用图片本身来遮盖图片。例如,如果您使用 treecover2000 波段本身进行遮盖,则森林覆盖率为零的所有区域都将变为透明:

代码编辑器 (JavaScript)

Map.addLayer(gfc2014.mask(gfc2014), {
  bands: ['treecover2000'],
  palette: ['000000', '00FF00'],
  max: 100
}, 'forest cover masked');

结果应如图 10 所示。

美洲的树木覆盖率
图 10. 2000 年的树木覆盖率,经过拉伸和遮盖。

示例

几乎可以像本教程开头那样直观地呈现 Hansen 数据。在此示例中,我们将所有内容整合在一起,但略有不同。我们不再在 Map.addLayer 调用中指定 bands 参数,而是使用 select() 创建新图片:

代码编辑器 (JavaScript)

var treeCover = gfc2014.select(['treecover2000']);
var lossImage = gfc2014.select(['loss']);
var gainImage = gfc2014.select(['gain']);

// Add the tree cover layer in green.
Map.addLayer(treeCover.updateMask(treeCover),
    {palette: ['000000', '00FF00'], max: 100}, 'Forest Cover');

// Add the loss layer in red.
Map.addLayer(lossImage.updateMask(lossImage),
            {palette: ['FF0000']}, 'Loss');

// Add the gain layer in blue.
Map.addLayer(gainImage.updateMask(gainImage),
            {palette: ['0000FF']}, 'Gain');

结果应如图 11 所示。

美洲的损失增益
图 11. 森林损失(红色)、2000 年的森林覆盖率(绿色)和森林增加(蓝色)。

请注意,有三个 addLayer() 调用。每次调用 addLayer() 都会向地图添加一个图层。将鼠标悬停在地图右上角的图层按钮上,即可显示这些图层。您可以使用图层旁边的复选框关闭或开启每个图层,还可以使用图层名称旁边的滑块调整图层的不透明度。

我们几乎可以制作出教程开头显示的图片了。不过,缺少显示同时存在损失和增益的像素的图层。之所以缺少这一步,是因为我们需要先了解如何对影像波段执行一些计算,然后才能计算出哪些像素同时显示损失和增益。这正是下一部分的主题。