|
发表于 2023-2-13 22:00:48
|
显示全部楼层
实现阈值使用数字(阈值)和逻辑运算符来帮助我们将图像的可变性划分为类别。例如,回想一下我们的 NDVI 地图。大量植被的 NDVI 值接近 1,非植被区域接近 0。如果我们想查看地图的哪些区域有植被,我们可以使用阈值将每个像素中的 NDVI 值概括为“无植被” ”或“植被”。可以肯定的是,这是一个实质性的简化,但可以帮助我们更好地理解地球表面的丰富变化。这种类型的分类可能很有用,例如,如果我们想查看一个城市的植被比例。让我们在美国华盛顿州西雅图附近创建 NDVI 的 Sentinel-2 地图。gt 方法来自布尔运算符系列——也就是说,gt 是一个函数,它在每个像素中执行测试,如果测试结果为 true,则返回值 1,否则返回 0。在这里,对于图像中的每个像素,它测试 NDVI 值是否大于 0.5。当满足这个条件时,图层 seaVeg 得到值 1。当条件为假时,它接收到值 0。
使用 Inspector 工具探索这个新层。如果单击绿色位置,则 NDVI 应大于 0.5。如果单击白色像素,则 NDVI 值应等于或小于 0.5。
该布尔系列中的其他运算符包括小于 (lt)、小于等于 (lte)、等于 (eq)、不等于 (neq)、大于等于 (gte) 等等。
使用 .where 构建复杂的分类
对 NDVI 进行分类的二进制地图非常有用。但是,在某些情况下,您可能希望将图像拆分为两个以上的 bin。 Earth Engine 提供了一种工具,即 where 方法,它根据测试结果在每个像素内有条件地评估为真或假。这类似于在其他语言中常见的 if 语句。但是,为了在为 Earth Engine 编程时执行此逻辑,我们避免使用 JavaScript if 语句。重要的是,如果命令不是在 Google 的服务器上计算的,JavaScript 会在运行您的代码时产生严重的问题——实际上,服务器会尝试将所有要执行的信息发送到您自己计算机的浏览器上,而对于如此庞大的浏览器来说,它的设备非常不足任务。相反,我们将 where 子句用于条件逻辑。
假设我们不只是将 NDVI 中的森林区域与非森林区域分开,而是希望将图像拆分为可能的水域、非森林区域和森林区域。我们可以使用 -0.1 和 0.5 的位置和阈值。我们将从使用 ee.Image 创建图像开始。然后我们剪辑新图像,使其覆盖与我们的 seaNDVI 层相同的区域。
where(测试,值)
执行值的条件替换。
对于'input'的每个band中的每个像素,如果'test'中的对应像素不为零,则输出value中对应的像素,否则输出输入像素。
如果在给定像素处,测试或值被屏蔽,则使用输入值。如果输入被屏蔽,则什么也不做。
输出波段与输入波段具有相同的名称。每个波段的输出类型是输入和值类型中较大的一个。输出图像保留输入图像的元数据和足迹。
论据:
这:输入(图像):
输入图像。
测试(图片):
测试图像。此图像的像素确定返回哪个输入像素。如果这是单个波段,则将其用于输入图像中的所有波段。这可能不是数组图像。
价值(图片):
在 test 不为零时使用的输出值。如果这是单个波段,则将其用于输入图像中的所有波段。
返回:图片
代码:
// 用Sentinel 2影像构建NDVI影像. var seaPoint = ee.Geometry.Point(-122.2040, 47.6221); var seaImage = ee.ImageCollection('COPERNICUS/S2') .filterBounds(seaPoint) .filterDate('2020-08-15', '2020-10-01') .first(); var seaNDVI = seaImage.normalizedDifference(['B8', 'B4']); // 加载到地图上 Map.centerObject(seaPoint, 10); var vegPalette = ['red', 'white', 'green']; Map.addLayer(seaNDVI, { min: -1, max: 1, palette: vegPalette }, 'NDVI Seattle'); //利用条件来划分影像阈值 // 创建所有值 = 1 的起始图像。 var seaWhere = ee.Image(1) // 使用剪辑来限制新图像的大小。 .clip(seaNDVI.geometry()); // 使所有小于 -0.1 的 NDVI 值等于 0。 seaWhere = seaWhere.where(seaNDVI.lte(-0.1), 0); // 使所有大于 0.5 的 NDVI 值等于 2。 seaWhere = seaWhere.where(seaNDVI.gte(0.5), 2); // 映射我们已分为三类的图层。 Map.addLayer(seaWhere, { min: 0, max: 2, palette: ['blue', 'white', 'green'] }, 'Water, Non-forest, Forest');
结果:
我们设定3个值,分别对应水体,植被和其它部分,结果如下图所示:
结果为0和1区分植被和水体的分析
往期推荐:
GEE云平台——Landsat 7 影像数据集合详解
会议通知|第六届全国地球空间大数据与云计算前沿会议与集中学习
GEE——Landsat 8 数据集影像集合具体介绍
GEE数据集——瑞士0.1米超清分辨率影像数据
GEE在线计算23类指数APP:VEGETATION INDICES CALCULATOR |
|