Google Earth Engine(GEE)基于哨兵数据计算植被覆盖度—以宁夏为例

本文介绍了如何在Google Earth Engine中利用Sentinel-2卫星数据计算宁夏地区的植被覆盖度,并通过分级制图展示结果。作者分享了过滤云层、计算NDVI、制作FVC分级地图的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来分享一下如何在GEE中基于哨兵二号数据计算植被覆盖度,并分级制图。

以宁夏回族自治区为研究区

代码如下:


var roi = ee.FeatureCollection("users/lilei655123/Ningxia");
Map.centerObject(roi,7)
//boundary
var styling = {color:"red",fillColor:"00000000"};
Map.addLayer(roi.style(styling),{},"geometry")
function maskS2clouds(image) {
  var qa = image.select('QA60');

  // Bits 10 and 11 are clouds and cirrus, respectively.
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;

  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  return image.updateMask(mask).divide(10000);
}

var S2 = ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterDate('2021-07-01', '2021-09-30')
                  .filterBounds(roi)
                  // Pre-filter to get less cloudy granules.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',10))
                  .map(maskS2clouds)
                  .median();

//ndvi
    var NDVI1 = S2.expression('(NIR-R)/(NIR+R)',{
       'R': S2.select(['B4']),
       'NIR': S2.select(['B8']),
})


 var imgFVC = ((NDVI1.subtract(ee.Image(0.05))).divide((ee.Image(0.95)).subtract(ee.Image(0.05)))).float();
  var FVC=((imgFVC.lt(0)).multiply(0))
  .add(((imgFVC.gt(0)).and(imgFVC.lte(1))).multiply(imgFVC))
  .add((imgFVC.gt(1)).multiply(1))

var FVC_Class=FVC.where(FVC.lt(0.2),1)
                 .where(((FVC.gte(0.2)).and(FVC.lt(0.4))),2)
                 .where(((FVC.gte(0.4)).and(FVC.lt(0.6))),3)
                 .where(((FVC.gte(0.6)).and(FVC.lt(0.8))),4)
                 .where(FVC.gt(0.8),5)

Map.addLayer(FVC_Class.clip(roi),{min:1,max:5,palette:['DCDCDC','FFEBCD','99B718','529400','011301']},'FVC_Class')
var visualization = {
  min: 0.0,
  max: 0.3,
  bands: ['B4', 'B3', 'B2'],
};
Map.addLayer(S2.clip(roi), visualization, 'RGB');

显示结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
感谢关注,欢迎转发!

声明:仅供学习使用!

更多内容请关注微信公众号“生态遥感监测笔记”:

