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

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于 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 年至今,传感器性能更优)
- Landsat 5:
过滤条件说明:
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指定(区分三颗卫星)。
- 调用结果:生成三个已添加属性的新影像集合
iC5、iC7、iC8。
四、影像集合转 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中的min和max值(可根据影像的反射率统计结果调整,例如通过print(l8_median.reduceRegion(ee.Reducer.minMax(), roi))获取实际反射率范围)。
-
- 功能扩展方向:
-
可添加影像质量过滤(如 Landsat 7 的
PIXEL_QA波段过滤扫描线故障区域)。 -
支持多时期影像合成对比(如分别合成 2020 年和 2023 年的影像,分析地物变化)。
-
结合其他指数(如 NDVI 植被指数)进行专题可视化(需调整
visParams的bands参数为指数波段)。
-
八、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
113






