作者:CSDN @ 养乐多
本文将介绍在 Google Earth Engine (GEE)平台上进行栅格计算的代码。
结果如下图所示,
文章目录
-
-
- 一、需求
- 二、核心函数
-
- [2.1 GEE内置API](#2.1 GEE内置API)
-
- [2.1.1 比较函数](#2.1.1 比较函数)
- [2.1.2 掩膜操作](#2.1.2 掩膜操作)
- [2.1.3 布尔运算](#2.1.3 布尔运算)
- [2.1.4 数据范围调整](#2.1.4 数据范围调整)
- [2.2 其他API](#2.2 其他API)
-
- [2.2.1 设置研究区边界样式](#2.2.1 设置研究区边界样式)
- [2.2.2 获取示例NDVI图像](#2.2.2 获取示例NDVI图像)
- [2.2.2 打印最大最小值](#2.2.2 打印最大最小值)
- [2.2.3 绘制像素分布直方图](#2.2.3 绘制像素分布直方图)
- 三、示例代码链接
- 四、示例代码详解
-
- [4.1 获取示例NDVI图像](#4.1 获取示例NDVI图像)
- [4.2 将指定像素设置为空值](#4.2 将指定像素设置为空值)
-
- [4.2.1 将NDVI像素值小于0的像素设置为空值](#4.2.1 将NDVI像素值小于0的像素设置为空值)
- [4.2.1 将DEM小于150的NDVI图像的像素设置为空值](#4.2.1 将DEM小于150的NDVI图像的像素设置为空值)
- [4.2.3 将合并掩膜区域的NDVI图像的像素设置为空值](#4.2.3 将合并掩膜区域的NDVI图像的像素设置为空值)
- [4.3 将空值像素赋值为指定值](#4.3 将空值像素赋值为指定值)
- [4.4 将符合条件的像素设置为指定像素值](#4.4 将符合条件的像素设置为指定像素值)
-
- [4.4.1 将NDVI小于0的像素设置为0](#4.4.1 将NDVI小于0的像素设置为0)
- [4.4.2 将DEM小于150的NDVI图像的像素设置为0](#4.4.2 将DEM小于150的NDVI图像的像素设置为0)
- [4.4.3 将ndvi小于0且DEM小于150的NDVI图像的像素设置为0](#4.4.3 将ndvi小于0且DEM小于150的NDVI图像的像素设置为0)
- [4.5 NDVI图像像素值离散化(重分类)](#4.5 NDVI图像像素值离散化(重分类))
- [4.6 将图像中每个像素的值限制在一个给定的范围内](#4.6 将图像中每个像素的值限制在一个给定的范围内)
-
- [4.6.1 clamp()](#4.6.1 clamp())
- [4.6.2 unitScale()](#4.6.2 unitScale())
- [4.6.3 手动实现最大最小值归一化](#4.6.3 手动实现最大最小值归一化)
- [4.6.4 手动实现等比例映射](#4.6.4 手动实现等比例映射)
-
一、需求
下表列出了几个 ArcGIS 中常用到的栅格计算器公式,我们经常在 ArcGIS 中进行这些操作,但是这些常用到的操作在 GEE 中也可以实现。
需求 | 公式 |
---|---|
将空值赋予某一特定的数值(如100) | CON(ISNULL("raster"),100,"raster") |
将某个特定的栅格值(100)赋值为0 | Con("raster"==-100,0,"raster") |
将某一特定的栅格值(如100)赋值为空值 | setnull("raster"==100,"raster") |
将栅格数值在某一条件范围内(如大于100)赋值为0 | Con("raster" >100,0,"raster") |
使目标影像中的多个栅格数值赋予无效值 | SetNull(("raster == 100) |
栅格计算器中的平方和开方运算 | (1)Power(raster,2),Power(raster,0.5) |
(2)Squre(),SquareRoot() |
二、核心函数
2.1 GEE内置API
2.1.1 比较函数
函数名称 | 意义 | image1 (Image) | image2 (Image) | 返回值 |
---|---|---|---|---|
image1.eq(image2) | 判断对应像素值是否相等。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.neq(image2) | 判断对应像素值是否不相等。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.lt(image2) | 判断对应像素值是否左值小于右值。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.lte(image2) | 判断对应像素值是否左值小于等于右值。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.gt(image2) | 判断对应像素值是否左值大于右值。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.gte(image2) | 判断对应像素值是否左值大于等于右值。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
备注:左操作数和右操作数分别代表需要比较的两个图像。
2.1.2 掩膜操作
函数名称 | 意义 | 返回值 | 参数名 | 参数说明 |
---|---|---|---|---|
updateMask() | 更新图像的掩膜,保留现有掩膜不为零的位置。 | Image | image (Image) | 输入图像。 |
mask (Image) | 图像的新掩膜,范围在[0, 1]之间的浮点值(无效=0,有效=1)。如果此图像只有一个波段,则用于输入图像的所有波段;否则,必须与输入图像具有相同数量的波段。 |
函数名称 | 意义 | 返回值 | 参数名 | 参数说明 |
---|---|---|---|---|
unmask() | 在输入掩膜为零的所有位置,使用另一个图像的掩膜和值替换输入图像的掩膜和值。 | Image | input (Image) | 输入图像。 |
value (Image) | 输入图像的掩码像素的新值和掩膜。如果未指定,则默认为处处有效的常量零图像。 | |||
sameFootprint (Boolean) | 如果为true(或未指定),输出保留输入图像的足迹。如果为false,则输出的足迹是输入足迹与值图像的足迹的并集。 |
2.1.3 布尔运算
函数名称 | 意义 | image1 (Image) | image2 (Image) | 返回值 |
---|---|---|---|---|
image1.and(image2) | 如果对应的像素值在image1和image2的每个匹配的波段中都为非零,则返回1。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
image1.or(image2) | 如果对应的像素值在image1和image2的每个匹配的波段中至少有一个为非零,则返回1。 | 左操作数所取的图像 | 右操作数所取的图像 | Image |
2.1.4 数据范围调整
函数名称 | 意义 | 返回值 | 参数名 | 参数说明 |
---|---|---|---|---|
where(test, value) | 执行条件替换值。对于输入图像中的每个波段中的每个像素,如果 'test' 中的对应像素为非零,则输出 'value' 中的对应像素,否则输出输入像素。 | Image | input (Image) | 输入图像。 |
test (Image) | 测试图像。决定返回哪些输入像素。如果这是单波段,则用于输入图像的所有波段。这不能是数组图像。 | |||
value (Image) | 在测试不为零时使用的输出值。如果这是单波段,则用于输入图像的所有波段。 |
函数名称 | 意义 | 返回值 | 参数名 | 参数说明 |
---|---|---|---|---|
clamp(low, high) | 将图像中所有波段的值夹在指定范围内。 | Image | input (Image) | 要夹紧的图像。 |
low (Float) | 范围中允许的最小值。 | |||
high (Float) | 范围中允许的最大值。 |
函数名称 | 意义 | 返回值 | 参数名 | 参数说明 |
---|---|---|---|---|
unitScale(low, high) | 缩放输入,使输入值的范围 [low, high] 变为 [0, 1]。 | Image | input (Image) | 要缩放的图像。 |
low (Float) | 映射到 0 的值。 | |||
high (Float) | 映射到 1 的值。 |
2.2 其他API
2.2.1 设置研究区边界样式
javascript
var eevs = require('users/949384116/lib:ImageVisualization/VectorStyle');
var roi = geometry; // Geometry 格式研究区边界
var roiWithStyle = eevs.setDefaultGeometryStyle(geometry); // Geometry 的默认样式设置
// var roi = table; // FeatureCollection 格式研究区边界
// var roiWithStyle = eevs.setDefaultTableStyle(table); // FeatureCollection 的默认样式设置
2.2.2 获取示例NDVI图像
输入:研究区边界 roi,是否显示作者主页 boolAuthHomePageShow ,可填 true 或者 false(默认 false)。
输出:研究区内由2024年4月的 Landsat 中值合成影像生成的 NDVI 图像。
javascript
var boolAuthHomePageShow = true;
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
var ndvi = eesi.getExampleNDVIImageFromLandsat(roi, boolAuthHomePageShow);
2.2.2 打印最大最小值
输入:依次为单波段图像 ndvi,波段名,图像名称,研究区边界,分辨率,地理坐标系EPSG编号,bestEffort,tileScale。
输出:一个对象,有最大值和最小值。并可以在控制台打印最大值最小值。
javascript
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
eesi.minMaxValue(ndvi, 'NDVI', 'Original NDVI', roi, 30, "EPSG:4326", true, 5);
2.2.3 绘制像素分布直方图
输入:依次为单波段图像 ndvi,图像名称,研究区边界,分辨率。
输出:像素值分布直方图。并在控制台绘制像素值分布直方图。
javascript
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图像
javascript
var eesi = require('users/949384116/lib:RasterCalculator/SampleImage');
var ndvi = eesi.getExampleNDVIImageFromLandsat(roi, true);
4.2 将指定像素设置为空值
4.2.1 将NDVI像素值小于0的像素设置为空值
javascript
// 将小于0的像素设置为空值(保留大于0的像素)
var mask_NDVI_gte0 = ndvi.gte(0);
var ndvi_nullifyUnderThreshold = ndvi.updateMask(mask_NDVI_gte0);
4.2.1 将DEM小于150的NDVI图像的像素设置为空值
javascript
// 将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图像的像素设置为空值
javascript
// 将NDVI小于0且DEM小于150的像素值设置为空值
var composite_mask = mask_DEM_gt150.and(mask_NDVI_gte0);
var ndvi_nullifyUnderCompositeMask = ndvi.updateMask(composite_mask);
4.3 将空值像素赋值为指定值
javascript
// 将空值像素赋值为指定值,比如0
var ndvi_replaceNullWithZero = ndvi_nullifyUnderCompositeMask.unmask(0);
4.4 将符合条件的像素设置为指定像素值
4.4.1 将NDVI小于0的像素设置为0
javascript
// 将符合条件的像素设置为指定像素值
// 将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
javascript
// 将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
javascript
// 将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图像像素值离散化(重分类)
javascript
// NDVI图像像素值离散化(重分类)
// 比如,NDVI小于0的像素赋值为1,[0, 0.3]的赋值为2,大于0.3的赋值为2
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()
javascript
// clamp(low, high)将所有像素值变为 [low, high]
// 低于 low 的像素值变为 low,高于 high 的像素值变为 high
// 比如,ndvi像素值大于1,就给它赋值1,小于0的,都给它赋值0
var ndvi_LimitValuesWithinRange = ndvi.clamp(0, 1);
4.6.2 unitScale()
javascript
// unitScale(low, high):将输入的像素值范围 [low, high] 缩放到 [0, 1] 的范围内
var ndvi_rescaleToUnitInterval = ndvi.unitScale(-1, 1);
4.6.3 手动实现最大最小值归一化
javascript
// 手动实现最大最小值归一化
var Min = -0.9970119595527649;// MIn,Max分别是最小值和最大值,需要提前计算好填进来
var Max = 0.9034250974655151;
var image_d = ndvi.subtract(Min);
var ndvi_normalizeMinMax = image_d.divide(Max - Min)
4.6.4 手动实现等比例映射
javascript
// 手动实现等比例映射
// 将数据的值域等比例变换到指定值域
// 比如,将 [min, max] 的值域映射到 [0, 255]
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 };