基于 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 数据集实现太湖变化监测结果

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

相关推荐
孤岛悬城3 小时前
45 Docker网络管理
云计算
音沐mu.15 小时前
【36】行人红绿灯数据集(有v5/v8模型)/YOLO行人红绿灯检测
yolo·目标检测·数据集·行人红绿灯数据集·行人红绿灯检测·闯红灯检测
孤岛悬城20 小时前
42 Ansible-Playbooks 自动化剧本
云计算
孤岛悬城1 天前
41 Ansible 自动化
云计算
孤岛悬城1 天前
44 Docker:安装与容器管理
docker·容器·云计算
gaize12132 天前
如何编写一个简单的服务器应用程序?
服务器·云计算
wanhengidc2 天前
巨椰 云手机 云游戏稳定运行
运维·服务器·arm开发·游戏·云计算