基于 GEE 以直方图可视化的形式实现研究区 Landsat 5、7、8 影像年度数量统计

目录

一、研究区 ROI 加载与地图初始化

二、Landsat 卫星影像集合加载

三、影像属性标注(核心函数定义)

(一)云量属性安全获取函数

(二)影像集合属性标注函数

四、影像集合转 FeatureCollection 与数量校验

五、年度影像数量直方图可视化

六、Landsat 8 特定时期影像合成与可视化

(一)影像过滤与筛选

(二)影像合成与剪裁

(三)影像可视化参数设置与展示

七、关键技术要点与注意事项

八、运行结果


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

本代码基于 Google Earth Engine(GEE)平台开发,核心目标是实现研究区 Landsat 系列卫星影像的加载、属性标注、数量统计可视化及特定时期影像合成与展示。涵盖 Landsat 5、7、8 三颗卫星的影像数据处理,流程从数据加载到最终可视化形成完整闭环,适用于遥感影像数据筛选、统计分析及基础可视化场景。

一、研究区 ROI 加载与地图初始化

var roi = table;
Map.addLayer(roi, {}, '研究区');
Map.centerObject(roi, 7);

功能说明:

  • ROI 定义roi = table 中,table 是 GEE 平台中已导入的矢量数据集(通常为研究区边界的面状矢量),此处直接赋值给变量roi作为后续处理的空间范围约束。
  • 地图添加图层Map.addLayer() 方法将研究区矢量边界添加到 GEE 地图界面,第三个参数'研究区'是图层名称,方便在地图图层列表中识别。
  • 地图居中Map.centerObject(roi, 7) 使地图自动居中到研究区位置,第二个参数7是地图缩放级别(范围 1-20,数值越大缩放程度越高,此处为中等缩放)。

关键注意点:

  • 需提前在 GEE 平台导入矢量边界数据并命名为table,否则会报 “变量未定义” 错误。
  • 缩放级别可根据研究区范围大小调整,大范围研究区适合 5-8 级,小范围适合 10-15 级。

二、Landsat 卫星影像集合加载

// Landsat 5 TOA
var l5_coll = ee.ImageCollection('LANDSAT/LT05/C02/T1_TOA')
    .filterBounds(roi);
// Landsat 7 TOA(示例时间过滤 1999–2002)
var l7_coll = ee.ImageCollection('LANDSAT/LE07/C02/T1_TOA')
    .filter(ee.Filter.calendarRange(1999, 2002, 'year'))
    .filterBounds(roi);
// Landsat 8 TOA
var l8_coll = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
    .filterBounds(roi);

核心概念:

  • ee.ImageCollection:GEE 中用于存储多幅影像的集合对象,此处分别加载 Landsat 5、7、8 的大气顶层反射率(TOA)数据产品(C02 为第二版数据集,T1 表示经过正射校正的数据集)。
  • 数据集 ID 说明:
    • Landsat 5:LANDSAT/LT05/C02/T1_TOA(运行时间 1984-2013 年)
    • Landsat 7:LANDSAT/LE07/C02/T1_TOA(运行时间 1999 年至今,2003 年后存在扫描线校正故障)
    • Landsat 8:LANDSAT/LC08/C02/T1_TOA(运行时间 2013 年至今,传感器性能更优)

过滤条件说明:

  • filterBounds(roi):空间过滤,仅保留研究区roi范围内的影像,剔除无关区域数据,提升处理效率。
  • filter(ee.Filter.calendarRange(1999, 2002, 'year')):时间过滤(仅 Landsat 7 使用),限定加载 1999-2002 年的影像,其他两颗卫星未加时间过滤,将加载其全生命周期内覆盖研究区的所有影像。

三、影像属性标注(核心函数定义)

(一)云量属性安全获取函数

function safeCloud(img) {
    var cc = ee.Algorithms.If(img.get('CLOUD_COVER'),
        img.get('CLOUD_COVER'),
        0);  // 若无该字段则设为 0
    return ee.Number(cc);
}
  • 目标:获取每幅影像的云量信息,处理部分影像缺失CLOUD_COVER(云量)字段的异常情况。
  • 关键函数:
    • img.get('CLOUD_COVER'):获取影像的CLOUD_COVER属性值(Landsat 影像自带的云量估算值,范围 0-100)。
    • ee.Algorithms.If(condition, trueCase, falseCase):GEE 中的条件判断函数,若影像存在CLOUD_COVER字段则返回其值,否则返回 0(避免因字段缺失导致后续处理报错)。
  • 返回值:将云量值转为ee.Number类型,确保数据类型统一。

