(GEE)2000-2020年黄河流域时序渐变图及高程模型计算 JavaScript版

文章目录

    • 一. 选取目标区域
    • 二. NDVI实现
    • 三. 高程模型DEM实现
    • 四. 时序图
    • 五. 植被覆盖类型
    • 六. 参考文献


首先推荐吴秋生老师团队开源的便捷构建网站:适用于地理空间应用的Streamlight
吴秋生老师团队的工具请自行探索。本文讲解基于GEE云开发平台实现,基于modis,黄河数据中心,LandSat7&8数据。
注意在大范围使用landsat数据集会出现黑色断条
数据集如下:

// 数据集可用性: 1999年1月至2022年4月
var dataSet_landSet7_1 = 'LANDSAT/LE07/C02/T1_L2' // Landsat 7 ETM+ Collection 2 大气校正表面反射率。表面反射率
var dataSet_landSet7_2 = "LANDSAT/LE07/C02/T1_TOA" // Landsat 7 ETM+ Collection 2 校准的大气顶部 (TOA) 反射率 大气之巅
var dataSet_landSet7_3 = "LANDSAT/LE07/C02/T1" // Landsat 7 ETM+ 集合 2 个 DN 值,表示缩放、校准的传感器辐射度  原始图像
// 数据集可用性: 20134 月至今 
var dataSet_landSet8_1 = "LANDSAT/LC08/C02/T1_L2" // Landsat 8 OLI/TIRS Collection 2 大气校正表面反射率。表面反射率
var dataSet_landSet8_2 = "LANDSAT/LC08/C02/T1_TOA" // Landsat 8 OLI/TIRS Collection 2 校准的大气顶部 (TOA) 反射率。 大气之巅
var dataSet_landSet8_3 = "LANDSAT/LC08/C02/T1" // Landsat 8 OLI/TIRS 集合 2 DN 值,表示缩放、校准的传感器辐射度。 原始图像

一. 选取目标区域

gee提供了点阵获取点位,但是较为麻烦。我选择上传shp矢量区域。该项数据来源于 黄河数据中心 以及 国家冰川冻土沙漠科学数据中心 。请自行申请数据,但其shp,dem文件地理信息有误,最好向师兄师姐要现成的shp,dem文件。。。。

在这里插入图片描述


二. NDVI实现

// 黄河范围
var scope_yellow_river_basin_shp = 'projects/ee-w782353676/assets/yellow-river'
var roi = ee.FeatureCollection(scope_yellow_river_basin_shp)
// 添加Landsat5/7/8 影像集合,添加时间波段
var start_year = 2000
var end_year = 2020
// 数据集可用性: 1999年1月至2022年4月
var dataSet_landSet7_1 = 'LANDSAT/LE07/C02/T1_L2' // Landsat 7 ETM+ Collection 2 大气校正表面反射率。表面反射率
var dataSet_landSet7_2 = "LANDSAT/LE07/C02/T1_TOA" // Landsat 7 ETM+ Collection 2 校准的大气顶部 (TOA) 反射率 大气之巅
var dataSet_landSet7_3 = "LANDSAT/LE07/C02/T1" // Landsat 7 ETM+ 集合 2 个 DN 值,表示缩放、校准的传感器辐射度  原始图像
// 数据集可用性: 2013 年 4 月至今 
var dataSet_landSet8_1 = "LANDSAT/LC08/C02/T1_L2" // Landsat 8 OLI/TIRS Collection 2 大气校正表面反射率。表面反射率
var dataSet_landSet8_2 = "LANDSAT/LC08/C02/T1_TOA" // Landsat 8 OLI/TIRS Collection 2 校准的大气顶部 (TOA) 反射率。 大气之巅
var dataSet_landSet8_3 = "LANDSAT/LC08/C02/T1" // Landsat 8 OLI/TIRS 集合 2 DN 值,表示缩放、校准的传感器辐射度。 原始图像

