基于 GEE 可视化分析植被覆盖度 FVC 的时序变化

目录

一、植被覆盖度(FVC)计算方法

二、核心功能模块概览

三、逐模块详细解析

(一)地图初始化:定位与缩放设置

(二)云去除函数:消除影像干扰(核心预处理步骤)

(三)FVC 计算函数:基于 NDVI 的植被覆盖度模型

(四)年度 FVC 处理函数:按年份批量处理影像

(五)覆盖度统计与等级划分:量化分析与分类

(六)结果可视化:年际变化图表生成

四、代码关键特点与注意事项

五、代码应用场景

六、运行结果


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

本代码基于 Google Earth Engine(GEE)平台,实现了 2017-2021 年指定区域夏季(6-9 月)Landsat 8 卫星影像的植被覆盖度(FVC)计算、等级划分、数据导出及年际变化分析,核心功能围绕影像预处理、指数计算、统计分析和可视化展开。

一、植被覆盖度(FVC)计算方法

植被覆盖度指某一地域植物垂直投影面积与该地域面积之比,用百分数表示。森林覆盖率,亦称森林覆被率指一个国家或地区森林面积占土地面积的百分比,是反映一个国家或地区森林面积占有情况或森林资源丰富程度及实现绿化程度的指标,又是确定森林经营和开发利用方针的重要依据之一。

长序列的时间分析,一个卫星系列的数据可能不够,就需要将多个数据整合,提取出需要的波段。目前已经发展了很多利用遥感测量植被覆盖度的方法,较为实用的方法是利用植被指数近似估算植被覆盖度,常用的植被指数为NDVI。下面是像元二分模型的模型:

其中, NDVIsoil 为完全是裸土或无植被覆盖区域的NDVI值,NDVIveg 则代表完全被植被所覆盖的像元的NDVI值,即纯植被像元的NDVI值。两个值的计算公式为:

利用这个模型计算植被覆盖度的关键是计算NDVIsoil和NDVIveg。这里有两种假设:

(1)当区域内可以近似取VFCmax=95%,VFCmin=5%时,公式(1)可变为:

NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。由于不可避免存在噪声,NDVImax 和NDVImin一般取一定置信度范围内的最大值与最小值,置信度的取值主要根据图像实际情况来定。

(2)当区域内不能近似取VFCmax=100%,VFCmin=0%时,在有实测数据的情况下,取实测数据中的植被覆盖度的最大值和最小值作为VFCmax和 VFCmin,这两个实测数据对应图像的NDVI作为NDVImax 和NDVImin。在没有实测数据的情况下,取一定置信度范围内的NDVImax 和NDVImin。VFCmax和 VFCmin根据经验估算。

二、核心功能模块概览

代码整体分为 6 个核心模块,各模块职责明确、层层递进,从基础的地图设置到最终的图表展示,形成完整的植被覆盖度分析流程:

模块名称核心作用依赖关系
地图初始化定位地图中心,设置初始缩放无(代码入口)
云去除函数消除影像中云及云阴影干扰影像预处理前置步骤
FVC 计算函数基于 NDVI 和百分位数法计算植被覆盖度依赖云去除后的影像
年度 FVC 处理函数按年份筛选影像、计算年度 FVC 并导出依赖云去除和 FVC 计算函数
覆盖度统计函数计算区域内年度 FVC 均值依赖年度 FVC 结果
结果可视化与导出生成 FVC 等级图层、年际变化图表依赖所有前置模块结果

三、逐模块详细解析

(一)地图初始化:定位与缩放设置

// 将地图中心定位到指定几何对象,并设置缩放级别为 7
Map.centerObject(table, 7);
  • 核心作用:初始化 GEE 地图界面,将视图中心固定到用户定义的几何区域(变量table,通常为研究区矢量边界),并设置缩放级别为 7(GEE 缩放级别 1-24,7 级对应中等区域视野,可清晰显示研究区整体范围)。
  • 关键说明table是预先导入的矢量数据(如 Shapefile 转换的 GEE FeatureCollection),需确保与后续影像分析的区域一致,否则会导致后续 “影像裁剪”“区域统计” 等操作出错。

(二)云去除函数:消除影像干扰(核心预处理步骤)

云及云阴影会严重影响植被指数(如 NDVI)的计算精度,该函数通过 Landsat 8 影像的质量控制波段(QA_PIXEL)实现云去除,是保证 FVC 计算准确性的关键步骤。

