当前位置: 首页 > article >正文

基于 GEE 的 MODIS 数据集 NDVI 时间序列动画

目录

1 前言

2 获取 MODIS NDVI 系列

3 定义裁剪和区域边界几何

4 按合成日期将图像分组

5 减少组合组

6 制作可视化图像

7 创建动画 GIF

8 完整代码

9 运行结果


1 前言

地球观测影像的时间序列动画引人入胜且富有吸引力。在本教程中,您将学习如何生成一个动画GIF,表示跨越1月1日至12月31日的连续16天MODIS合成影像的20年中位NDVI。

MODIS是一种中等分辨率的卫星成像系统,NDVI是一种常见的基于反射率的植被指数。地球引擎数据目录提供了NDVI作为一个预先计算的数据集,以方便方便。在上面的动画中,NDVI被映射到从棕褐色到深绿色的颜色梯度,代表着低到高的光合能力(低到高的植被覆盖率/密度/生产力)。植被的潮汐样纬度变化与太阳全年相对于赤道在北23.5°到南23.5°之间移动有关。世界各地在小尺度和大尺度上都发现了类似的植被生产力的季节性模式。

基本工作流程如下:
获取MODIS植被指数数据集和NDVI波段的子集;
定义感兴趣的区域和动画帧几何图形;
使用连接对来自相同的年度16天复合窗口的图像进行分组;
按中位数减少合成组合,以生成动画帧;
定义可视化参数,并将数据转换为RGB可视化图像;
生成一个将在浏览器中生成GIF的URL。

2 获取 MODIS NDVI 系列

检索 MODIS Terra Vegetation Indices 16-Day Global 1km 数据集并选择 NDVI 波段。

var col = ee.ImageCollection('MODIS/006/MOD13A2').select('NDVI');

3 定义裁剪和区域边界几何

剪切数据是一个可选的步骤,它将感兴趣区域外的像素设置为空,这有助于引起人们对区域内特定区域的注意。在这里,大规模国际边界(LSIB)向量数据集被过滤,只包括组成非洲的几何集合,其联合作为剪切几何。当应用时,非洲以外的所有像素都将为空。接下来,定义一个描述所需动画的矩形范围的多边形。在您自己的应用程序中,您可以通过各种方式来定义这两种几何图形。但是,请注意,非常大的区域范围可能会超出用于生成动画GIF的功能的限制,在这种情况下,将在控制台中打印一个错误。请注意,您还可以上传形状文件并将它们导入为对象。

// Define a mask to clip the NDVI data by.
var mask = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017')
  .filter(ee.Filter.eq('wld_rgn', 'Africa'));

// Define the regional bounds of animation frames.
var region = ee.Geometry.Polygon(
  [[[-18.698368046353494, 38.1446395611524],
    [-18.698368046353494, -36.16300755581617],
    [52.229366328646506, -36.16300755581617],
    [52.229366328646506, 38.1446395611524]]],
  null, false
);

4 按合成日期将图像分组

构成动画每一帧的数据是从2000年到2019年,每年相同的16天复合数据的20年NDVI中位数。生成这些中值组合是本教程的关键。第一步是将代表相同的16天复合窗口的年际图像数据分组到列表中。为此,需要添加到每个图像的元数据中的日历日期,以便有一个要进行分组(连接)的公共属性。年之日(DOY)是一种很好的格式,可以使用该方法从无处不在的属性中推导出。

col = col.map(function(img) {
  var doy = ee.Date(img.get('system:time_start')).getRelative('day', 'year');
  return img.set('doy', doy);
});

将实现一个连接操作,通过刚刚添加的“doy”属性对图像进行分组。连接操作需要两个集合,在本例中是:一个不同的DOY集合和一个被修改为包含“DOY”属性的完整集合。完整的集合()存在,需要定义不同的集合。通过将完整的收集过滤到一年的数据,例如2013年。

var distinctDOY = col.filterDate('2013-01-01', '2014-01-01');

通过以下方式完成联接:
创建一个筛选条件,用于识别 distinct 和 按属性完成集合doy;
定义一个连接,该连接将生成每个 在名为 'doy_matches' 的属性中区分 'doy'saveAll;
应用联接。

// Define a filter that identifies which images from the complete collection
// match the DOY from the distinct DOY collection.
var filter = ee.Filter.equals({leftField: 'doy', rightField: 'doy'});

// Define a join.
var join = ee.Join.saveAll('doy_matches');

// Apply the join and convert the resulting FeatureCollection to an
// ImageCollection.
var joinCol = ee.ImageCollection(join.apply(distinctDOY, col, filter));

结果()是不同DOY集合的副本,每个图像()添加一个属性,该属性列出来自完整集合()的所有图像,对于给定的不同DOY图像具有相同DOY的图像。

5 减少组合组

从具有相同DOY的图像列表中,可以创建一个集合,然后减少到其成分的中位数。将这个选项映射到新集合中的每个不同的DOY图像上。结果是一个新的集合,每个不同的DOY复合物有一张图像,代表其20年每像素的中值NDVI。要达到这一点,需要做一些工作,但使用基于数据总体的集中趋势统计可以产生一个年度时间序列动画,没有缺失数据和异常值(即动画噪声较小)。

// Apply median reduction among matching DOY collections.
var comp = joinCol.map(function(img) {
  var doyCol = ee.ImageCollection.fromImages(
    img.get('doy_matches')
  );
  return doyCol.reduce(ee.Reducer.median());
});

6 制作可视化图像