(二)影像集合属性标注函数

function annotateCollection(coll, satName) {
    return coll.map(function(img) {
        return img.set({
            year: img.date().get('year'),
            month: img.date().get('month'),
            clouds: safeCloud(img),
            satellite: satName
        });
    });
}
// 调用函数为三个影像集合添加属性
var iC5 = annotateCollection(l5_coll, 'Landsat 5');
var iC7 = annotateCollection(l7_coll, 'Landsat 7');
var iC8 = annotateCollection(l8_coll, 'Landsat 8');
  • 核心逻辑:通过map()方法遍历影像集合中的每一幅影像,为其添加 4 个自定义属性,便于后续统计分析。
  • 新增属性说明:
    • year:影像获取年份,通过img.date().get('year')从影像日期中提取。
    • month:影像获取月份,通过img.date().get('month')提取。
    • clouds:云量值,调用safeCloud(img)函数获取。
    • satellite:卫星名称,由传入的参数satName指定(区分三颗卫星)。
  • 调用结果:生成三个已添加属性的新影像集合iC5iC7iC8

四、影像集合转 FeatureCollection 与数量校验

var fc5 = ee.FeatureCollection(iC5);
var fc7 = ee.FeatureCollection(iC7);
var fc8 = ee.FeatureCollection(iC8);
// 打印影像数量(检查用)
print('Landsat 5 影像数量:', fc5.size());
print('Landsat 7 影像数量:', fc7.size());
print('Landsat 8 影像数量:', fc8.size());
  • 转换逻辑:ee.FeatureCollection(iC5) 将影像集合(ImageCollection)转为要素集合(FeatureCollection)。因 GEE 的直方图绘制工具(ui.Chart.feature.histogram)仅支持要素集合,需通过此转换适配后续可视化需求。
  • 数量校验:fc5.size() 获取要素集合中的影像数量,print() 方法将数量输出到 GEE 控制台,用于检查数据加载是否正常(例如,若输出数量为 0,可能是研究区无对应卫星影像覆盖,或数据集 ID 错误)。

五、年度影像数量直方图可视化

var options = {
    title: '不同 Landsat 任务影像数量统计(按年份)',
    hAxis: { title: '年份' },
    vAxis: { title: '影像数量' },
    colors: ['orange']
};
// L5 直方图
print(ui.Chart.feature.histogram({
    features: fc5,
    property: 'year',
    minBucketWidth: 1
}).setOptions(options));
// L7、L8 直方图(代码结构同上,略去重复部分)
  • 图表配置:options 对象定义直方图的标题、坐标轴标签、颜色等样式(此处柱状图为橙色)。
  • 直方图绘制:ui.Chart.feature.histogram() 生成直方图,核心参数说明:
    • features:输入的要素集合(如fc5)。
    • property:统计的属性字段(此处为year,即按年份统计)。
    • minBucketWidth: 1:直方图的区间宽度为 1(因统计单位是年份,确保每个年份对应一个柱状图)。
  • 输出结果:图表通过print() 输出到控制台,可直观查看每颗卫星在各年份的影像覆盖数量(例如,Landsat 5 的直方图会显示 1984-2013 年各年份的影像数,Landsat 7 仅显示 1999-2002 年的影像数)。

六、Landsat 8 特定时期影像合成与可视化

(一)影像过滤与筛选

var startDate = '2020-06-01';
var endDate = '2020-09-01';
// 过滤 Landsat 8 某一时期
var l8_period = l8_coll
    .filterDate(startDate, endDate)
    .filter(ee.Filter.lt('CLOUD_COVER', 50));  // 可调云量阈值
print('指定时期内的 Landsat 8 影像数量:', l8_period.size());
  • filterDate(startDate, endDate):时间过滤,仅保留 2020 年 6 月 1 日 - 2020 年 9 月 1 日期间的影像(夏季植被生长旺盛期,常用于土地利用、植被覆盖度等分析)。
  • filter(ee.Filter.lt('CLOUD_COVER', 50)):云量过滤,仅保留云量低于 50% 的影像(云量过高会遮挡地物,影响后续分析精度,阈值可根据需求调整,如高精度分析可设为 30% 以下)。
  • 数量校验:打印筛选后的影像数量,若数量为 0,需检查时间范围是否合理或研究区该时期云量是否普遍过高。