// 去云函数
function maskcloud(image) {
    // 1. 定义云阴影和云的位掩码(基于Landsat 8 QA_PIXEL波段编码规则)
    var cloudShadowBitMask = 1 << 3;  // 云阴影对应二进制位(左移3位,等价于8)
    var cloudsBitMask = 1 << 5;       // 云对应二进制位(左移5位,等价于32)
    
    // 2. 选择影像的QA_PIXEL波段(质量控制波段,存储像素质量信息)
    var qa = image.select('QA_PIXEL');
    
    // 3. 创建掩码:保留无云、无云阴影的像素(位运算逻辑)
    var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
      .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
    // 逻辑解释:bitwiseAnd(位掩码)判断像素是否属于云/云阴影,eq(0)表示“不属于”,and连接两个条件
    
    // 4. 应用掩码并保留原始影像关键属性
    return image.updateMask(mask)  // 用掩码过滤像素(掩码为0的像素设为透明)
      .copyProperties(image, ["system:time_start", 'CLOUD_COVER']);  // 保留时间、云量属性
}
  • 核心原理:Landsat 8 的 QA_PIXEL 波段采用 “位编码” 方式存储像素质量,不同二进制位对应不同质量(如云、云阴影、水体等)。通过 “位运算”(bitwiseAnd)提取目标质量类型,再通过 “等于 0”(eq(0))筛选出无干扰的像素。
  • 注意事项:该函数仅适用于 Landsat 8 C02/T1_L2 级影像(代码中影像集合路径为LANDSAT/LC08/C02/T1_L2),其他卫星(如 Sentinel-2)或 Landsat 其他级别影像的 QA 波段编码规则不同,需修改位掩码数值。

(三)FVC 计算函数:基于 NDVI 的植被覆盖度模型

植被覆盖度(FVC)是指植被(叶、茎、枝)在地面的垂直投影面积占研究区总面积的百分比,代码采用 “百分位数法” 计算 FVC,该方法无需人工设定阈值,适用性更强。

// 计算植被覆盖度函数 
function calFVC(BestVI, region, scale) {
    // 1. 计算研究区内NDVI的第5和第95百分位数(确定植被与非植被的阈值范围)
    var num = BestVI.reduceRegion({
        reducer: ee.Reducer.percentile([5, 95]),  // 计算指定百分位数
        geometry: region,  // 统计范围(研究区)
        scale: scale,      // 统计分辨率(与影像分辨率匹配,避免重采样误差)
        maxPixels: 1e13    // 最大处理像素数(避免因区域过大报错)
    });
    
    // 2. 提取百分位数结果(第5百分位≈非植被NDVI,第95百分位≈纯植被NDVI)
    var min = ee.Number(num.get("NDVI_p5"));  // 第5百分位数(NDVI_min)
    var max = ee.Number(num.get("NDVI_p95"));  // 第95百分位数(NDVI_max)
    
    // 3. 划分NDVI区间,分区间计算FVC
    // 区间1:NDVI > 第95百分位 → FVC=1(纯植被)
    var greaterPart = BestVI.gt(max);
    // 区间2:NDVI < 第5百分位 → FVC=0(非植被)
    var lessPart = BestVI.lt(min);
    // 区间3:第5-95百分位之间 → 线性插值计算FVC
    var middlePart = ee.Image(1).subtract(greaterPart).subtract(lessPart);
    
    // 4. 线性插值公式:FVC = (NDVI - NDVI_min) / (NDVI_max - NDVI_min)
    var tempf1 = BestVI.subtract(min).divide(max.subtract(min));
    // 合并三个区间结果,得到最终FVC
    var FVC = ee.Image(1).multiply(greaterPart)
      .add(ee.Image(0).multiply(lessPart))
      .add(tempf1.multiply(middlePart));
    
    return FVC.rename('FVC');  // 重命名波段为“FVC”,便于后续识别
}
  • 核心公式:当 NDVI ≤ NDVI_min 时,FVC = 0;当 NDVI ≥ NDVI_max 时,FVC = 1;当 NDVI_min <NDVI < NDVI_max 时,FVC = (NDVI - NDVI_min)/(NDVI_max - NDVI_min)。
  • 关键参数
    • BestVI:输入的植被指数影像(此处为 NDVI,归一化植被指数,反映植被生长状况);
    • region:研究区矢量边界(需与table一致);
    • scale:计算分辨率(代码后续设为 60 米,与 Landsat 8 影像原始分辨率(30 米)的 2 倍匹配,平衡精度与计算效率)。

(四)年度 FVC 处理函数:按年份批量处理影像

该函数是代码的 “核心执行单元”,实现了按年份筛选夏季影像、云去除、NDVI 计算、FVC 计算、结果导出及图表生成的全流程自动化。

