GEE:计算FVC(Fraction of Vegetation Cover)代码详解

本文介绍了一种使用Google Earth Engine(GEE)平台进行遥感影像处理的方法,该方法可以将一幅遥感影像转换成植被覆盖度(Fraction of Vegetation Cover,FVC)影像,同时去除云和阴影干扰。

结果如下图所示,

GEE:计算FVC(Fraction of Vegetation Cover)代码详解_第1张图片


文章目录

      • 一、FVC公式
      • 二、数据预处理
      • 三、计算百分位数
      • 四、计算FVC
      • 五、代码链接


一、FVC公式

F V C = l e s s P a r t ∗ 0 + m i d d l e P a r t ∗ ( N D V I − 5 % 分位数 ) / ( 95 % 分位数 − 5 % 分位数 ) + g r e a t e r P a r t ∗ 1 FVC =lessPart * 0 + middlePart * (NDVI - 5\%分位数) / (95\%分位数 - 5\%分位数) + greaterPart * 1 FVC=lessPart0+middlePart(NDVI5%分位数)/(95%分位数5%分位数)+greaterPart1

二、数据预处理

//导入矢量边界
var roi = table

//去云函数
function rmCloud(image) {
  var cloudShadowBitMask = (1 << 3);
  var cloudsBitMask = (1 << 5);
  var qa = image.select("pixel_qa")
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask);
}

//筛选数据,并计算NDVI,添加NDVI波段
var bestNDVI=ee.ImageCollection("LANDSAT/LE07/C01/T1_SR")
      .filterDate("2000-04-01","2000-10-31")
      .filterBounds(roi)
      .map(rmCloud)
      .map(function(image){
        var ndvi=image.normalizedDifference(["B4","B3"]);
        return image.addBands(ndvi.rename("NDVI"))
      })
      .qualityMosaic("NDVI")
      .clip(roi)
      .select("NDVI");
Map.centerObject(roi,8);
Map.addLayer(bestNDVI,{},"bestNDVI");

三、计算百分位数

//calculate the 5% and 95% num of the image
var num =bestNDVI.reduceRegion({
      reducer:ee.Reducer.percentile([5,95]),
      geometry:roi,
      scale:30,
      maxPixels:1e13
    });
print("num",num);

//将NDVI从小到大的顺序排序
//然后把位于第5%位置的NDVI作为最小值
//把位于95%的NDVI作为最大值
var min = ee.Number(num.get("NDVI_p5"));
var max = ee.Number(num.get("NDVI_p95"));
print("min",min);//将值打印到控制台
print("max",max)

计算给定区域内 NDVI 数据的 5% 和 95% 两个百分位数,并将结果存储在 num 变量中。
以下是代码中使用的参数的含义:

  • bestNDVI:要计算百分位数的 NDVI 图像。
  • reduceRegion():将一个区域内的像素值缩减为一个值的方法。
  • reducer:缩减函数,指定了要计算的百分位数(这里是 5% 和 95%)。
  • geometry:要缩减的区域,这里是 roi,矢量边界。
  • scale:缩减的空间分辨率,这里是 30 米(相当于重采样后的分辨率,在重采样的基础上进行统计)。
  • maxPixels:要处理的像素数量的上限,这里是 1e13(10 的 13 次方,这是GEE允许的最大值)。

计算结果存储在 num 变量中,是一个包含 5% 和 95% 两个值的对象。可以通过 num.get() 方法获取其中的具体值。

var greaterPart = bestNDVI.gt(max);
var lessPart    = bestNDVI.lt(min);

这两行代码定义了两个图像变量 greaterPart 和 lessPart,它们分别表示比给定的最大值 max 大和比给定的最小值 min 小的部分。利用 ee.Image.gt() 和 ee.Image.lt() 这两个方法来实现图像的比较运算,它们将返回一个由 0 和 1 组成的二元图像,表示图像中每个像素点是否满足大于或小于给定的值。

    var middlePart  =ee.Image(1).subtract(greaterPart).subtract(lessPart);
    // get the middle part

这一行代码定义了一个变量 middlePart,用于表示介于给定的最小值和最大值之间的部分。利用 ee.Image.subtract() 方法来实现两个二元图像的差运算,从而得到中间部分的二元图像。由于 greaterPart 和 lessPart 取值为 0 或 1,因此它们的差值也只会取 0 或 1,从而得到中间部分的二元图像。

//var mask=bestNDVI.gt(mim).add(bestNDVI.lt(min));
//var middlePart=bestNDVI.updateMask(mask);

使用 ee.Image() 这个构造函数来创建一个初始值为 1 的图像。这个图像中的每个像素点的值都为 1,可以用于与其他二元图像进行运算,从而得到所需的结果。

这两行代码是被注释掉的,是原作者可能尝试过的无用代码。其中,第一行代码利用 ee.Image.add() 方法将 bestNDVI.gt(mim) 和 bestNDVI.lt(min) 的结果进行加运算,得到一个表示不在给定范围内的像素点的二元图像。第二行代码利用 ee.Image.updateMask() 方法将不在给定范围内的像素点的值设为 null。

四、计算FVC

var tempf1=bestNDVI.subtract(min).divide(max.subtract(min));

这一行代码定义了一个变量 tempf1,表示 NDVI 图像的标准化值。首先使用 ee.Image.subtract() 和 ee.Image.divide() 方法分别计算 NDVI 图像与给定的最小值 min 的差值和最大值 max 与最小值 min 的差值,然后将这两个结果相除得到标准化的 NDVI 值。

var FVC = ee.Image(1)
            .multiply(greaterPart)
            .add(ee.Image(0).multiply(lessPart))
            .add(tempf1.multiply(middlePart))
            .toFloat();

这里定义了一个变量 FVC,用于表示计算得到的 FVC 图像。首先使用 ee.Image.multiply() 方法将二元图像 greaterPart 与常数图像 ee.Image(1) 相乘,得到一个表示大于给定最大值的像素点的图像;然后使用 ee.Image.multiply() 方法将二元图像 lessPart 与常数图像 ee.Image(0) 相乘,得到一个表示小于给定最小值的像素点的图像。最后,使用 ee.Image.add() 方法将这三部分图像相加得到最终的 FVC 图像。

由于 GEE 中图像的数据类型默认是双精度浮点型(Double),而 FVC 的值只能在 0 到 1 之间,因此我们在这里使用了 ee.Image.toFloat() 方法将 FVC 图像转换为单精度浮点型(Float)。

Map.addLayer(FVC,{},"FVC");

这一行代码将计算得到的 FVC 图像添加到地图上进行可视化。

//导出⽂文件到Drive
Export.image.toDrive({
		image: FVC,
		description: "2000fvc",
		fileNamePrefix: "2000fvc",
		folder: " 20230406fvc",
		scale: 30,
		region: roi,
		maxPixels: 1e13
});

Export.image.toDrive() 是 Google Earth Engine API 中用于将图像导出到 Google Drive 上的方法。它包含以下参数:

  • image:要导出的图像。
  • description:导出任务的描述信息。
  • fileNamePrefix:导出文件的前缀。
  • folder:导出文件的目标文件夹。
  • scale:导出图像的空间分辨率,单位是米。
  • region:要导出的区域。
  • maxPixels:导出图像的最大像素数。

五、代码链接

https://code.earthengine.google.com/7425c635319e2a0b08b64d452cec00f9?noload=true

你可能感兴趣的:(GEE入门到高阶应用,GEE,GEE,云计算,javascript,arcgis)