该模块主要用于定义分析的空间范围,并在地图中进行可视化展示。
var roi = table;
Map.addLayer(roi, {color: 'red'}, "研究区");
Map.centerObject(roi, 7);
研究区(Region of Interest, ROI)作为空间分析的边界约束,本例中采用已导入 Google Earth Engine 的矢量数据(如行政区划边界)作为分析区域。
roi = table
roi
table
通过将研究区图层以红色边框形式叠加至地图界面,图层命名为“研究区”,便于用户直观识别分析范围。
Map.addLayer()
同时调用地图居中功能,使视角自动聚焦于研究区,设定缩放级别为7(数值越大视野越近),确保整个区域完整呈现于视窗中央。
Map.centerObject(roi, 7)
此部分负责搭建用户交互界面,集成标题、说明文本、日期选择控件及操作按钮,构成工具的主要操作入口。
采用垂直流式布局结构,设置面板宽度为320px,定位方式为右上角悬浮显示。背景设为白色半透明(透明度0.9),配以灰色边框,并添加适当的内外边距,提升整体视觉体验且避免遮挡地图主体内容。
var panel = ui.Panel({
layout: ui.Panel.Layout.flow('vertical'),
style: {
width: '320px',
padding: '12px',
position: 'top-right',
backgroundColor: 'rgba(255, 255, 255, 0.9)',
border: '1px solid gray',
margin: '8px'
}
});
ui.root.insert(0, panel);
vertical
为保障操作便捷性,将该控制面板插入UI层级最顶层,确保其始终可见并优先响应用户交互。
ui.root.insert(0, panel)
标题部分使用绿色图标配合加粗居中的文字样式,突出植被监测主题,增强识别度。
var title = ui.Label({
value: '???? NDVI 时段对比分析工具',
style: {
fontWeight: 'bold',
fontSize: '16px',
color: '#1b5e20',
textAlign: 'center',
margin: '6px 0'
}
});
panel.add(title);
panel.add(ui.Label({
value: '选择基线期与对比期,计算并显示NDVI变化。',
style: {fontSize: '12px', color: '#555', margin: '0 0 8px 0', textAlign: 'center'}
}));
说明文字采用较小字号和灰色字体颜色,简洁传达工具用途,在不干扰主视觉的前提下明确操作逻辑。
该组件为核心交互控件,用于选定基线期的起止时间。
var startSlider = ui.DateSlider({
start: '2001-01-01',
end: '2023-12-31',
value: '2015-01-01',
period: 1,
style: {stretch: 'horizontal'}
});
var endSlider = ui.DateSlider({
start: '2001-01-01',
end: '2023-12-31',
value: '2019-12-31',
period: 1,
style: {stretch: 'horizontal'}
});
滑块的时间范围限定在2001年至2023年之间,与MODIS数据的产品时间跨度保持一致。
start
end
默认选中时间段设为2015–2019年,提供合理初始值,降低用户配置成本。
value
日期调整精度设置为每日一级,确保时间选取的精确性。
period: 1
控件横向拉伸以填充整个面板宽度,优化界面排布效果。
stretch: 'horizontal'
按钮用于触发核心计算流程,绑定主逻辑函数 updateMap(),实现NDVI差异图的生成与更新。
var button = ui.Button({
label: '???? 更新 NDVI 地图',
onClick: updateMap,
style: {
stretch: 'horizontal',
color: 'white',
backgroundColor: '#388e3c',
border: '1px solid #2e7d32',
fontWeight: 'bold',
margin: '4px 0'
}
});
panel.add(button);
样式设计上采用绿色背景搭配白色加粗文字,并结合图标与文字组合形式,提高可读性和点击识别度。按钮横向扩展以占满面板宽度,方便移动端或桌面端操作。
updateMap
定义一个全局变量用于存储图例面板对象,以便统一管理图例的创建与移除过程,防止重复添加导致界面混乱。
var legendPanelGlobal = null;
初始状态下该变量为空(null),当新图例生成时赋值;后续更新时可通过该引用定位旧图例并执行清除操作。
null
该函数是系统的核心处理单元,负责从数据获取、指数计算到结果可视化的全流程控制,由“更新 NDVI 地图”按钮触发执行。
在每次执行更新前,首先清空地图上的所有已有图层,防止新旧图层叠加造成混淆。随后重新加载研究区边界图层,维持空间参考的一致性。
Map.layers().reset(); // 清除旧图层
Map.addLayer(roi, {color: 'red'}, "研究区");
从日期滑块控件中提取用户选定的起始与结束日期,并将其转换为 GEE 平台所需的 Date 对象格式,满足数据筛选的时间条件要求。
var start = ee.Date(startSlider.getValue()[0]);
var end = ee.Date(endSlider.getValue()[0]);
ee.Date
注意:由于滑块返回的是 JavaScript 原生日期类型,需通过 GEE 提供的方法进行格式转换,确保兼容性。
getValue()[0]
DateSlider
基于 MOD13Q1.061 Terra 植被指数产品(16天合成周期,250米分辨率),分别提取基线期与固定对比期(2023全年)的影像集合。对每个时期内的影像序列进行中值合成,以减少云影等噪声影响,进而计算各像元的 NDVI 值。
通过减法运算获得两个时段间的 NDVI 差值图。利用色彩映射规则进行渲染:绿色表示 NDVI 上升或稳定(植被状况改善),红色表示下降趋势(植被退化),黄色代表过渡区域。最终将结果图层添加至地图显示。
在控制台输出关键处理信息,包括所选时间段、数据集名称、处理进度提示等,辅助调试与运行状态监控。
执行 addLegend() 函数,动态生成对应的颜色梯度图例,帮助用户理解地图色彩所代表的数值含义。
若已存在图例面板,则先根据全局变量引用将其从界面中移除,避免多个图例共存造成冗余。
新建一个独立的浮动面板用于承载图例内容,设置合适的尺寸、位置与透明背景,使其不影响地图观察。
添加图例标题“NDVI 变化等级”,并在下方绘制连续的颜色渐变条,反映从负值(退化)到正值(改善)的变化区间。
在渐变条两侧标注关键阈值标签,例如“-1.0”(严重退化)至“+1.0”(显著改善),增强解读能力。
将构建完成的图例面板添加至地图界面,并将其实例赋值给全局变量,供下次更新时调用删除。
程序启动后自动执行一次 updateMap() 函数,加载默认时间段下的 NDVI 差异图,确保用户进入界面即可查看初始结果。
适用于生态环境监测、土地利用变化评估、荒漠化分析等领域。建议使用高精度边界数据作为研究区;注意 MOD13Q1 数据存在一定的空间缺失区域,复杂地形下可能存在数据空洞。
系统成功实现了 NDVI 时空差异的交互式分析功能,能够清晰呈现不同年份间植被覆盖的变化趋势。绿色区域指示植被恢复或生长良好,红色区域反映植被覆盖减少或生态退化,为决策支持提供直观依据。