// 引入植被覆盖度函数,处理年度FVC
var LC8_BANDS = ['SR_B4', 'SR_B5']; // Landsat 8波段:SR_B4(红光)、SR_B5(近红外)
function FVC_year(year, roi) {
    // 1. 定义年度分析时间范围:夏季(6月1日-9月30日,植被生长旺季)
    var Date_start = ee.Date.fromYMD(year, 6, 1);
    var Date_end = ee.Date.fromYMD(year, 9, 30);
    
    // 2. 筛选Landsat 8影像集合(多条件过滤,保证数据质量)
    var l8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
      .filterDate(Date_start, Date_end)  // 时间过滤:夏季
      .filterBounds(roi)                 // 空间过滤:研究区范围内
      .filter(ee.Filter.lte('CLOUD_COVER', 10))  // 云量过滤:云量≤10%
      .select(LC8_BANDS);                // 选择所需波段(红光、近红外)
    
    // 3. 影像合成:计算中位合成影像(减少单景影像噪声干扰)
    var LandsatMean = l8.median().clip(roi);  // 合成后裁剪到研究区
    l8 = null;  // 释放内存(避免大影像集合占用过多内存,提升脚本运行效率)
    
    // 4. 计算NDVI(归一化植被指数,FVC计算的基础)
    // NDVI公式:(近红外波段 - 红光波段) / (近红外波段 + 红光波段)
    var NDVI = LandsatMean.normalizedDifference(["SR_B5", "SR_B4"]).rename("NDVI");
    
    // 5. 调用calFVC函数,计算年度植被覆盖度
    var FVC = calFVC(NDVI, roi, 60);  // 分辨率设为60米
    
    // 6. (可选)生成FVC直方图(分析FVC在研究区内的分布特征)
    var chart = ui.Chart.image.histogram({
        image: FVC,
        region: table,
        scale: 60,
    });
    // print(chart);  // 若需显示直方图,取消注释该行
    
    // 7. 导出FVC影像到Google Drive(便于后续离线分析)
    Export.image.toDrive({
        image: FVC,                // 待导出影像(年度FVC)
        description: "fvc" + year, // 导出文件名称(如“fvc2017”)
        scale: 60,                 // 导出分辨率
        region: table,             // 导出范围(研究区)
        maxPixels: 1e13            // 最大像素数(避免报错)
    });
    
    return FVC.rename("FVC");  // 返回年度FVC影像,用于后续统计
}

关键设计

  • 时间范围选择:夏季(6-9 月)是多数地区植被生长最旺盛的时期,此时 NDVI 值最高,能更准确反映植被覆盖状况;
  • 影像合成方式:采用 “中位合成”(median())而非 “均值合成”,可有效减少云残留、大气散射等噪声的影响(中位数对异常值更稳健);
  • 内存管理l8 = null释放影像集合内存,是 GEE 脚本优化的重要技巧,尤其适用于长时间序列(如 5 年以上)影像处理,避免因内存溢出导致脚本中断。

(五)覆盖度统计与等级划分:量化分析与分类

该模块通过循环遍历 2017-2021 年,调用FVC_year函数获取年度 FVC,再计算区域平均 FVC 并划分 FVC 等级,实现 “量化统计 + 定性分类” 的双重分析。

// 1. 定义计算区域平均FVC的函数
function calculateCoverage(image) {
    var coverage = image.reduceRegion({
        reducer: ee.Reducer.mean(),  // 统计方法:计算均值(区域平均FVC)
        geometry: table,             // 统计范围
        scale: 30,                   // 统计分辨率(30米,比FVC计算分辨率更高,提升统计精度)
        maxPixels: 1e13
    }).get('FVC');  // 提取FVC波段的均值结果
    return coverage;
}

// 2. 循环处理2017-2021年数据(批量计算+等级划分)
var coverageData = [];  // 存储年度平均FVC数据(格式:[年份, 平均FVC])
var year_start = 2017;  // 起始年份
var year_end = 2022;    // 结束年份(循环条件为“< year_end”,实际处理到2021年)