// =========landSat卫星 大范围区域,出现黑条=====
// function getDataSet(image){
//   return ee.ImageCollection(image)
//     .filterDate(start_year + '-01-01', end_year + '-12-31') // 筛选出指定时间的影像 
//     .filterBounds(roi) // 筛选出指定范围的影像
//     .filter(ee.Filter.lt("CLOUD_COVER",5))    //云量小于5%;  
// }
// // 合并Landsat 7/8表面反射率数据集
// var landSet7=getDataSet(dataSet_landSet7_1).map(calculateNDVI)
// var landSet8=getDataSet(dataSet_landSet8_1).map(calculateNDVI)
// var dataSet = landSet7.merge(landSet8)

// // 创建一个函数来组合Landsat 7和8的数据集并计算NDVI
// function calculateNDVI(image) {
//   var sensorId = image.get('SPACECRAFT_ID');
//   // 根据传感器ID确定近红外和红光波段名称 
//   // 在landsat8中SR_B5为近红外反射,SR_B4为红外反射。而在landsat7中SR_B4为近红外反射,SR_B3为红外反射
//   var nirBandName = sensorId === 'LANDSAT_7' ? 'SR_B4' : 'SR_B5';
//   var redBandName = sensorId === 'LANDSAT_7' ? 'SR_B3' : 'SR_B4';
//   // 计算NDVI
//   var ndvi = image.normalizedDifference([nirBandName, redBandName])
//                   .rename('NDVI');

//   // 返回带有NDVI波段的新图像
//   return image.addBands(ndvi);
// }
// ======= modis数据集 ========
var dataSet_modis = "MODIS/061/MOD13A1" // MOD13A1.061 Terra Vegetation Indices 16-Day Global 500m 
function getDataSet(image){
  return ee.ImageCollection(image)
    .filterDate(start_year + '-01-01', end_year + '-12-31') // 筛选出指定时间的影像 
    .filterBounds(roi) // 筛选出指定范围的影像
}
var dataSet = getDataSet(dataSet_modis).map(function(image){
  return image.clip(roi)
})

// 可视化NDVI
var palettes = require('users/gena/packages:palettes'),
palette = [
    'ffffff', 'ce7e45', 'df923d', 'f1b555', 'fcd163', '99b718', '74a901',
    '66a000', '529400', '3e8601', '207401', '056201', '004c00', '023b01',
    '012e01', '011d01', '011301'
  ],
NDVIL=0,
NDVIR=9000,
ndviVisParams = {
  palette: palette,
  min: NDVIL, 
  max: NDVIR
};
Map.addLayer(dataSet.select('NDVI'), ndviVisParams, 'NDVI');
// 设置地图中心
Map.centerObject(roi, 6); // 自动定位到黄河中心区域,具体级别可能需要调整
// 可选:查看航天器和传感器信息
print('航天器名称:', dataSet.aggregate_array('SPACECRAFT_ID').distinct());
print('传感器名称:', dataSet.aggregate_array('SENSOR_ID').distinct());



var geometryGradientBar = ee.Geometry.Polygon(
        [[[120.58035887483346, 35.41874649038236],
          [120.58035887483346, 35.09129359905458],
          [122.42056883577096, 35.09129359905458],
          [122.42056883577096, 35.41874649038236]]], null, false);
var yellowRiver = roi;
// Map.addLayer(yellowRiver, {}, 'Polygon');


//--------------step1.图像获取与处理----------------//
//选择产品
var col = dataSet.select('NDVI');
// 生成循环的list
var years = ee.List.sequence(2000,2020,1);
var months = ee.List.sequence(1,12,1);

/*
这里处理的基本思路是按月进行最大值合成
*/
var col =  ee.ImageCollection.fromImages(
  years.map(function (y) {
    return months.map(function(m){
      var start = ee.Date.fromYMD(y,m,1).advance(-1,"month");
      var end = ee.Date.fromYMD(y,m,1).advance(1,"month");
      var w = col.filterDate(start,end).max();    
                    
      return w.set('year', y)
              .set('month', m)
              .set('system:time_start',start);
  })}).flatten()
);


//------------step2渲染模块设定-------------//

// 添加带有标签的颜色渐变条
var style = require('users/gena/packages:style');
var utils = require('users/gena/packages:utils');
var txt = require('users/gena/packages:text');