设置可视化属性以控制数据在动画帧中的外观。该方法可以将单波段图像(如NDVI)转换为3波段RGB伪彩色图像。定义可视化属性,包括调色板和最小值和最大值,以在两者之间拉伸调色板。使用定义的可视化属性将该方法映射到每个图像上,并将数据剪辑到步骤2中定义的掩码,以将背景像素设置为null(黑色)。

// Define RGB visualization parameters.
var visParams = {
  min: 0.0,
  max: 9000.0,
  palette: [
    'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
    '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
    '012E01', '011D01', '011301'
  ],
};

// Create RGB visualization images for use as animation frames.
var rgbVis = comp.map(function(img) {
  return img.visualize(visParams).clip(mask);
});

7 创建动画 GIF

最后一步是定义方法的参数,该 将从 RGB 可视化图像的集合中创建动画 在上一步中生成。

region:设置为上述步骤 2 中定义的区域;
dimensions:设置为 600,这会将生成的 GIF 的较大尺寸定义为 600 像素(较小的尺寸 按比例缩放);
crs:设置为 'EPSG:3857' 以匹配代码编辑器地图的坐标参考系统;
framesPerSecond:设置为 10(每秒帧数)。

// Define GIF visualization parameters.
var gifParams = {
  'region': region,
  'dimensions': 600,
  'crs': 'EPSG:3857',
  'framesPerSecond': 10
};

// Print the GIF URL to the console.
print(rgbVis.getVideoThumbURL(gifParams));

在运行此代码块后,一个URL将被打印到控制台上。在访问URL后,地球引擎服务器将完成实时生产GIF所需的工作。当任务完成后,动画将出现在浏览器中。

或者,您也可以使用该功能直接在控制台中渲染动画。

// Render the GIF animation in the console.
print(ui.Thumbnail(rgbVis, gifParams));

一旦动画出现,您可以通过右键单击图像来显示其上下文菜单。请选择适当的选项,以便将该文件下载到您的计算机上。

8 完整代码

var col = ee.ImageCollection('MODIS/006/MOD13A2').select('NDVI');

// Define a mask to clip the NDVI data by.
var mask = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017')
  .filter(ee.Filter.eq('wld_rgn', 'Africa'));

// Define the regional bounds of animation frames.
var region = ee.Geometry.Polygon(
  [[[-18.698368046353494, 38.1446395611524],
    [-18.698368046353494, -36.16300755581617],
    [52.229366328646506, -36.16300755581617],
    [52.229366328646506, 38.1446395611524]]],
  null, false
);

col = col.map(function(img) {
  var doy = ee.Date(img.get('system:time_start')).getRelative('day', 'year');
  return img.set('doy', doy);
});

var distinctDOY = col.filterDate('2013-01-01', '2014-01-01');

// Define a filter that identifies which images from the complete collection
// match the DOY from the distinct DOY collection.
var filter = ee.Filter.equals({leftField: 'doy', rightField: 'doy'});

// Define a join.
var join = ee.Join.saveAll('doy_matches');

// Apply the join and convert the resulting FeatureCollection to an
// ImageCollection.
var joinCol = ee.ImageCollection(join.apply(distinctDOY, col, filter));

// Apply median reduction among matching DOY collections.
var comp = joinCol.map(function(img) {
  var doyCol = ee.ImageCollection.fromImages(
    img.get('doy_matches')
  );
  return doyCol.reduce(ee.Reducer.median());
});

// Define RGB visualization parameters.
var visParams = {
  min: 0.0,
  max: 9000.0,
  palette: [
    'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
    '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
    '012E01', '011D01', '011301'
  ],
};

// Create RGB visualization images for use as animation frames.
var rgbVis = comp.map(function(img) {
  return img.visualize(visParams).clip(mask);
});

// Define GIF visualization parameters.
var gifParams = {
  'region': region,
  'dimensions': 600,
  'crs': 'EPSG:3857',
  'framesPerSecond': 10
};

// Print the GIF URL to the console.
print(rgbVis.getVideoThumbURL(gifParams));

// Render the GIF animation in the console.
print(ui.Thumbnail(rgbVis, gifParams));

9 运行结果

利用MODIS数据基于GEE计算NDVI随时间变化的动画

http://www.kler.cn/a/471626.html

相关文章:

  • Linux的proc目录与什么有关?【以及它里面的文件各自记录着什么信息】
  • Linux 正则表达式 ⑪
  • 基于RedHat9部署WordPress+WooCommerce架设购物网站
  • 高等数学-----极限、函数、连续
  • 「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
  • 字玩FontPlayer开发笔记5 Tauri初体验
  • FPGA与IC:选哪个更好?
  • 基于微信小程序疫苗预约系统ssm+论文源码调试讲解
  • 计算机网络之---网络拓扑
  • 教育咨询系统架构与功能分析
  • Android车载音频系统目录
  • pycharm-pyspark 环境安装
  • Koi技术教程-Tauri基础教程-第二节 Tauri的核心概念下
  • 02- 三自由度串联机械臂运动学分析
  • 【MySQL系列文章】Linux环境下安装部署MySQL
  • Quartz如何实现分布式调度
  • 4. 多线程(2)---线程的状态和多线程带来的风险
  • 如何用代码提交spark任务并且获取任务权柄
  • 大数据技术(八)—— HBase数据读写流程和Api的使用
  • uniapp打包到宝塔并发布
  • 使用python将自己的程序封装成API
  • 使用Python实现医疗物联网设备:构建高效医疗监测系统
  • 快速排序进阶版(加入插入排序提高其性能)
  • 【代码随想录】刷题记录(93)-无重叠区间
  • Requests-数据解析bs4+xpath
  • UWB实操:用信号分析仪(频谱分析仪)抓取UWB频域的图像