for (var year = year_start; year < year_end; year++) {
    // 2.1 调用FVC_year函数,获取年度FVC影像
    var ImgFVC = FVC_year(year, table);
    
    // 2.2 计算年度区域平均FVC,并存入数组
    var coverage = calculateCoverage(ImgFVC);
    coverageData.push([year, coverage]);
    
    // 2.3 划分FVC等级(5级分类,便于可视化区分植被覆盖程度)
    var FVC_rank = ImgFVC.where(ImgFVC.lt(0.2), 1)    // 1级:FVC<0.2(低覆盖)
      .where((ImgFVC.gte(0.2).and(ImgFVC.lt(0.4))), 2)// 2级:0.2≤FVC<0.4(较低覆盖)
      .where((ImgFVC.gte(0.4).and(ImgFVC.lt(0.6))), 3)// 3级:0.4≤FVC<0.6(中覆盖)
      .where((ImgFVC.gte(0.6).and(ImgFVC.lt(0.8))), 4)// 4级:0.6≤FVC<0.8(较高覆盖)
      .where(ImgFVC.gt(0.8), 5);                      // 5级:FVC>0.8(高覆盖)
    
    // 2.4 添加FVC等级图层到地图(默认不显示,需手动在GEE界面勾选)
    Map.addLayer(FVC_rank, 
      { min: 1, max: 5, palette: ["DCDCDC", "FFEBCD", "99B718", "529400", "011301"] }, 
      "FVC_rank" + year, 
      false);  // false表示默认隐藏图层
}
  • FVC 等级设计依据:参考《植被覆盖度遥感产品制作技术规范》,5 级分类能清晰区分不同植被覆盖强度,对应的调色板从浅灰(低覆盖)到深绿(高覆盖),符合人眼对植被密度的直观认知。
  • 统计分辨率选择calculateCoverage函数中scale: 30(Landsat 8 原始分辨率),比 FVC 计算的 60 米分辨率更高,可减少重采样导致的统计误差,使平均 FVC 更准确。

(六)结果可视化:年际变化图表生成

该模块将coverageData数组(年度平均 FVC)转换为 GEE 图表格式,生成折线图展示 2017-2021 年 FVC 的年际变化趋势,直观反映植被覆盖的动态变化。

// 1. 提取年份和平均FVC数据(从coverageData数组中拆分)
var years = [];     // 存储年份(如[2017,2018,2019,2020,2021])
var coverages = []; // 存储对应年份的平均FVC
for (var i = 0; i < coverageData.length; i++) {
    years.push(coverageData[i][0]);
    coverages.push(coverageData[i][1]);
}

// 2. 打印年度平均FVC数据(在GEE控制台显示,便于查看原始数值)
print(coverageData);

// 3. 转换数据格式(将二维数组转为GEE图表支持的Array格式)
var chartData01 = ee.Array(ee.List(coverageData));
var x = chartData01.slice(1, 0, 1, 1);  // 提取x轴数据(年份):从第1维、第0个元素开始,取1个元素
var y = chartData01.slice(1, 1);        // 提取y轴数据(平均FVC):从第1维、第1个元素开始,取剩余所有元素

// 4. 创建年际变化折线图
var coverageChart = ui.Chart.array.values({
    array: y,       // y轴数据(平均FVC)
    axis: 0,        // 数据维度(0表示一维数组)
    xLabels: x      // x轴数据(年份)
})
  .setChartType('LineChart')  // 图表类型:折线图(适合展示时间序列变化)
  .setOptions({
        title: 'Yearly Average Coverage',  // 图表标题:年度平均植被覆盖度
        hAxis: { title: 'Year' },          // x轴标签:年份
        vAxis: { title: 'Coverage' },      // y轴标签:植被覆盖度
        lineWidth: 1,                      // 线宽:1像素(清晰不冗余)
        pointSize: 3,                      // 数据点大小:3像素(便于识别每年数据)
        series: {
            0: { color: 'blue' }           // 折线颜色:蓝色(醒目且不刺眼)
        }
    });

// 5. 在GEE控制台显示图表
print(coverageChart);

图表意义:折线图能直观展示 FVC 的年际变化趋势,例如:若 2017-2021 年折线整体上升,说明研究区植被覆盖状况持续改善;若某一年出现明显下降,可能与当年干旱、火灾等自然灾害相关,为后续生态分析提供数据支撑。

四、代码关键特点与注意事项

关键特点:

  • 自动化程度高:通过循环和函数封装,实现 2017-2021 年数据的批量处理,无需手动逐年份操作;
  • 数据质量控制严格:通过 “云量≤10%” 过滤和maskcloud去云函数,最大程度减少云干扰;
  • 结果输出多样化:支持 FVC 影像导出(用于空间分析)、平均 FVC 数值打印(用于定量统计)、折线图展示(用于趋势分析)、等级图层添加(用于空间可视化)。