返回值以数组形式呈现,选取第一个元素即可获得所选日期。
// 基线期NDVI计算
var baseline = ee.ImageCollection('MODIS/006/MOD13Q1')
.filterBounds(roi)
.filterDate(start, end)
.select('NDVI')
.mean();
// 对比期NDVI计算(固定2023年)
var recent = ee.ImageCollection('MODIS/006/MOD13Q1')
.filterBounds(roi)
.filterDate('2023-01-01', '2023-12-31')
.select('NDVI')
.mean();
// NDVI差异计算
var diff = baseline.subtract(recent);
采用 MODIS 传感器的 MOD13Q1 产品(植被指数 16 天合成数据,版本 006),空间分辨率为 250 米,时间序列从 2001 年延续至今,适用于大范围植被动态监测与长期变化分析。
MOD13Q1
filterBounds(roi)
filterDate()
select('NDVI')
.mean()
通过计算基线期与对比期之间的平均 NDVI 差值,评估植被覆盖变化情况。差值大于零表示植被退化或覆盖下降;差值小于或接近零则表明植被状态稳定或有所改善。
baseline.subtract(recent)
Map.addLayer(diff.clip(roi), {
min: 0,
max: 2000,
palette: ['green', 'yellow', 'red']
}, 'NDVI差异图');
将计算得出的 NDVI 差异图依据研究区边界进行裁剪,排除无关地理区域,提升结果专注度与视觉清晰度。
diff.clip(roi)
min: 0
/
max: 2000
显示范围设定:MODIS 的原始 NDVI 值经过放大处理(范围 -2000 至 10000),实际分析中重点关注 0~2000 区间内的显著变化。
palette: ['green', 'yellow', 'red']
颜色映射方案:采用绿-黄-红渐变色系,绿色代表较小差值(植被稳定或上升),黄色为过渡状态,红色表示较大差值(植被明显衰退),直观展示植被健康趋势。
print('基线期:', start.format('YYYY-MM-dd'), '→', end.format('YYYY-MM-dd'));
print('对比期: 2023-01-01 → 2023-12-31');
功能说明:在 Google Earth Engine 控制台输出当前分析的时间段信息,便于用户确认基线期选择是否准确,辅助结果验证和调试过程。
addLegend();
作用描述:调用 addLegend() 函数,在地图界面上添加 NDVI 差异图对应的图例组件,帮助使用者理解色彩分布所反映的生态含义。
addLegend()
该函数用于构建并管理可视化图例面板,确保其样式与差异图解译规则一致,增强成果可读性与专业性。
if (legendPanelGlobal) {
try { ui.root.remove(legendPanelGlobal); } catch (e) {}
legendPanelGlobal = null;
}
执行逻辑:每次更新地图前,先判断是否存在先前创建的图例实例,若存在则予以移除,防止多个图例重叠显示,维持界面整洁。
异常容错机制:通过 try...catch 结构避免因尝试删除不存在对象而导致程序中断,提高代码鲁棒性。
try...catch
var legendPanel = ui.Panel({
layout: ui.Panel.Layout.flow('vertical'),
style: {
position: 'bottom-right',
padding: '8px',
backgroundColor: 'rgba(255, 255, 255, 0.8)',
border: '1px solid gray',
margin: '8px'
}
});
界面样式:采用垂直流式布局,定位在地图底部右侧,背景设为半透明白色,边框为灰色,既突出信息又不遮挡主图内容,风格与主控面板协调统一。
var legendTitle = ui.Label({
value: 'NDVI 差异图例',
style: {fontWeight: 'bold', fontSize: '13px', margin: '0 0 4px 0', textAlign: 'center'}
});
legendPanel.add(legendTitle);
// 渐变条生成
var legendImage = ee.Image.pixelLonLat().select(0);
var gradient = legendImage.visualize({
min: 0,
max: 1,
palette: ['green', 'yellow', 'red']
});
var thumbnail = ui.Thumbnail({
image: gradient,
params: {bbox: [0, 0, 1, 0.1], dimensions: '120x14'},
style: {stretch: 'horizontal', margin: '4px 0'}
});
legendPanel.add(thumbnail);
图例标题:设置加粗居中的文本标题,明确标识图例主题,提升辨识度。
渐变图像生成:
visualize() 方法应用与差异图相同的绿-黄-红配色方案。pixelLonLat()
visualize()
createThumbnail() 将可视化结果转换为缩略图,尺寸设为 120x14 像素,并横向拉伸填充图例区域,清晰展现颜色过渡。ui.Thumbnail
var labelsPanel = ui.Panel({
layout: ui.Panel.Layout.flow('horizontal'),
style: {width: '100%'}
});
var leftLabel = ui.Label('NDVI 稳定/上升', {fontSize: '11px', color: 'green', margin: '0 4px 0 0'});
var spacer = ui.Label({value: ' ', style: {stretch: 'horizontal'}});
var rightLabel = ui.Label('NDVI 下降', {fontSize: '11px', color: 'red', margin: '0 0 0 4px'});
labelsPanel.add(leftLabel);
labelsPanel.add(spacer);
labelsPanel.add(rightLabel);
legendPanel.add(labelsPanel);
排版方式:采用横向流式布局,借助空白占位标签 实现左右文字标签两端对齐,优化视觉平衡与美观性。
spacer
标签释义:左侧绿色标签对应渐变条起点,表示 NDVI 稳定或上升趋势;右侧红色标签对应终点,表示 NDVI 显著下降,与地图颜色编码完全匹配,便于快速解读。
ui.root.add(legendPanel);
legendPanelGlobal = legendPanel;
界面集成:将完成构建的图例面板添加至地图 UI 层,实现可视化呈现。
状态维护:将新生成的图例对象赋值给全局变量,以便后续更新时能够正确识别并移除旧图例,保障界面一致性。
legendPanelGlobal
updateMap();
功能说明:脚本加载完成后自动执行 updateMap() 调用,初始化地图视图,默认展示 2015–2019 年作为基线期与 2023 年对比的 NDVI 变化图,无需手动触发,提升用户体验流畅度。
updateMap()
MOD13Q1
try...catch
研究区域矢量文件需提前导入 Google Earth Engine 平台,且必须为标准矢量格式(如 Shapefile、GeoJSON 等),否则无法完成空间裁剪与分析。
table在选择基线期时,应注意其与对比期(2023年)的时间跨度保持一致。建议两者均采用多年平均值或同为单年数据,避免因时间尺度不统一而导致分析结果出现偏差。
MODIS 数据的空间分辨率为250米,适用于大范围区域的植被动态监测,但不适用于小区、小流域等小尺度区域的精细化分析。对于此类场景,应优先选用更高分辨率的遥感数据源,例如 Landsat 或 Sentinel-2,以提升空间细节表达能力。
NDVI 差值参数当前设置范围为0~2000,可根据研究区域实际植被变化幅度进行调整。若区域内变化较为显著,可适当扩大该参数取值,以确保颜色梯度能够清晰反映不同等级的变化强度,增强可视化效果。
min
/
max
调整
max
基于 Google Earth Engine(GEE)平台开发的 NDVI 交互式时序可视化与趋势分析工具界面展示如下:
以下分别为湖北省在不同时段内的 NDVI 变化趋势分析结果可视化图像:

扫码加好友,拉您进群



收藏
