GEE:栅格计算

作者: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 };
相关推荐
ZJ_.17 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特1 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
KubeSphere 云原生1 小时前
云原生周刊:利用 eBPF 增强 K8s
云计算·k8s·容器平台·kubesphere
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
一个处女座的程序猿O(∩_∩)O4 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
燃先生._.10 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖11 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
black^sugar12 小时前
纯前端实现更新检测
开发语言·前端·javascript