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 的内容。

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

请注意,将多波段图像添加到地图时,系统会分别选择图像的前三个波段作为红色、绿色和蓝色,并根据每个波段的数据类型进行拉伸。之所以图像看起来是红色的,是因为前三个波段是 treecover2000
、loss
和 gain
。treecover2000
波段以百分比表示,其值远高于 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 个波段(2015 年的 Landsat 波段 5、4 和 3)的图片。此波段组合将健康植被显示为绿色,将土壤显示为淡紫色:
代码编辑器 (JavaScript)
Map.addLayer( gfc2014, {bands: ['last_b50', 'last_b40', 'last_b30']}, 'false color');
结果应如图 4 所示。

全球森林变化数据集的一个精美可视化图表显示了 2000 年的森林面积(绿色)、森林损失(红色)和森林增加(蓝色)。具体来说,将 loss
设置为第一个频段(红色),将 treecover2000
设置为第二个频段(绿色),并将 gain
设置为第三个频段(蓝色):
代码编辑器 (JavaScript)
Map.addLayer(gfc2014, {bands: ['loss', 'treecover2000', 'gain']}, 'green');
损失和增益频段值是二进制的,因此在图片上几乎不可见,图片应类似于图 5。

我们希望森林损失显示为鲜红色,森林增加显示为鲜蓝色。 为了解决这个问题,我们可以使用可视化参数 max
来设置图像数据的拉伸范围。请注意,max
可视化参数接受一个值列表,对应于每个频段的最大值:
代码编辑器 (JavaScript)
Map.addLayer(gfc2014, { bands: ['loss', 'treecover2000', 'gain'], max: [1, 255, 1] }, 'forest cover, loss, gain');
结果应如图 6 所示。

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

如需获得本教程开头承诺的图片,您可以分别创建森林图、损失图、增益图以及同时包含损失和增益的图。按最适合展示的顺序将这些图片添加到地图中。
调色板
如需以不同颜色显示每张图片,您可以针对单波段图片使用 Map.addLayer()
的 palette
参数。借助调色板,您可以设置图片显示的配色方案(详细了解调色板)。回想一下 Earth Engine API 教程中的内容,调色板中的颜色会线性拉伸到 min
和 max
。
例如,如需使用绿色调色板显示森林范围图片,您可以使用:
代码编辑器 (JavaScript)
Map.addLayer(gfc2014, { bands: ['treecover2000'], palette: ['000000', '00FF00'] }, 'forest cover palette');
结果应如图 8 所示。

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

图 3 中显示的图片有点暗。问题在于,treecover2000
波段具有字节数据类型 ([0, 255]),但实际上这些值是百分比 ([0, 100])。如需调亮图片,您可以相应地设置 min
和/或 max
参数。然后,在这些极值之间拉伸调色板。
代码编辑器 (JavaScript)
Map.addLayer(gfc2014, { bands: ['treecover2000'], palette: ['000000', '00FF00'], max: 100 }, 'forest cover percent');
结果应如图 9 所示。请注意,在此示例中,仅设置了 max
。min
的默认值为零。

遮盖
到目前为止,我们展示的所有图片都包含大片黑色区域,这些区域的数据为零。例如,海洋中没有树木。如需使这些区域透明,您可以遮盖其值。Earth Engine 中的每个像素都包含一个值和一个掩码。系统会根据遮罩设置的透明度来渲染图片,其中 0 表示完全透明,1 表示完全不透明。
您可以使用图片本身来遮盖图片。例如,如果您使用 treecover2000
波段本身进行遮盖,则森林覆盖率为零的所有区域都将变为透明:
代码编辑器 (JavaScript)
Map.addLayer(gfc2014.mask(gfc2014), { bands: ['treecover2000'], palette: ['000000', '00FF00'], max: 100 }, 'forest cover masked');
结果应如图 10 所示。

示例
几乎可以像本教程开头那样直观地呈现 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 所示。

请注意,有三个 addLayer()
调用。每次调用 addLayer()
都会向地图添加一个图层。将鼠标悬停在地图右上角的图层按钮上,即可显示这些图层。您可以使用图层旁边的复选框关闭或开启每个图层,还可以使用图层名称旁边的滑块调整图层的不透明度。
我们几乎可以制作出教程开头显示的图片了。不过,缺少显示同时存在损失和增益的像素的图层。之所以缺少这一步,是因为我们需要先了解如何对影像波段执行一些计算,然后才能计算出哪些像素同时显示损失和增益。这正是下一部分的主题。