首页 > 其他分享 >基于 GEE 的 MODIS 数据集 NDVI 时间序列动画

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

时间:2025-01-08 16:34:01浏览次数:3  
标签:MODIS 动画 ee DOY doy GEE var 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随时间变化的动画

标签:MODIS,动画,ee,DOY,doy,GEE,var,NDVI
From: https://blog.csdn.net/ZK180531/article/details/144989142

相关文章

  • 基于 GEE Sentinel-1 数据集提取水体
    目录1水体提取原理2完整代码3运行结果1水体提取原理水体提取是地理信息和遥感技术的关键应用之一,对于多个领域都具有重要的应用价值。它有助于更好地管理水资源,保护环境,减少灾害风险,促进可持续发展,以及确保饮用水供应的安全。水体提取技术的不断发展和改进将进一步......
  • 基于 GEE Landsat C02 数据集合成 1986-2023 年的逐年年均 NDVI、多年均值、多年均值
    目录1完整代码2运行结果1完整代码//感兴趣的区域信息varroi=ee.FeatureCollection('projects/ee-zhangkanghnust/assets/HengShaoLou');Map.centerObject(roi);Map.addLayer(roi,{'color':'grey'},'roi');//Appliesscalingfactors.......
  • wx.onLocationChangeError
    wx.onLocationChangeError(functionlistener)基础库2.19.5开始支持,低版本需做兼容处理。小程序插件:不支持微信鸿蒙OS版:支持功能描述监听持续定位接口返回失败时触发。参数functionlistener的监听函数参数Objectres属性类型说明errCodenumber错......
  • 使用 `hash-wasm` 的 `createMD5`方法,生成md5值,批处理500张图片会报错, `RangeError: W
    处理大量文件时遇到RangeError:WebAssembly.instantiate():Outofmemory错误,通常是因为一次性创建了过多的WebAssembly实例,导致内存不足。每个createMD5()调用都会创建一个新的WebAssembly实例,这对于大量的并发操作来说是不可行的。为了优化代码并避免此问题,可以考虑......
  • 气象数据在CASA模型中的应用及实际案例讲解(植被、陆地生态系统、植被净初级生产力NPP
    CASA模型(Carnegie-Ames-StanfordApproach)是一个基于光合作用和呼吸作用过程的生态系统生产力模型。在实际应用中,气象数据是CASA模型的关键输入之一,用于模拟植被的光合作用和呼吸作用。本文将介绍如何结合气象数据实现CASA模型,并提供一个实际案例CASA模型需要的气象数据主要包......
  • 两款卸载工具Geek & UninstallTool功能对比
    卸载功能Geek:提供普通卸载、强制卸载和批量卸载等方式,能自动扫描并列出计算机上所有应用程序,卸载后自动查找并清理残留痕迹,还可卸载系统组件、隐藏组件及Windows商店应用。UninstallTool:除常规卸载外,强制卸载功能强大,可移除系统自带程序功能无法删除的程序。支持批量卸载,能......
  • GEE 案例:利用MODIS数据和大津法对NDWI指数进行阈值提取分析
    目录简介数据大津法代码简介利用MODIS数据和大津法对NDWI指数进行阈值提取分析数据MODIS/061/MOD09A1数据是由美国国家航空航天局(NASA)的MODIS(ModerateResolutionImagingSpectroradiometer)卫星获取的地表反射率数据。这些数据记录了每个像元的红、近红外和短波红......
  • GEE 案例——Landsat 8 C02数据地形矫正(替换原有Landsat C01的地形校正)
    目录简介地形校正几何校正提示代码结果简介因为原始的LandsatC01数据已经下架,所以这里我们重新进行了地形校正,原有的博客链接:GEE教程——如何利用strm数据对Landsat8数据进行地形校正_landsat8快速几何矫正-CSDN博客遥感影像的地形校正和集合校正是遥感图像处理......
  • kafka发送的消息太大报异常了RecordTooLargeException
    当Kafka发送的消息太大时,确实可能会报异常。Kafka默认的消息大小限制是1MB(即1048576字节),如果生产者尝试发送一个大于此限制的消息,Kafka将会拒绝并抛出异常,通常是RecordTooLargeExceptionmessage.max.bytes是Kafka中的Broker配置,而不是生产者配置。这个参数用于控制KafkaBroker能......
  • 【eCognition初学3】基于分割对象提取特征(图层值特征,几何特征,自定义特征/如NDVI,纹理特
            eCognition中常用的对象特征有自定义特征(如计算NDVI等植被指数),图层值特征,几何特征,纹理特征。(1)ImageObjectInformation中显示从影像分割后生成的影像对象(图像区域)的详细静态属性数据或特征。  (2)FeatureView提供了一个交互式的可视化环境,帮助用户筛选、......