首先推荐吴秋生老师团队开源的便捷构建网站:适用于地理空间应用的Streamlight
吴秋生老师团队的工具请自行探索。本文讲解基于GEE云开发平台实现,基于modis,黄河数据中心,LandSat7&8数据。
注意在大范围使用landsat数据集会出现黑色断条
高程DEM demo
NDVI综合 demo
折线图demo
一. 选取目标区域
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 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').mean(), ndviVisParams, 'NDVI');
// 设置地图中心
Map.centerObject(roi, 6); // 自动定位到黄河中心区域,具体级别可能需要调整
// 可选:查看航天器和传感器信息
print('航天器名称:', dataSet.aggregate_array('SPACECRAFT_ID').distinct());
print('传感器名称:', dataSet.aggregate_array('SENSOR_ID').distinct());
// 指北针
var style = require('users/gena/packages:style')
var pt = ee.Geometry.Point([98.87,40.81],'EPSG:4326')
var scale = Map.getScale()
var scaleFactor = 0.2
var width = 2
var northArrow = style.NorthArrow.draw(pt, scale, width, scaleFactor)
Map.addLayer(northArrow, {
}, 'N', false)
// 定义渐变色
// 创建渐变色条图像
var gradientImage = ee.Image.pixelLonLat().select('longitude')
.multiply(NDVIR - NDVIL) // 扩展到NDVI范围
.add(NDVIL); // 加上最小NDVI值
var gradient = ui.Thumbnail({
image: gradientImage,
params: {
bbox: [0, 0, 1, 0.1],
dimensions: '200x20',
format: 'png',
min: NDVIL,
max: NDVIR,
palette: palette
},
style: {
stretch: 'horizontal', margin: '0px 0px', maxHeight: '30px'}
});
// 创建图例面板并添加到地图
var legendPanel = ui.Panel({
widgets: [
ui.Label('NDVI 图例', {
fontWeight: 'bold'}),
gradient,
ui.Panel({
widgets: [
ui.Label('低:0', {
margin: '4px 8px'}),
ui.Label('高:1', {
margin