晋江文学城
下一章 上一章  目录  设置

10、十识 第1节:过 ...

  •   第1节:过滤图像集合

      我们将首先访问CHIRPS Pentad 集合并对其进行过滤以创建一年的时间序列。
      var chirps=ee.ImageCollection(\'UCSB-CHG/CHIRPS/PENTAD\');
      var startDate=\'2019-01-01\';
      var endDate=\'2020-01-01\';
      var yearFiltered=chirps.filter(ee.Filter.date(startDate, endDate));

      print(yearFiltered, \'Date-filtered CHIRPS images\');

      CHIRPS 集合包含每个五位图的一张图像。上面的过滤集合被过滤为包含一年,相当于72个全局图像。如果你在控制台中展开打印的集合,你将能够看到单个图像的元数据;请注意,它们的日期戳表明它们每五天均匀间隔一次。

      每个图像的像素值存储五点期间的总降水量。如果没有聚合到与其他数据集匹配的时期,这些图层就不是很有用。对于水文分析,我们通常需要每月或一个季节的总降水量。让我们聚合这个集合,以便我们有12个图像-每月一张图像,其像素值代表该月的总降水量。

      第2节:使用日期
      为了聚合时间序列,我们需要学习如何以编程方式创建和操作日期。本节介绍ee的一些函数。有用的日期模块。

      Earth Engine API 有一个名为ee的函数。Date.fromYMD旨在根据年、月和日值创建日期对象。以下代码片段显示如何定义包含年份值的变量并从中创建日期对象。将以下代码粘贴到新脚本中:
      var chirps=ee.ImageCollection(\'UCSB-CHG/CHIRPS/PENTAD\');
      var year=2019;
      var startDate=ee.Date.fromYMD(year, 1, 1);

      现在,让我们确定如何创建结束日期以便能够指定所需的时间间隔。创建相对于另一个日期的日期的p引用方法是使用advance函数。它需要两个参数——增量值和时间单位——并返回一个新日期。下面的代码显示了如何创建给定日期以后一年的日期。将其粘贴到你的脚本中。

      var endDate=startDate.advance(1, \'year\');
      接下来,粘贴下面的代码以使用这些计算的日期执行 CHIRPS 数据的过滤。运行后,通过查找打印结果中图像的日期来检查你是否已准确设置日期。

      var yearFiltered=chirps
      .filter(ee.Filter.date(startDate, endDate));
      print(yearFiltered, \'Date-filtered CHIRPS images\');

      Earth Engine 中非常常用的另一个日期函数是millis.此函数采用日期对象并返回自1970年开始的任意参考日期以来的毫秒数:1970-01-01T00:00:00Z。这被称为“Unix 时间戳”;它是将日期转换为数字的标准方法,可以轻松地以高精度比较日期。Earth Engine 对象将图像和要素的时间戳存储在名为system:time_start 和system:time_end 的特殊属性中。这两个属性都需要提供数字而不是日期,并且millis 函数可以帮助你做到这一点。你可以打印调用该函数的结果并自行检查。

      print(startDate, \'Start date\');
      print(endDate, \'End date\');

      print(\'Start date as timestamp\', startDate.millis());
      print(\'End date as timestamp\', endDate.millis());

      当我们需要设置聚合图像的system:time_start 和system:time_end属性时,我们将在下一节中使用millis函数。

      第3节:聚合图像
      现在我们可以开始将五元数汇总为每月的总和。聚合过程有两个基本步骤。第一个是确定一个时间间隔(在本例中为一个月)的开始日期和结束日期,第二个是对每个时间间隔内的所有值(在本例中为五位)求和。首先,我们可以设想生成的系列将包含12张图像。为了准备为每个月创建图像,我们创建一个ee从 1到12的值列表。我们可以使用ee.List.sequence 函数

      // Aggregate this time series to compute monthly images.
      // Create a list of months
      var months=ee.List.sequence(1, 12);

      接下来,我们编写一个函数,以一个月作为输入并返回该月的聚合图像。将beginMonth 作为输入参数,我们首先根据年份和月份变量创建该月的开始日期和结束日期。然后我们过滤集合以查找该月的所有图像。为了创建月降水量图像,我们应用ee.Reducer.sum 将一个月的六个五元组图像减少为单个图像,其中包含五元组的总和值。我们还明确设置了生成的求和图像的时间戳属性system:time_start 和system:time_end 我们还可以设置年份和月份,这将帮助我们稍后过滤结果集合。

      // Write a function that takes a month number
      // and returns a monthly image.
      var createMonthlyImage=function(beginningMonth){
      var startDate=ee.Date.fromYMD(year, beginningMonth, 1);
      var endDate=startDate.advance(1, \'month\');
      var monthFiltered=yearFiltered
      .filter(ee.Filter.date(startDate, endDate));

      // Calculate total precipitation.
      var total=monthFiltered.reduce(ee.Reducer.sum());
      return total.set({
      \'system:time_start\': startDate.millis(),
      \'system:time_end\': endDate.millis(),
      \'year\': year,
      \'month\': beginningMonth
      });
      };

      我们现在有一个ee包含ee 类型项目的列表。从 1到12的数字,具有可以计算每个月数字的每月聚合图像的函数。剩下要做的就是将函数映射到列表上。正如章节中所描述的。map 函数传递列表中的每个图像并运行createMonthlyImage.该函数首先接收数字“1”并执行,将图像返回给 Earth Engine。然后它在数字“2”上运行,依此类推,对所有12个数字运行。结果是一年中每个月的每月图像列表。

      // map() the function on the list of months
      // This creates a list with images for each month in the list
      var monthlyImages=months.map(createMonthlyImage);

      我们可以从这个ee创建一个ImageCollection使用ee的图像列表。

      ImageCollection.fromImages 函数。
      // Create an ee.ImageCollection.
      var monthlyCollection=ee.ImageCollection.fromImages(monthlyImages);
      print(monthlyCollection);

      现在,我们已经通过过滤、映射和缩减成功地从源ImageCollection计算出聚合集合,在控制台中展开打印的集合,你可以验证新创建的ImageCollection中现在有12个图像。

      第4节绘制时间序列
      网格化降水数据集的一项有用应用是分析降雨模式。我们可以使用新计算的时间序列绘制某个位置的时间序列图表。我们可以绘制任何给定点或多边形的像素值。这里我们为给定的坐标创建一个点几何图形。继续上一节的脚本,粘贴以下代码:

      // Create a point with coordinates for the city of Bengaluru, India.
      var point=ee.Geometry.Point(77.5946, 12.9716);

      Earth Engine 带有一个内置的ui。Chart.image.series 函数可以绘制时间序列。除了imageCollection 和区域参数之外,我们还需要提供比例值。CHIRPS数据目录页面表明数据的分辨率为5566米,因此我们可以使用它作为比例尺。生成的图表将打印在控制台中。

      var chart=ui.Chart.image.series({
      imageCollection: monthlyCollection,
      region: point,
      reducer: ee.Reducer.mean(),
      scale: 5566,
      });
      print(chart);

      我们可以通过添加轴标签和标题来使图表提供更多信息。setOptions函数允许我们使用Google Charts中的参数自定义图表。要自定义图表,请将以下代码粘贴到脚本底部。效果将是在编辑器中看到两张图表:一张显示旧的数据视图,一张显示自定义图表。

      var chart=ui.Chart.image.series({
      imageCollection: monthlyCollection,
      region: point,
      reducer: ee.Reducer.mean(),
      scale: 5566
      }).setOptions({
      lineWidth: 1,
      pointSize: 3,
      title: \'Monthly Rainfall at Bengaluru\',
      vAxis:{
      title: \'Rainfall (mm)\'
      },
      hAxis:{
      title: \'Month\',
      gridlines:{
      count: 12
      }
      }
      });
      print(chart);
      定制图表显示了印度班加罗尔市的典型降雨模式。班加罗尔气候温和,四月和五月的季风前降雨使城市凉爽,六月至九月是温和的季风季节。

  • 昵称:
  • 评分: 2分|鲜花一捧 1分|一朵小花 0分|交流灌水 0分|别字捉虫 -1分|一块小砖 -2分|砖头一堆
  • 内容:
  •             注:1.评论时输入br/即可换行分段。
  •                 2.发布负分评论消耗的月石并不会给作者。
  •             查看评论规则>>