var textProperties = {
  fontSize: 24, //*定义比例尺的字体
  textColor: 'ffffff',
  outlineColor: '000000',
  outlineWidth: 0,
  outlineOpacity: 0.8
};
var labels = ee.List.sequence(0, 1);
var gradientBar = style.GradientBar.draw(geometryGradientBar, {
  min: NDVIL, max: NDVIR, palette: palette, labels: labels,
  format: '%.0f', text: textProperties
});


var label = 'NDVI';
var scale = Map.getScale() * 2; // 修改颜色条带的尺寸
var geometryLabel = ee.Geometry.Point([114.71,33.64],'EPSG:4326');  


// 将渐变条和标签图像添加到 NDVI 图像.
var rgbVis =col.map(function(img) {
  var y = ee.Number(img.get("year")).toInt()
  var m = ee.Number(img.get("month")).toInt()
  var label = ee.String(y).cat("-").cat(m)
  var text = txt.draw(label, geometryLabel, scale, {fontSize: 24});//此处修改时间字体
  return img.visualize(ndviVisParams).clip(yellowRiver).blend(gradientBar).blend(text);
});
 

// 定义 GIF 可视化参数
var gifParams = {
  'region': yellowRiver.geometry(),
  'dimensions': 450,
  'crs': 'EPSG:4326',
  'framesPerSecond': 2,
  'format': 'gif'
};
//------------step3 GIF显示-------------//
// 将GIF打印到控制台
print(rgbVis.getVideoThumbURL(gifParams));

// // 在控制台中渲染 GIF 动画
print(ui.Thumbnail(rgbVis, gifParams));

由于黄河区域较大,且云平台对像素点位有设限,因此设置色素分辨率为<450 或降低帧率
使用MODIS数据集结果如下图:
在这里插入图片描述

在这里插入图片描述
使用LandSat计算生成数据集结果如下图
在这里插入图片描述


三. 高程模型DEM实现



// 设置地图中心
Map.centerObject(yellow_river_DEM, 6); // 自动定位到黄河中心区域,具体级别可能需要调整
// 蓝色 < 1000m
// 深绿色 1000~2000
// 亮绿色,2000~3000
// 暗棕色,3000~4000
// 橙色,4000~5000
// 红色,>5000
var elevationVis = {
  min: 0,
  max: 6000,
  palette: ['#8ab4f8','#006633', '#E5FFCC', '#662A00', '#FFAA00', '#FF0000'],
};
Map.addLayer(yellow_river_DEM, elevationVis, 'SRTM DEM');



// 图例
//添加图例方式封装成为了一个方法
//palette: 颜色列表
//names: 图例说明列表
function addLegend(palette, names) {
 //图例的底层Panel
 var legend = ui.Panel({
   style: {
     position: 'bottom-right',
     padding: '5px 10px'
   }
 });
 //图例标题
 var title = ui.Label({
   value: 'Classification',
   style: {
     fontWeight: 'bold',
     color: "red",
     fontSize: '16px'
   }
 });
 legend.add(title);

 //添加每一列图例颜色以及说明
 var addLegendLabel = function(color, name) {
       var showColor = ui.Label({
         style: {
           backgroundColor: color,
           padding: '8px',
           margin: '0 0 4px 0'
         }
       });


       var desc = ui.Label({
         value: name,
         style: {margin: '0 0 4px 8px'}
       });
     //颜色和说明是水平放置
       return ui.Panel({
         widgets: [showColor, desc],
         layout: ui.Panel.Layout.Flow('horizontal')
       });
 };

 //添加所有的图例列表

 for (var i = 0; i < palette.length; i++) {
   var label = addLegendLabel(palette[i], names[i]);
   legend.add(label);
 }  

 Map.add(legend);
}

var palette = elevationVis.palette;
var names = ["<1000m","1000m~2000m","2000m~3000m","3000m~4000m","4000m~5000m",">5000m"];
//添加图例
addLegend(palette, names);

在这里插入图片描述


四. 时序图

// 黄河范围
var scope_yellow_river_basin_shp = 'projects/ee-w782353676/assets/yellow-river'
var roi = ee.FeatureCollection(scope_yellow_river_basin_shp)

