本文介绍在谷歌地球引擎GEE中,提取多年遥感影像多个不同波段反射率数据,在GEE内绘制各波段的长时间序列走势曲线图,并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第十六篇。

  首先,我们来看一下本文需要实现的需求。我们现在希望获取某一个点位置上,Landsat 7遥感影像数据的可见光近红外4个波段的反射率数据,时间跨度是从2013年到2022年。其中,我们在提取出来指定波段、指定空间区域、指定时间范围的数据后,为了保证数据大致无误,因此希望首先可以在GEE内绘制一张包含了上述各波段在这一段时间内反射率数据的走势图,随后将反射率数据导出为.csv文件。

  知道了需求,我们即可开始代码的撰写。本文需要用到的代码如下。

var point = ee.Geometry.Point([-95.363271, 38.640067]);
var startDate = "2013-01-01";
var endDate = "2022-12-31";

var rCollection = ee.ImageCollection("LANDSAT/LE07/C02/T1_L2")
  .select(["SR_B1", "SR_B2", "SR_B3", "SR_B4"])
  .filterBounds(point)
  .filterDate(startDate, endDate);
print(rCollection)
  
var trueCollection = rCollection.map(function(image) {
  var trueImage = image.multiply(0.0000275).subtract(0.2);
  var trueImageP = image.addBands(trueImage, null, true)
  return trueImageP;
});
  
print(ui.Chart.image.series({
  imageCollection: trueCollection,
  region: point,
  reducer: ee.Reducer.mean(),
  scale: 250,
}));

var rTable = ee.FeatureCollection(trueCollection.map(function(image) {
  var date = image.date().format("yyyy-MM-dd");
  var BValue = image.reduceRegion(ee.Reducer.mean(), point, 500).get("SR_B1");
  var GValue = image.reduceRegion(ee.Reducer.mean(), point, 500).get("SR_B2");
  var RValue = image.reduceRegion(ee.Reducer.mean(), point, 500).get("SR_B3");
  var NValue = image.reduceRegion(ee.Reducer.mean(), point, 500).get("SR_B4");
  return ee.Feature(null, {date: date, Blue: BValue, Green: GValue, Red: RValue, NIR: NValue});
}));

Export.table.toDrive({
  collection: rTable,
  description: "data_table_5",
  folder: "GEE_Export",
  fileFormat: "CSV"
});

  上述代码的具体含义如下。

  首先,我们通过var point = ee.Geometry.Point([-95.363271, 38.640067]);定义一个点位point,也就是我们希望提取数据的点。随后,通过var startDate = "2013-01-01";定义起始日期startDate,表示数据获取的起始日期;var endDate = "2022-12-31";则是定义结束日期endDate,表示数据获取的结束日期。紧接着,我这里是选择通过var rCollection = ee.ImageCollection("LANDSAT/LE07/C02/T1_L2"),获取LANDSAT 7Level-2表面反射率数据集LANDSAT/LE07/C02/T1_L2

  随后,基于.select(["SR_B1", "SR_B2", "SR_B3", "SR_B4"])选择感兴趣的波段,我们这里是选择了BlueGreenRed3个可见光波段,和NIR这一近红外波段;这里我们需要用4个波段在遥感影像数据产品中的名称(也就是上述"SR_B1"这种),来获取对应的数据。接下来,我们对数据集进行空间、时间过滤,保留包含指定点位、处于指定时间范围的数据。

  其次,我们在var trueCollection = rCollection.map(function(image) { ... });这里,使用map函数对rCollection中的每个图像应用函数,并将结果保存在trueCollection中。这里的函数就是对原始的遥感影像加以辐射定标,将每个像素值乘以0.0000275,并减去0.2,得到新的图像trueImage。随后,注意需要将原始图像image和处理后的图像trueImage连接起来,形成新的图像trueImageP——这样使得我们定标后的遥感影像数据集包含有原始图像的各项属性信息(例如开始、结束时间等),才可以进行后续的绘图、导出工作。在这里,我选择通过设置image.addBands(trueImage, null, true)中第3个参数为true,直接将辐射定标的图像覆盖原有的图像,避免不必要的数据冗余。

  接下来,我们ui.Chart.image.series函数绘制时间序列图;随后使用map函数对trueCollection中的每个图像应用函数,并将结果保存在rTable中。这个函数计算了每个图像的日期和各个波段的具体数值,并将这些值作为属性添加到rTable中的每个要素。

  最后,我们即可将rTable导出为.csv文件,保存在Google Drive的指定文件夹中。

  运行上述代码,首先我们可以在GEE中看到具体的长时间序列曲线走势图;如下图所示。可以看到,走势图中的数据都已经是做过了辐射定标之后的了。

  随后,我们打开导出的.csv文件,可以看到其中具体的数据信息如下——包括了我们需要导出的4个波段与日期信息,以及其他2个系统默认导出的图像信息。

  至此,大功告成。