(二)影像合成与剪裁

// 中值合成
var l8_median = l8_period.median();
// 剪裁至研究区
var l8_clipped = l8_median.clip(roi);
  • 中值合成(median()):对筛选出的多幅影像进行中值运算,生成一幅合成影像。优势在于:
    • 抑制云、大气噪声等异常值(中值对极端值不敏感)。
    • 保留地物的真实反射率特征,比均值合成更能减少云影影响。
  • 研究区剪裁(clip(roi)):仅保留合成影像中研究区roi范围内的部分,剔除外部无关区域,使可视化结果更聚焦。

(三)影像可视化参数设置与展示

// 可视化参数(真实色彩)
var visParams = {
    bands: ['B4', 'B3', 'B2'],  // Landsat 8 真彩色组合
    min: 0.05,
    max: 0.3,
    gamma: 1.2
};
// 显示影像和研究区
Map.centerObject(roi, 7);
Map.addLayer(l8_clipped, visParams,
    '研究区内 Landsat 8 合成影像(' + startDate + ' 至 ' + endDate + ')');
  • bands: ['B4', 'B3', 'B2']:Landsat 8 的波段组合,对应真彩色(B4 = 近红外波段,B3 = 红光波段,B2 = 绿光波段,与人类视觉系统匹配,地物颜色接近真实场景)。
  • min/max:反射率取值范围,Landsat TOA 数据的反射率通常在 0-1 之间,此处限定 0.05-0.3,避免因极端值导致影像过亮或过暗。
  • gamma: 1.2:伽马校正,用于调整影像的亮度对比度(gamma>1 时影像变暗,细节更清晰;gamma<1 时影像变亮)。
  • 地图展示:Map.addLayer() 将剪裁后的合成影像添加到地图,图层名称包含时间范围,便于识别;Map.centerObject(roi, 7) 再次确保地图居中到研究区。

七、关键技术要点与注意事项

  • 数据兼容性:
    • Landsat 5/7/8 的波段命名规则不同(如 Landsat 7 的真彩色组合为 B3/B2/B1),需注意可视化时的波段参数匹配,否则会出现色彩异常。

    • C02 版数据集是 GEE 的更新版本,相比 C01 版在辐射校正、几何校正等方面更优,建议优先使用。

  • 处理效率优化:
    • 若研究区范围较大或时间跨度较长,建议添加时间过滤(如filterDate),减少影像数量,避免 GEE 计算资源耗尽(平台对单次处理的影像数量有隐性限制)。

    • 云量阈值需根据研究目的调整:若需分析植被,建议云量低于 30%;若仅需大范围土地利用分类,可放宽至 50%-70%。

  • 错误排查:
    • 若控制台输出影像数量为 0,需检查:

      • 数据集 ID 是否正确(如 Landsat 5 的 ID 是否误写为LT08)。

      • 研究区roi是否为空或矢量格式错误(需为面状矢量,而非点 / 线矢量)。

      • 时间范围是否超出卫星运行周期(如 Landsat 5 无法获取 2014 年后的影像)。

    • 若影像可视化后呈全黑或全白,需调整visParams中的minmax值(可根据影像的反射率统计结果调整,例如通过print(l8_median.reduceRegion(ee.Reducer.minMax(), roi))获取实际反射率范围)。

  • 功能扩展方向:
    • 可添加影像质量过滤(如 Landsat 7 的PIXEL_QA波段过滤扫描线故障区域)。

    • 支持多时期影像合成对比(如分别合成 2020 年和 2023 年的影像,分析地物变化)。

    • 结合其他指数(如 NDVI 植被指数)进行专题可视化(需调整visParamsbands参数为指数波段)。

八、运行结果

研究区内 Landsat 8 合成影像
控制台输出的相关统计信息
控制台输出的相关统计信息
不同 Landsat 任务影像数据统计(Landsat 5)
不同 Landsat 任务影像数据统计(Landsat 7)
不同 Landsat 任务影像数据统计(Landsat 8)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@HNUSTer_CUMTBer

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值