var start_year = 2000
var end_year = 2020
// ======= modis数据集 ========
var dataSet_modis = "MODIS/061/MOD13A1" // MOD13A1.061 Terra Vegetation Indices 16-Day Global 500m 
 
function getDataSet(image){
  return ee.ImageCollection(image)
    .filterDate(start_year + '-01-01', end_year + '-12-31') // 筛选出指定时间的影像 
    .filterBounds(roi) // 筛选出指定范围的影像
}
var dataSet = getDataSet(dataSet_modis).select('NDVI').map(function(image){
                       return image.multiply(0.0001).set(image.toDictionary(image.propertyNames()))
                     })

//绘制由全区域每景图像NDVI平均值构成的曲线图
print(ui.Chart.image.series({
    imageCollection: dataSet,
    region: roi,
    reducer: ee.Reducer.mean(),
    scale: 1000
    }).setOptions({
      interpolateNulls: true,
      lineWidth: 2,
      title: 'NDVI_totalregion',
      vAxis: {title: 'NDVI'}, //viewWindow: {min: 0, max: 0.3}调整坐标轴上下限
      hAxis: {title: 'Date'},
      trendlines: { 0: {title: 'NDVI_trend',type:'linear', showR2: true,  color:'red', visibleInLegend: true}} //添加趋势线
    }));

在这里插入图片描述

五. 植被覆盖类型

var scope_yellow_river_basin_shp = 'projects/ee-w782353676/assets/yellow-river'
var roi = ee.FeatureCollection(scope_yellow_river_basin_shp)


var start_year = 2001
var end_year = 2020
function getDataSet(image){
  return ee.ImageCollection(image)
                .filterDate(start_year + '-01-01', end_year + '-12-31') // 筛选出指定时间的影像 
                .filterBounds(roi);// 筛选出指定范围的影像;
}
var dataSet = getDataSet('MODIS/061/MCD12Q1').map(function(image){
  return image.clip(roi)
})
var igbpLandCover = dataSet.select('LC_Type1');
var igbpLandCoverVis = {
  min: 1.0,
  max: 17.0,
  palette: [
    '05450a', '086a10', '54a708', '78d203', '009900', 'c6b044', 'dcd159',
    'dade48', 'fbff13', 'b6ff05', '27ff87', 'c24f44', 'a5a5a5', 'ff6d4c',
    '69fff8', 'f9ffa4', '1c0dff'
  ],
};
// 设置地图中心
Map.centerObject(roi, 6); // 自动定位到黄河中心区域,具体级别可能需要调整
Map.addLayer(igbpLandCover.mean(), igbpLandCoverVis, 'IGBP 植被覆盖类型');

在这里插入图片描述
在这里插入图片描述

六. 参考文献

MODIS NDVI Times Series Animation
GEE下制作带图例的NDVI时间序列GIF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吾日三省吾身---对平常遇到的错误总结

✨个人主页&#xff1a; 不漫游-CSDN博客 前言 本篇文章是对平常练习遇到的问题总结&#xff0c;多吸取经验教训才能避免未来再犯~ Java语法部分 &#xff08;一&#xff09;多态 思考&#xff1a;这道题很明显考察的是多态的知识点&#xff0c;即一个对象可以被赋值给其父类…

11.盛最多水的容器 C++

一开始我最先想到的是暴力解法&#xff0c;就是两个循环嵌套依次遍历&#xff0c;所有情况都过一遍找出最大值&#xff0c;这样示例的结果虽然是正确的&#xff0c;但是超时。所以暴力解法行不通&#xff0c;双指针思考才是正道&#xff0c;双指针一般都是一边一个&#xff0c;…

拉链法解决哈希冲突

1.基本思想: 相同散列地址的记录链成一单链表,m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构. 例如:一组关键字为{19,14,23,1,68,20,84,27,55,11,10,79},散列函数为:Hash(key)key%13, 就会发现有些元素是同义词,比如14%131,1%131…

江开2024年春《计算机组成原理 060214》第4次计分作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1某计算机字长32位&#xff0c;其存储容量为4GB&am…

MySQL__锁

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__锁&#xff09; ⏱️ 创作时间&#xff1a;2024年04月27日 ———————————————— 这里写目录…

