基于 GEE 的 Landsat C02 Level-2 数据集实现黄河入海口变化监测:支持年度影像切换与动态监测结果下载的完整解决方案

目录

一、核心组件与整体结构

二、基础配置模块

(一)研究区域定义

(二)数据集路径配置

(三)波段映射配置

三、工具类封装模块

[(一)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 的数据集特性,分别封装Landsat457Landsat8工具类,包含缩放系数校正云掩膜两个核心预处理方法,以及数据集获取方法。

(一)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,设置minmax可增强影像对比度,使地表特征(如陆地、水体、植被)更清晰;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 计算延迟,建议根据实际需求调整sDateeDate
  • 下载限制:视频下载 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 数据集实现太湖变化监测结果

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

相关推荐
冬天的风滚草4 小时前
揭秘云原生混布资源调度器Koordinator (十五)GPU 信息采集与上报机制
云计算
冬天的风滚草4 小时前
揭秘云原生混布资源调度器Koordinator (十三)GPU 资源管理总览
云计算
冬天的风滚草4 小时前
揭秘云原生混布资源调度器Koordinator (十四)DeviceShare 调度插件详解
云计算
CodeCaptain7 小时前
阿里云ECS上配置Nginx的反向代理
nginx·阿里云·云计算
有谁看见我的剑了?15 小时前
VMware OVF Tool 工具安装学习
云计算
齐齐大魔王17 小时前
Pascal VOC 数据集
人工智能·深度学习·数据集·voc
盛夏5201 天前
Docker容器化部署SpringBoot+Vue项目:从零到一在阿里云宝塔面板的实践指南
阿里云·docker·云计算
2503_946971861 天前
【Kernel/Consensus】2026年度第二周内核重构与分布式共识战争基准索引 (Benchmark Index)
网络安全·微服务·重构·数据集·分布式系统·系统内核
狐571 天前
2026-01-10-云计算问答题部分整理-期末复习
云计算·期末复习
2401_861277551 天前
中国电信星辰AI大模型有哪些主要功能
人工智能·云计算·软件工程·语音识别