文章目录
- 一. 选取目标区域
- 二. 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 值,表示缩放、校准的传感器辐射度 原始图像
// 数据集可用性: 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 值,表示缩放、校准的传感器辐射度。 原始图像
一. 选取目标区域
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