Java高阶私房菜-JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么?

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么&#xff1f; 结合长期服务大型国有企业校招工作的经验&#xff0c;我们总结出阳光电源社招笔试的典型模式&#xff1a;行政职业能力测试企业应知应会测试心理测评&#xff0c;综合考察候选人的政治素养、文化素养…

VC2022 + protobuf

google这是有私心啊&#xff0c;protobuf从某个版本开始&#xff0c;依赖了一个google自己推出的大型组件集&#xff0c;Abseil&#xff0c;有点类似于Boost了&#xff0c;业内用的人&#xff0c;从个人狭窄的圈子来说&#xff0c;应该是不多的&#xff0c;据说google的众贤用的…

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【C++】简易二叉搜索树

目录 一、概念&#xff1a; 二、代码实现&#xff1a; 大致结构&#xff1a; 1、遍历&#xff1a; 2、insert 3、find 4、erase 三、总结&#xff1a; 一、概念&#xff1a; 二叉搜索树又称为二叉排序树&#xff0c;是一种具有特殊性质的二叉树&#xff0c;对于每一个节…

springboot+springsecurity+vue前后端分离权限管理系统

有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统&#xff0c;核心功能已经实现&#xff0c;采用springbootvue前后端分离开发&#xff0c;springsecurity实现权限控制&#xff0c;实现按钮级的权限管理&#xff0c;非常适合作为基础框架进行项目开发。 2.效果图…

ICP点云配准初探

ICP点云配准初探 1 简介2 常用的点云配准算法3 ICP&#xff08;Iterative Closest Point&#xff0c;最近点迭代法&#xff09;3.1 ICP要解决的问题3.2 ICP的核心思想3.3 算法流程3.4 总结 4 ICP优缺点 1 简介 在逆向工程&#xff0c;计算机视觉&#xff0c;文物数字化等领域中…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日&#xff0c;香港嘉实国际资产管理有限公司&#xff08;Harvest Global Investments&#xff09;今天宣布&#xff0c;得到香港证监会的原则上批准&#xff0c;将推出两大数字资产&#xff08;比特币及以太坊&#…

​可视化大屏C位图:园区鸟瞰

将园区鸟瞰图作为可视化大屏设计的焦点图有以下几个好处&#xff1a; 提供全局视图&#xff1a;园区鸟瞰图可以展示整个园区的布局和结构&#xff0c;提供全局视图。这对于大型园区或复杂的场所来说尤为重要&#xff0c;用户可以一目了然地了解整个园区的规模、分布和关联关系…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口&#xff0c;子类就是具体工厂类&#xff0c;而需要创…

频率分析和离散傅里叶变换——DSP学习笔记四

背景知识 四种基本的傅里叶变换 基本思想&#xff1a;将信号表示为不同频率 正弦分量的线性组合 正弦信号和复指数时间信号的有用特性 相同频率但不同相位的正弦信号的任何线性组合&#xff0c;都是有着相同频率但不同相位&#xff0c;且幅度可能受改变的正弦信号。 复指数时…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中&#xff0c;有时会发现公司里的报表&#xff0c;经过多人多次的重复的使用和修改后&#xff0c;会出现这种情况&#xff1a; 1.在表格里按照需要输入数字&#xff0c;保存工作簿。 2.然而&#xff0c;再次打开工作簿&#xff0c;里面的数字变成日期&a…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时&#xff0c;必须考虑同步问题&#xff0c;以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常&#xff0c;程序对关键资源的访问代码只是很短的一段&#xff0c;我们称这段代码为关键代码段或者临界区&#xff0c;对进程同步&#xff0c;…

火绒安全概述

页面简介&#xff1a; 火绒安全是一款集多种安全功能于一体的国产软件&#xff0c;旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览&#xff1a; 杀毒防护 实时监控&#xff1a;详细介绍火绒安全如何实时检测系统中的文件和程序…

【强训笔记】day5

NO.1 思路&#xff1a;找到数量最小的字符&#xff0c;就可以知道you的数量&#xff0c;用o的数量减去you的数量再减去1就是oo的数量。 代码实现&#xff1a; #include<iostream>using namespace std;int main() {int q;cin >> q;int a, b, c;while (q--){cin &g…