目录
[(一)Landsat4、5、7 工具类](#(一)Landsat4、5、7 工具类)
[(二)Landsat8 工具类](#(二)Landsat8 工具类)

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 Google Earth Engine(GEE)平台,利用 Landsat 4/5/7/8 卫星的 C02 Level-2 数据集,实现 1986-2018 年黄河入海口区域(指定经纬度范围)的遥感影像时序分析。核心功能包括:数据集适配与预处理、年度影像合成、交互式影像切换查看、时序缩略图生成及视频下载,最终用于直观呈现黄河入海口的时空变化特征。
一、核心组件与整体结构
代码整体分为 6 大核心模块,逻辑上遵循 "数据定义→工具封装→数据处理→交互可视化→结果输出" 的流程,具体结构如下:
- 基础配置(区域、数据集、波段映射)
- 工具类封装(Landsat 4/5/7 和 Landsat 8 的预处理方法)
- 核心功能函数(年度影像合成、交互面板创建、影像渲染)
- 主函数(流程串联与执行)
- 可视化与输出(时序缩略图、视频下载)
二、基础配置模块
(一)研究区域定义
通过ee.Geometry.Polygon指定黄河入海口的经纬度范围,形成矩形研究区域(roi),作为后续影像裁剪的边界。核心代码逻辑:
javascript
var geometry =
ee.Geometry.Polygon(
[[[118.75882336794976, 37.964177296096345],
[118.75882336794976, 37.57990360187486],
[119.38916394412163, 37.57990360187486],
[119.38916394412163, 37.964177296096345]]], null, false);
var roi = geometry;
var styling = {color:"gray",fillColor:"#00000000"};
Map.addLayer(roi, styling, "geometry")
参数说明: 前 4 个元素为矩形区域的 4 个顶点经纬度,null表示不指定投影(使用默认投影),false表示区域为逆时针方向。
(二)数据集路径配置
适配 Landsat C02 Level-2 数据集的统一路径格式(T1_L2为 Level-2 产品标识),分别加载 Landsat 4/5/7/8 的数据集:
javascript
var l8_sr = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2"); // Landsat 8
var l7_sr = ee.ImageCollection("LANDSAT/LE07/C02/T1_L2"); // Landsat 7
var l5_sr = ee.ImageCollection("LANDSAT/LT05/C02/T1_L2"); // Landsat 5
var l4_sr = ee.ImageCollection("LANDSAT/LT04/C02/T1_L2"); // Landsat 4
数据集说明: C02为 Landsat Collection 2(第二代数据集),T1_L2表示经过大气校正的 Level-2 表面反射率(SR)产品,精度高于 Level-1。
(三)波段映射配置
由于不同 Landsat 卫星的蓝、绿、红波段编号不同,需统一波段名称以便后续处理:
javascript
var l457BandNames = ["SR_B1","SR_B2","SR_B3"]; // L4/5/7的蓝、绿、红波段(SR子波段)
var l8BandNames = ["SR_B2","SR_B3","SR_B4"]; // L8的蓝、绿、红波段(SR子波段)
var bandNames = ['blue','green','red']; // 统一重命名后的波段名
关键说明: Landsat 8 调整了波段设计,蓝波段从SR_B1改为SR_B2,因此需单独映射,最终均重命名为blue(蓝)、green(绿)、red(红),保证后续处理一致性。
三、工具类封装模块
针对 Landsat 4/5/7 和 Landsat 8 的数据集特性,分别封装Landsat457和Landsat8工具类,包含缩放系数校正 和云掩膜两个核心预处理方法,以及数据集获取方法。
(一)Landsat4、5、7 工具类
javascript
var Landsat457 = {
// 1. 缩放系数校正:将DN值转换为实际反射率
scaleImage: function(image) {
var time_start = image.get("system:time_start"); // 保留原始时间戳
image = image.select(l457BandNames)
.multiply(0.0000275) // 缩放系数(C02 Level-2标准系数)
.subtract(0.2); // 偏移量(消除系统误差)
image = image.set("system:time_start", time_start);
return image;
},
// 2. 云掩膜:基于QA_PIXEL波段的位掩码去除云及云阴影
srCloudMask: function(image) {
var qa = image.select('QA_PIXEL'); // 质量控制波段
var cloudShadowBitMask = 1 << 3; // 云阴影的位掩码(第3位为1表示云阴影)
var cloudsBitMask = 1 << 5; // 云的位掩码(第5位为1表示云)
// 生成掩码:云和云阴影区域设为0(不显示),其他区域设为1(显示)
var mask = qa.bitwiseAnd(cloudsBitMask).eq(0)
.and(qa.bitwiseAnd(cloudShadowBitMask).eq(0));
return image.updateMask(mask);
},
// 3. 数据集获取:筛选时间、区域,应用预处理,重命名波段
getL4SRCollection : function(startDate, endDate, roi) {
var dataset = l4_sr.filterDate(startDate, endDate)
.filterBounds(roi)
.map(Landsat457.srCloudMask) // 去云
.map(Landsat457.scaleImage) // 反射率校正
.select(l457BandNames, bandNames); // 波段重命名
return dataset;
},
// getL5SRCollection、getL7SRCollection方法逻辑与getL4SRCollection一致,仅对应数据集不同
};
(二)Landsat8 工具类
与Landsat457结构一致,差异仅在于波段选择 (使用l8BandNames),缩放系数和云掩膜逻辑与 C02 Level-2 产品标准保持一致:
javascript
var Landsat8 = {
scaleImage: function(image) {
var time_start = image.get("system:time_start");
image = image.select(l8BandNames) // 选择L8的蓝、绿、红波段
.multiply(0.0000275)
.subtract(0.2);
image = image.set("system:time_start", time_start);
return image;
},
srCloudMask: function(image) { /* 与Landsat457的云掩膜逻辑完全一致 */ },
getL8SRCollection : function(startDate, endDate, roi) {
var dataset = l8_sr.filterDate(startDate, endDate)
.filterBounds(roi)
.map(Landsat8.srCloudMask)
.map(Landsat8.scaleImage)
.select(l8BandNames, bandNames);
return dataset;
}
};
四、核心功能函数模块
(一)年度影像合成函数
将长时间序列的影像按年份分组,对每一年的影像取中位数(降低云、大气等噪声影响),生成年度合成影像集:
javascript
function getYearCol(sDate, eDate, lxCol) {
// 生成起始年份到结束年份前一年的年份列表(如1986-2019生成1986-2018)
var yearList = ee.List.sequence(ee.Date(sDate).get("year"), ee.Number(ee.Date(eDate).get("year")).subtract(1));
// 遍历年份列表,生成年度合成影像
var yearImgList = yearList.map(function(year) {
year = ee.Number(year);
var _sdate = ee.Date.fromYMD(year, 1, 1); // 当年1月1日
var _edate = ee.Date.fromYMD(year.add(1), 1, 1); // 下一年1月1日(左闭右开)
var tempCol = lxCol.filterDate(_sdate, _edate); // 筛选当年影像
var img = tempCol.median().clip(roi); // 取中位数合成,裁剪到研究区域
img = img.set("year", year); // 添加年份属性
img = img.set("system:index", ee.String(year.toInt())); // 索引设为年份(便于交互)
return img;
});
var yearImgCol = ee.ImageCollection.fromImages(yearImgList); // 转换为影像集
return yearImgCol;
}
关键逻辑: 中位数合成能有效抑制单张影像的噪声(如局部云、大气散射),更真实反映年度地表状况;clip(roi)确保影像仅保留研究区域。
(二)交互面板创建函数
创建 UI 交互面板,支持通过 "+""-" 按钮切换不同年份的影像,显示当前年份和影像 ID:
javascript
function addPanel(sCol) {
// 获取影像集的索引列表(即年份列表)
var id_list = sCol.reduceColumns(ee.Reducer.toList(), ['system:index'])
.get('list');
// 在客户端解析索引列表(GEE中需通过evaluate将服务器端数据转为客户端数据)
id_list.evaluate(function(ids) {
if (!ids || ids.length === 0) { // 空值判断:无影像时提示错误
ui.Label('无可用影像,请检查时间范围或区域').style({color: 'red'});
return;
}
var total = ids.length;
var showTitle = ui.Label("", {fontWeight: 'bold'}); // 显示当前年份的标签
var curIndex = 0; // 当前选中的索引
// "+"按钮:切换到下一年(循环)
var bPlus = ui.Button("+", function() {
curIndex = (curIndex + 1) % total;
showTitle.setValue(ids[curIndex]);
showSelectRawImage(sCol, ids[curIndex]); // 渲染选中年份的影像
});
// "-"按钮:切换到上一年(循环)
var bReduce = ui.Button("-", function() {
curIndex = (curIndex - 1 + total) % total;
showTitle.setValue(ids[curIndex]);
showSelectRawImage(sCol, ids[curIndex]);
});
// 初始化:显示第一个年份的影像
showTitle.setValue(ids[curIndex]);
showSelectRawImage(sCol, ids[curIndex]);
// 构建UI面板:包含提示文字、按钮、当前年份标签
var main = ui.Panel({
widgets: [
ui.Label('点击"+"或"-"切换年份', {fontWeight: 'bold'}),
bPlus, bReduce,
ui.Label("当前年份: ", {fontWeight: 'bold'}),
showTitle
],
style: {width: '200px', padding: '8px'}
});
ui.root.insert(0, main); // 将面板添加到GEE界面顶部
});
}
关键说明: evaluate方法是 GEE 中客户端与服务器端数据交互的核心,由于影像集索引存储在服务器端,需通过该方法转为客户端可操作的列表;按钮点击事件通过修改curIndex实现年份循环切换。
(三)影像渲染函数
根据选中的年份,在地图上渲染对应的年度合成影像,并移除上一次渲染的影像(避免重叠):
javascript
function showSelectRawImage(sCol, key) {
print("当前影像ID: " + key); // 在控制台打印当前影像ID(年份)
if (rawLayer !== null) { // 移除上一次渲染的影像
Map.remove(rawLayer);
rawLayer = null;
}
// 影像可视化参数:反射率范围0-0.3,RGB波段对应red、green、blue
var visParam = {
min: 0,
max: 0.3,
bands: ["red", "green", "blue"]
};
// 筛选选中年份的影像,应用可视化参数并添加到地图
var image = ee.Image(sCol.filter(ee.Filter.eq("system:index", key)).first());
rawLayer = Map.addLayer(image, visParam, key);
}
可视化逻辑: Landsat 表面反射率的合理范围通常为 0-0.3,设置min和max可增强影像对比度,使地表特征(如陆地、水体、植被)更清晰;bands参数指定 RGB 通道对应的波段,生成真彩色影像。
五、主函数模块
串联所有模块,执行完整流程:初始化地图、加载并合并数据集、生成年度合成影像、创建交互面板、输出时序结果:
javascript
function main() {
Map.centerObject(roi, 8); // 地图中心定位到研究区域,缩放级别8
var sDate = "1986-1-1"; // 起始时间
var eDate = "2019-1-1"; // 结束时间(左闭右开,实际处理到2018年)
// 1. 获取各传感器的预处理后数据集
var l4Col = Landsat457.getL4SRCollection(sDate, eDate, roi);
var l5Col = Landsat457.getL5SRCollection(sDate, eDate, roi);
var l7Col = Landsat457.getL7SRCollection(sDate, eDate, roi);
var l8Col = Landsat8.getL8SRCollection(sDate, eDate, roi);
// 2. 合并所有数据集(L8→L7→L5→L4的顺序,不影响最终结果)
var lxCol = l8Col.merge(l7Col).merge(l5Col).merge(l4Col);
print("总影像数量:", lxCol.size()); // 控制台输出原始影像总数
// 3. 生成年度合成影像集
var imgCol = getYearCol(sDate, eDate, lxCol);
print("年度合成影像集:", imgCol); // 控制台输出年度影像集信息
// 4. 添加交互面板
addPanel(imgCol);
// 5. 生成时序缩略图和视频下载URL
var params = {
crs: 'EPSG:3857', // Web墨卡托投影(适配GEE地图显示)
framesPerSecond: 2, // 视频帧率(2帧/秒)
region: roi, // 视频区域(研究区域)
min: 0.0,
max: 0.3,
bands: ["red", "green", "blue"],
dimensions: 512, // 视频分辨率(512x512像素)
};
print("时序缩略图:", ui.Thumbnail(imgCol, params)); // 显示时序缩略图
print("视频下载URL:", imgCol.getVideoThumbURL(params)); // 输出视频下载链接
}
main(); // 执行主函数
六、关键技术亮点与注意事项
技术亮点:
- 数据集适配性:针对 Landsat C02 Level-2 数据集的波段结构和预处理要求,优化了缩放系数、云掩膜和波段映射,解决了不同传感器的数据一致性问题。
- 噪声抑制:通过 "云掩膜 + 年度中位数合成" 双重处理,有效降低云、大气等噪声对地表观测的影响,提升数据质量。
- 交互体验:提供可视化 UI 面板,支持年份快速切换,便于直观对比不同时期黄河入海口的变化。
- 结果多元化:同时输出单年度影像、时序缩略图和视频,满足不同场景的分析需求(如静态对比、动态演示)。
注意事项:
- 数据可用性:若某一年份无符合条件的影像(如全年多云),年度合成影像可能为空,需通过控制台提示检查时间范围或研究区域。
- 投影与分辨率 :代码使用
EPSG:3857投影(适配 Web 地图),Landsat 影像原始分辨率为 30 米,最终输出的视频和缩略图分辨率为 512x512 像素(按比例压缩)。 - 性能优化 :合并多传感器数据集时,若时间范围过长(如超过 30 年),可能导致 GEE 计算延迟,建议根据实际需求调整
sDate和eDate。 - 下载限制:视频下载 URL 的有效期有限,需在生成后及时下载;若影像数量过多,视频生成可能失败,可减少年份范围后重试。
七、代码应用场景
该代码主要用于黄河入海口的时空变化监测,具体应用包括:
- **海岸线变迁分析:**通过不同年份的影像对比,观察黄河入海口陆地面积的增减(如泥沙淤积导致的岸线推进)。
- **土地覆盖变化:**识别植被、水体、裸地等土地类型的分布变化,分析生态环境演变。
- **动态演示:**通过生成的视频,直观展示 1986-2018 年黄河入海口的整体变化趋势,为科研、教学或政策制定提供数据支撑。
八、运行结果
黄河入海口1986年监测影像
黄河入海口1996年监测影像
黄河入海口2006年监测影像
黄河入海口2016年监测影像
控制台输出的执行结果信息
基于 GEE 的 Landsat C02 Level-2 数据集实现黄河入海口变化监测结果
根据研究需要替换研究区位置即可监测不同地区的变化情况,如下图所示:
基于 GEE 的 Landsat C02 Level-2 数据集实现长江入海口变化监测结果
基于 GEE 的 Landsat C02 Level-2 数据集实现杭州湾钱塘江变化监测结果
基于 GEE 的 Landsat C02 Level-2 数据集实现鄱阳湖变化监测结果
基于 GEE 的 Landsat C02 Level-2 数据集实现太湖变化监测结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!