注意事项:

  • 数据依赖:需预先导入研究区矢量数据(table),且确保table的坐标系与 Landsat 8 影像一致(均为 WGS84);
  • 内存管理l8 = null是重要的内存优化步骤,若删除该句,处理长时间序列影像时可能出现内存溢出;
  • 导出设置:导出影像时需确保 Google Drive 有足够存储空间,且maxPixels值(1e13)需大于研究区像素数(避免导出失败);
  • 适用性限制:该代码仅适用于 Landsat 8 C02/T1_L2 影像,若更换为 Sentinel-2 等其他卫星影像,需修改波段名称(如 Sentinel-2 的红光波段为 B4、近红外波段为 B8)和去云函数(基于 Sentinel-2 的 QA 波段编码)。

五、代码应用场景

该代码主要用于区域尺度的植被覆盖度长时间序列分析,典型应用场景包括:

  • 生态环境监测:如退耕还林、天然林保护等生态工程的效果评估;
  • 气候变化影响分析:研究气候变化(如降水、温度变化)对植被覆盖的影响;
  • 土地利用变化关联分析:结合土地利用数据,分析耕地、林地等不同土地利用类型的 FVC 差异及变化;
  • 灾害后生态恢复评估:如地震、洪水后,通过 FVC 变化分析植被恢复速度和效果。

六、运行结果

研究区植被覆盖度可视化结果
点击RUN即可下载数据
研究区植被覆盖度时序变化折线图

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

### 如何在 Google Earth Engine 上准确计算并验证 FVC 的精度 #### 使用 GEE 计算 NDVI 和 FVC Google Earth Engine 提供了一个强大的环境来处理大规模的遥感数据。为了计算植被覆盖度(Fractional Vegetation Cover, FVC),通常会先通过归一化植被指数(Normalized Difference Vegetation Index, NDVI)作为中间变量[^1]。 NDVI 是一种广泛使用的指标,其定义如下: \[ \text{NDVI} = \frac{\text{(NIR - Red)}}{\text{(NIR + Red)}} \] 其中 NIR 表示近红外波段反射率,Red 表示红光波段反射率。这两个波段可以从 Landsat 或 Sentinel 卫星影像中获取。 FVC 可以由 NDVI 转换而来,常见的转换公式为: \[ \text{FVC} = \left\{ \begin{array}{ll} 0 & \quad \text{if } \text{NDVI} \leq \text{NDVI}_{soil} \\ \frac{\text{NDVI} - \text{NDVI}_{soil}}{\text{NDVI}_{veg} - \text{NDVI}_{soil}} & \quad \text{if } \text{NDVI}_{soil} < \text{NDVI} < \text{NDVI}_{veg} \\ 1 & \quad \text{if } \text{NDVI} \geq \text{NDVI}_{veg} \end{array} \right. \] 这里 \( \text{NDVI}_{soil} \) 和 \( \text{NDVI}_{veg} \) 分别表示土壤背景和完全植被覆盖条件下的 NDVI 值[^2]。 以下是实现该过程的一个 Python 示例脚本: ```python import ee ee.Initialize() def calculate_fvc(image): ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI') # 定义 NDVI_soil 和 NDVI_veg 阈值 ndvi_soil = 0.2 ndvi_veg = 0.8 fvc = ( ndvi.subtract(ndvi_soil) .divide(ndvi_veg.subtract(ndvi_soil)) .clamp(0, 1) ).rename('FVC') return image.addBands(fvc) # 加载 Sentinel-2 数据集 sentinel2 = ee.ImageCollection('COPERNICUS/S2_SR') \ .filterDate('2023-01-01', '2023-12-31') \ .filterBounds(ee.Geometry.Point([120.15, 30.2])) fvc_collection = sentinel2.map(calculate_fvc) print(f'FVC Collection: {fvc_collection}') ``` #### 验证 FVC 精度的方法 要评估基于 GEE 平台计算得到的 FVC 结果的精度,可以通过以下方法进行验证: 1. **地面实测数据对比** 收集研究区域内的实地测量数据,这些数据应包括植被覆盖率的真实值。将模型预测的 FVC 值与实际观测值进行比较,常用统计量包括均方根误差(RMSE)、决定系数(R²)等。 2. **高分辨率影像辅助校正** 利用更高分辨率的卫星影像(如 WorldView 或 GeoEye 影像)手动解译出精确的植被分布图,并将其作为参考标准与低分辨率影像上的 FVC 进行匹配分析。 3. **交叉验证技术** 将整个样本划分为训练集和测试集两部分,在训练集中拟合参数关系式后再应用到独立的测试子样上检验效果的好坏程度;或者采用 K 折交叉验证法进一步提高估计稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@HNUSTer_CUMTBer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值