GEE:栅格计算

本文详述了如何在Google Earth Engine (GEE)上进行栅格计算,包括使用GEE内置API进行比较、掩膜、布尔运算和数据范围调整,以及通过示例代码解析如何获取NDVI图像、设置空值、离散化和像素值限制。

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

作者:CSDN @ _养乐多_

本文将介绍在 Google Earth Engine (GEE)平台上进行栅格计算的代码。

结果如下图所示,



一、需求

下表列出了几个 ArcGIS 中常用到的栅格计算器公式,我们经常在 ArcGIS 中进行这些操作,但是这些常用到的操作在 GEE 中也可以实现。

需求公式
将空值赋予某一特定的数值(如100)CON(ISNULL(“raster”),100,“raster”)
将某个特定的栅格值(100)赋值为0Con(“raster”==-100,0,“raster”)
将某一特定的栅格值(如100)赋值为空值setnull(“raster”==100,“raster”)
将栅格数值在某一条件范围内(如大于100)赋值为0Con(“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()更新图像的掩膜,保留现有掩膜不为零的位置。Imageimage (Image)输入图像。
mask (Image)图像的新掩膜,范围在[0, 1]之间的浮点值(无效=0,有效=1)。如果此图像只有一个波段,则用于输入图像的所有波段;否则,必须与输入图像具有相同数量的波段。
函数名称意义返回值参数名参数说明
unmask()在输入掩膜为零的所有位置,使用另一个图像的掩膜和值替换输入图像的掩膜和值。Imageinput (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’ 中的对应像素,否则输出输入像素。Imageinput (Image)输入图像。
test (Image)测试图像。决定返回哪些输入像素。如果这是单波段,则用于输入图像的所有波段。这不能是数组图像。
value (Image)在测试不为零时使用的输出值。如果这是单波段,则用于输入图像的所有波段。
函数名称意义返回值参数名参数说明
clamp(low, high)将图像中所有波段的值夹在指定范围内。Imageinput (Image)要夹紧的图像。
low (Float)范围中允许的最小值。
high (Float)范围中允许的最大值。
函数名称意义返回值参数名参数说明
unitScale(low, high)缩放输入,使输入值的范围 [low, high] 变为 [0, 1]。Imageinput (Image)要缩放的图像。
low (Float)映射到 0 的值。
high (Float)映射到 1 的值。
2.2 其他API
2.2.1 设置研究区边界样式
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 图像。

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的像素设置为空值
// 将小于0的像素设置为空值(保留大于0的像素)
var mask_NDVI_gte0 = ndvi.gte(0);
var ndvi_nullifyUnderThreshold = ndvi.updateMask(mask_NDVI_gte0);
4.2.1 将DEM小于150的NDVI图像的像素设置为空值
// 将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图像的像素设置为空值
// 将NDVI小于0且DEM小于150的像素值设置为空值
var composite_mask = mask_DEM_gt150.and(mask_NDVI_gte0);
var ndvi_nullifyUnderCompositeMask = ndvi.updateMask(composite_mask);
4.3 将空值像素赋值为指定值
// 将空值像素赋值为指定值,比如0
var ndvi_replaceNullWithZero = ndvi_nullifyUnderCompositeMask.unmask(0);
4.4 将符合条件的像素设置为指定像素值
4.4.1 将NDVI小于0的像素设置为0
// 将符合条件的像素设置为指定像素值
// 将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
// 将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
// 将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图像像素值离散化(重分类)
// 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()
// 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()
// unitScale(low, high):将输入的像素值范围 [low, high] 缩放到 [0, 1] 的范围内
var ndvi_rescaleToUnitInterval = ndvi.unitScale(-1, 1);
4.6.3 手动实现最大最小值归一化
// 手动实现最大最小值归一化
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 手动实现等比例映射
// 手动实现等比例映射
// 将数据的值域等比例变换到指定值域
// 比如,将 [min, max] 的值域映射到 [0, 255]
var a = 255 - 0;
var b = Max - (Min)
var scale = a / b;
var ndvi_manualRatioScale = ndvi.subtract(Min).multiply(scale);
### 使用 Google Earth Engine 下载 GEDI L2A 树冠顶部高度数据集 为了获取并处理 GEDI L2A 树冠顶部高度数据集,可以利用 Google Earth Engine (GEE) 平台的强大功能来实现自动化下载。下面提供了一个 Python 脚本示例,展示了如何通过编程方式访问这些数据。 #### 安装依赖库 首先需要安装 `earthengine-api` 库以便于与 GEE 进行交互: ```bash pip install earthengine-api ``` #### 初始化地球引擎环境 确保已经完成账户认证,并初始化 API 访问权限: ```python import ee ee.Initialize() ``` #### 加载指定的数据集合 选择特定的时间范围和地区边界条件加载所需数据层: ```python dataset = ee.ImageCollection('LARSE/GEDI/GEDI02_A_002_MONTHLY') \ .filterDate('2021-01-01', '2021-12-31') ``` 此代码片段选择了 2021 年全年内的所有可用图像[^1]。 #### 设置研究区域 定义感兴趣区(AOI),这里假设使用一个简单的多边形表示法: ```python aoi = ee.Geometry.Polygon( [[[79.8, 26.5], [79.8, 26.4], [79.9, 26.4], [79.9, 26.5]]]) ``` 可以根据实际需求调整坐标值以匹配具体的研究地点。 #### 提取目标变量 从所选的 Image Collection 中提取所需的树冠顶部高度属性: ```python canopy_height = dataset.select('rh98').mean().clip(aoi) ``` 此处选取了 rh98 字段作为代表性的树冠高度测量值。 #### 导出结果至本地文件系统 最后一步是将处理后的栅格数据导出到用户的计算机上保存为 GeoTIFF 文件格式: ```python task = ee.batch.Export.image.toDrive({ 'image': canopy_height, 'description': 'CanopyHeightExport', 'folder': 'GEDI_Data', 'scale': 25, 'region': aoi.bounds().getInfo()['coordinates'] }) task.start() print("Download task has been started.") ``` 上述脚本会启动一项后台作业,在完成后自动上传生成的结果到用户预先设定好的谷歌云端硬盘目录下。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_养乐多_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值