图片集合是指一组 Earth Engine 图片。例如,所有 Landsat 8 图像的集合就是一个 ee.ImageCollection。与您一直在使用的 SRTM 影像一样,影像集合也有一个 ID。与单张图片一样,您可以通过在代码编辑器中搜索 Earth Engine Data Catalog并查看数据集的详情页面,来发现图片集的 ID。例如,搜索“landsat 8 toa”,然后点击第一个结果,该结果应对应于
USGS Landsat 8 Collection 1 Tier 1 TOA Reflectance 数据集。使用导入按钮导入该数据集并将其重命名为 l8,或者将 ID 复制到图片集合构造函数中:
代码编辑器 (JavaScript)
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
过滤映像集合
值得注意的是,此集合代表在全球范围内收集的每个 Landsat 8 场景。提取单个图片或图片子集来测试算法通常很有用。按时间或空间限制集合的方法是过滤集合。例如,如需将集合过滤为覆盖特定位置的图片,请先使用几何图形绘制工具通过点(或线或多边形)定义感兴趣的区域。平移到您感兴趣的区域,将鼠标悬停在几何图形导入上(如果您已经定义了一个或多个几何图形),然后点击 + 新图层(如果您没有任何导入,请转到下一步)。获取点绘制工具 (
),并在您感兴趣的区域中创建一个点。将导入命名为 point。现在,过滤 l8 集合,仅获取与该点相交的图像,然后添加第二个过滤条件,将集合限制为仅包含 2015 年获取的图像:
代码编辑器 (JavaScript)
var spatialFiltered = l8.filterBounds(point); print('spatialFiltered', spatialFiltered); var temporalFiltered = spatialFiltered.filterDate('2015-01-01', '2015-12-31'); print('temporalFiltered', temporalFiltered);
在这里,filterBounds() 和 filterDate() 是更通用的 filter() 方法的快捷方法,该方法适用于图片集合,并接受 ee.Filter() 作为其参数。浏览代码编辑器的文档标签页,详细了解这些方法。filterBounds() 的实参是您数字化的点,filterDate() 的实参是两个日期(以字符串表示)。
请注意,您可以print()过滤后的集合。您一次最多只能打印 5,000 个内容,因此无法打印整个 l8 集合。执行 print() 方法后,您可以在控制台中检查输出的集合。请注意,当您使用 zippy () 展开
ImageCollection,然后展开 features 列表时,您会看到一个映像列表,其中每个映像也可以展开和检查。这是发现单个图片 ID 的一种方法。另一种更程序化的方法是,对集合进行排序,以获取相对于某些元数据属性的最新、最旧或最佳图片。例如,通过检查输出的图片集合中的图片对象,您可能已经观察到一个名为 CLOUD_COVER 的元数据属性。您可以使用该属性获取 2015 年关注区域内云量最少的图片:
代码编辑器 (JavaScript)
// This will sort from least to most cloudy. var sorted = temporalFiltered.sort('CLOUD_COVER'); // Get the first (least cloudy) image. var scene = sorted.first();
现在,您可以显示图片了!
离题:显示 RGB 图片
将多波段图像添加到地图时,Earth Engine 会选择图像的前三个波段,并默认将其显示为红色、绿色和蓝色,然后根据数据类型对其进行拉伸,如前所述。通常,这样做是不行的。例如,如果您将 Landsat 影像(上一个示例中的 scene)添加到地图中,结果并不令人满意:
代码编辑器 (JavaScript)
Map.centerObject(scene, 9); Map.addLayer(scene, {}, 'default RGB');
请注意,首先,地图以缩放比例 9 居中显示图片。然后,系统会显示图片,并为 visParams 参数提供一个空对象 ({})(如需了解详情,请参阅 Map.addLayer() 文档)。因此,系统会使用默认可视化效果显示图像:前三个波段分别映射到 R、G、B,并拉伸到 [0, 1],因为这些波段是 float 数据类型。这意味着,沿海气溶胶波段(“B1”)以红色呈现,蓝色波段(“B2”)以绿色呈现,绿色波段(“B3”)以蓝色呈现。如需将图片渲染为真彩色合成图片,您需要指示 Earth Engine 分别使用 Landsat 8 波段“B4”“B3”和“B2”来表示 R、G 和 B。使用 visParams 对象的 bands 属性指定要使用的波段。如需详细了解 Landsat 波段,请参阅此参考文档。
您还需要提供适合显示典型地球表面目标反射率的 min 和 max 值。虽然可以使用列表为每个波段指定不同的值,但在这里,只需将 0.3 指定为 max 并为 min 参数使用默认值零即可。将可视化参数合并到一个对象中并显示:
代码编辑器 (JavaScript)
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3}; Map.addLayer(scene, visParams, 'true-color composite');
结果应如图 5 所示。请注意,此代码会将可视化参数对象分配给一个变量,以供将来可能使用。您很快就会发现,该对象在直观呈现图片集合时非常有用!
尝试可视化不同的波段。另一种常用的组合是“B5”“B4”和“B3”,称为假彩色合成。此处介绍了其他一些有趣的假彩色合成。
由于 Earth Engine 专为进行大规模分析而设计,因此您不限于仅处理一个场景。现在,您可以将整个集合显示为 RGB 复合图像了!
显示图片合集
向地图添加图片集合与向地图添加图片类似。例如,使用 l8 集合中的 2016 年图片和之前定义的 visParams 对象,
代码编辑器 (JavaScript)
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31'); Map.addLayer(landsat2016, visParams, 'l8 collection');
请注意,现在您可以缩小并查看 Landsat 图像采集区域(即陆地上空)的连续拼接图。另请注意,当您使用检查器标签页并点击图片时,您会在检查器的像素部分看到像素值列表(或图表),并在对象部分看到图片对象列表。
如果您将画面缩小到一定程度,可能会注意到拼接图像中有些云。向地图添加 ImageCollection 时,它会显示为最新值合成,这意味着仅显示最新像素(就像对集合调用 mosaic() 一样)。这就是为什么您会看到在不同时间获取的路径之间存在不连续性。这也是许多区域可能显示为多云的原因。在下一页中,您将了解如何更改图片的合成方式,以去除那些令人讨厌的云!