<think>好的,用户想比较GEE中使用Sentinel和Landsat 8数据计算植被覆盖度的结果,并求R²、MAE和RMSE。首先,我需要确定植被覆盖度的常用计算方法,比如像NDVI这样的指数。然后,用户可能需要知道如何在GEE中分别获取这两种数据源,并进行预处理,比如去云、大气校正等。接下来,计算各自的植被指数,可能还需要同步两种数据集的时间,或者选择同一时间段的数据进行比较。 然后,用户需要计算三个指标:R²、MAE、RMSE。这涉及到统计方法。在GEE中,可能需要将两种数据的结果进行配对,比如同一地理位置和时间的像元值,然后应用回归分析来计算R²。MAE和RMSE则需要计算预测值和参考值之间的差异,取绝对值和平方后的均值,再开根号(对于RMSE)。 但用户可能没有明确说明参考数据是什么,这时候可能需要假设其中一种数据作为基准,或者使用地面实测数据作为参考。如果用户没有地面数据,可能需要用其中一种卫星数据作为基准,比如假设Landsat 8作为参考,比较Sentinel的结果,或者反过来。不过需要注意两种传感器的分辨率和过境时间的差异,可能需要做空间和时间的匹配。 另外,用户提到的引用文献[^2]中提到了动态世界产品中的土地覆盖数据,可能可以用来辅助验证,比如通过土地覆盖类型来分层验证植被覆盖度的准确性。不过用户的问题主要是比较两种卫星数据的结果,可能需要直接比较它们的植被指数,或者通过某种模型将植被指数转换为植被覆盖度,比如像像元二分模型。 具体步骤可能包括:1. 数据准备和预处理;2. 计算植被指数;3. 转换为植被覆盖度(如果需要);4. 数据配对;5. 统计指标计算。在GEE中,可能需要使用reduceRegion、join等操作来配对数据点,然后使用线性回归模块计算R²,以及MAE和RMSE的公式进行计算。 需要注意的是,Sentinel和Landsat 8的空间分辨率不同(Sentinel-2是10米,Landsat 8是30米),所以在比较前可能需要将Sentinel数据重采样到30米,或者使用更高精度的参考数据。此外,时间匹配也很重要,需要确保两幅影像的获取时间尽可能接近,以减少植被生长变化带来的误差。 最后,用户可能需要具体的代码示来实现这些步骤,包括如何加载数据、处理、配对和计算指标。需要确保代码正确,并解释每一步的作用,帮助用户理解过程。</think>在Google Earth Engine中比较哨兵数据与Landsat 8数据植被覆盖度计算结果,需按照以下步骤进行: ### 一、数据准备与预处理 1. **哨兵数据加载** 使用`COPERNICUS/S2_SR`数据集,进行云掩膜处理: ```javascript var s2 = ee.ImageCollection('COPERNICUS/S2_SR') .filterDate('2020-01-01', '2020-12-31') .filterBounds(roi) .map(function(image) { return image.updateMask(image.select('QA60').eq(0)); }); ``` 2. **Landsat 8数据加载** 使用`LANDSAT/LC08/C02/T1_L2`数据集,进行辐射校正与云掩膜: ```javascript var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') .filterDate('2020-01-01', '0') .filterBounds(roi) .map(function(image) { return ee.Algorithms.Landsat.simpleComposite(image); }); ``` ### 二、植被指数计算 1. **NDVI计算公式** 哨兵数据: $$ \text{NDVI}_{\text{S2}} = \frac{B8 - B4}{B8 + B4} $$ Landsat 8数据: $$ \text{NDVI}_{\text{L8}} = \frac{SR_B5 - SR_B4}{SR_B5 + SR_B4} $$ 2. **植被覆盖度转换** 采用像元二分模型公式: $$ f = \frac{\text{NDVI} - \text{NDVI}_{\text{soil}}}{\text{NDVI}_{\text{veg}} - \text{NDVI}_{\text{soil}}} $$ 其中$\text{NDVI}_{\text{soil}}$取0.05,$\text{NDVI}_{\text{veg}}$取0.7 ### 三、精度验证方法 1. **数据配对** 通过时空匹配将两数据集对齐: ```javascript var joined = ee.Join.saveAll('matches') .apply({ primary: s2.select('NDVI'), secondary: l8.select('NDVI'), condition: ee.Filter.and( ee.Filter.maxDifference(24*3600*1000, 'system:time_start', null, 'system:time_start'), ee.Filter.intersects('.geo', null, '.geo') ) }); ``` 2. **统计指标计算** - **决策系数()**: $$ R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2} $$ - **平均绝对误差(MAE)**: $$ \text{MAE} = \frac{1}{n}\sum|y_i - \hat{y}_i| $$ - **均方根误差(RMSE)**: $$ \text{RMSE} = \sqrt{\frac{1}{n}\sum(y_i - \hat{y}_i)^2} $$ 3. **GEE实现代码** ```javascript var regression = ee.Reducer.linearRegression({ numX: 1, numY: 1 }); var fit = pairedData.select(['L8_NDVI','S2_NDVI']) .reduce(regression); var coefficients = fit.get('coefficients'); var errors = pairedData.map(function(image){ var pred = image.get('L8_NDVI').multiply(coefficients.get(0)).add(coefficients.get(1)); return image.set({ 'error': pred.subtract(image.get('S2_NDVI')), 'sq_error': pred.subtract(image.get('S2_NDVI')).pow(2) }); }); var mae = errors.aggregate_mean('error').abs(); var rmse = errors.aggregate_mean('sq_error').sqrt(); ``` ### 四、结果解读要点 1. 哨兵数据因10米分辨率能更好捕捉植被细节空间分布 2. Landsat 8因30米分辨率更适用于大范围区域分析 3. 时间同步误差需控制在±3天内
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

生态遥感监测笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值