本文将介绍在 Google Earth Engine (GEE)平台上进行栅格计算的代码。
https://yangleduo.blog.csdn.net/article/details/138350195?spm=1001.2014.3001.5502
https://code.earthengine.google.com/87226239bba1a9ea6626a25f8b3d2483?noload=true
结果如下图所示,
一、需求
下表列出了几个 ArcGIS 中常用到的栅格计算器公式,我们经常在 ArcGIS 中进行这些操作,但是这些常用到的操作在 GEE 中也可以实现。
二、核心函数
2.1 GEE内置API
2.1.1 比较函数
备注:左操作数和右操作数分别代表需要比较的两个图像。
2.1.2 掩膜操作
2.1.3 布尔运算
2.1.4 数据范围调整
2.2 其他API
2.2.1 设置研究区边界样式
var eevs = require('users/949384116/lib:ImageVisualization/VectorStyle');
var roi = geometry;
var roiWithStyle = eevs.setDefaultGeometryStyle(geometry);
2.2.2 获取示例NDVI图像
输入:研究区边界 roi,是否显示作者主页 boolAuthHomePageShow ,可填 true 或者 false(默认 false)。
输出:研究区内由2024年4月的 Landsat 中值合成影像生成的 NDVI 图像。
var boolAuthHomePageShow = true;
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
var ndvi = eesi.getExampleNDVIImageFromLandsat(roi, boolAuthHomePageShow);
2.2.2 打印最大最小值
输入:依次为单波段图像 ndvi,波段名,图像名称,研究区边界,分辨率,地理坐标系EPSG编号,bestEffort,tileScale。
输出:一个对象,有最大值和最小值。并可以在控制台打印最大值最小值。
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
eesi.minMaxValue(ndvi, 'NDVI', 'Original NDVI', roi, 30, "EPSG:4326", true, 5);
2.2.3 绘制像素分布直方图
输入:依次为单波段图像 ndvi,图像名称,研究区边界,分辨率。
输出:像素值分布直方图。并在控制台绘制像素值分布直方图。
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
eesi.histogramOfImage(ndvi, 'Original NDVI', roi, 30);
三、示例代码链接
https://code.earthengine.google.com/87226239bba1a9ea6626a25f8b3d2483?noload=true
四、示例代码详解
4.1 获取示例NDVI图像
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
var ndvi = eesi.getExampleNDVIImageFromLandsat(roi, true);
4.2 将指定像素设置为空值
4.2.1 将NDVI像素值小于0的像素设置为空值
var mask_NDVI_gte0 = ndvi.gte(0);
var ndvi_nullifyUnderThreshold = ndvi.updateMask(mask_NDVI_gte0);
4.2.1 将DEM小于150的NDVI图像的像素设置为空值
var mask_DEM_gt150 = ee.Image("USGS/SRTMGL1_003").gt(150).clip(roi);
var ndvi_nullifyUnderDEMThreshold = ndvi.updateMask(mask_DEM_gt150);
4.2.3 将合并掩膜区域的NDVI图像的像素设置为空值
var composite_mask = mask_DEM_gt150.and(mask_NDVI_gte0);
var ndvi_nullifyUnderCompositeMask = ndvi.updateMask(composite_mask);
4.3
将空值像素赋值为指定值
var ndvi_replaceNullWithZero = ndvi_nullifyUnderCompositeMask.unmask(0);
4.4 将符合条件的像素设置为指定像素值
4.4.1 将NDVI小于0的像素设置为0
var mask_ndvi_lt0 = ndvi.lt(0);
var ndvi_modifyValuesByCondition = ndvi.where(mask_ndvi_lt0, 0);
4.4.2 将DEM小于150的NDVI图像的像素设置为0
var mask_DEM_lt150 = ee.Image("USGS/SRTMGL1_003").lt(150).clip(roi);
var ndvi_modifyValuesByElevationThreshold = ndvi.where(mask_DEM_lt150, 0);
4.4.3 将ndvi小于0且DEM小于150的NDVI图像的像素设置为0
var composite_mask_2 = mask_DEM_lt150.or(mask_ndvi_lt0);
Map.addLayer(composite_mask_2, visParams, 'Composite Mask 2', false);
var ndvi_modifyValuesByCompositeMask2 = ndvi.where(composite_mask_2, 0);
4.5 NDVI图像像素值离散化(重分类)
var discrete_ndvi = ndvi.where(ndvi.lt(0), 1)
.where(ndvi.gte(0).and(ndvi.lte(0.3)), 2)
.where(ndvi.gt(0.3), 3);
4.6 将图像中每个像素的值限制在一个给定的范围内
4.6.1 clamp()
var ndvi_LimitValuesWithinRange = ndvi.clamp(0, 1);
4.6.2 unitScale()
var ndvi_rescaleToUnitInterval = ndvi.unitScale(-1, 1);
4.6.3 手动实现最大最小值归一化
var Min = -0.9970119595527649;
var Max = 0.9034250974655151;
var image_d = ndvi.subtract(Min);
var ndvi_normalizeMinMax = image_d.divide(Max - Min);
4.6.4 手动实现等比例映射
var a = 255 - 0;
var b = Max - (Min);
var scale = a / b;
var ndvi_manualRatioScale = ndvi.subtract(Min).multiply(scale);
var manualRatiovisParams = { min: 0, max: 255, palette: palette };