Earth Engine 中的 Hansen 等人 (2013)
全球森林变化数据集表示 2000 年至 2014 年间全球森林变化情况,分辨率为 30 米。首先,我们将 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。 | 0 - 12 |
| first_b30 | Landsat 7 红色波段,基于 2000 年的首个有效像素(如果 2000 年没有有效像素,则使用更早年份的像素)构建。 | 0 - 255 |
| first_b40 | Landsat 7 近红外波段,由 2000 年的首批有效像素构建。 | 0 - 255 |
| first_b50 | 第一个 Landsat 7 短波红外波段,由 2000 年的第一个有效像素构建。 | 0 - 255 |
| first_b70 | 第二个 Landsat 7 短波红外波段,由 2000 年的首批有效像素构建。 | 0 - 255 |
| last_b30 | Landsat 7 红色波段,基于 2012 年最新有效像素构建。 | 0 - 255 |
| last_b40 | Landsat 7 近红外波段,由 2012 年最新有效像素构建。 | 0 - 255 |
| last_b50 | 第一个 Landsat 7 短波红外波段,由 2012 年的最新有效像素构建。 | 0 - 255 |
| last_b70 | 根据 2012 年最新有效像素构建的第二个 Landsat 7 短波红外波段。 | 0 - 255 |
| datamask | 无数据 (0)、已测绘的地表 (1) 和永久性水体 (2)。 | 0、1、2 |
如需将 2000 年的森林覆盖率显示为灰度图像,您可以使用 treecover2000 波段,该波段在 Map.addLayer() 的第二个参数中指定:
代码编辑器 (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() 都会向地图添加一个图层。将鼠标悬停在地图右上角的图层按钮上,即可显示这些图层。您可以使用每个图层旁边的复选框来关闭或开启该图层,并且图层的不透明度会受到图层名称旁边的滑块的影响。
我们很快就能制作出本教程开头所示的图片。但是,缺少显示同时存在损失和增加的像素的图层。之所以缺少,是因为我们需要先了解如何对图像波段执行一些计算,然后才能计算哪些像素同时显示损失和增加。这是下一部分的主题。