数学运算

您可以使用 add()subtract() 等运算符执行图像数学运算,但对于包含多个项的复杂计算,expression() 函数是一个不错的替代方案。如需详细了解运算符表达式,请参阅以下部分。

运算符

数学运算符可对图像波段执行基本算术运算。它们接受两个输入:两张图片或一张图片和一个常数项,该常数项被解释为没有经过掩码的单波段常量图片。系统会针对每个波段的每个像素执行操作。

作为一个基本示例,请考虑使用 VIIRS 图像计算归一化差异植被指数 (NDVI) 的任务,其中使用了 add()subtract()divide() 运算符:

Code Editor (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

Python 设置

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

系统只会考虑两个输入之间未遮罩像素的交集,并将其返回为未遮罩,所有其他像素均会被遮罩。通常,如果任一输入只有一个频段,则该频段将用于对另一输入中的所有频段进行处理。如果输入具有相同的波段数,但名称不同,则会按自然顺序成对使用。输出频段的命名方式取决于两个输入中较长的输入,如果两个输入的长度相同,则按第一个输入的顺序命名。输出像素的类型是输入类型的并集。

以下多波段图像减法示例演示了如何自动匹配波段,从而为每个共存波段的每个像素生成“变化矢量”。

Code Editor (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

Python 设置

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

在此示例的第二部分中,差值的平方使用 image.pow(2) 计算得出。如需查看用于处理基本算术、三角函数、指数运算、舍入、类型转换、按位运算等的数学运算符的完整列表,请参阅 API 文档

表达式

如需实现更复杂的数学表达式,不妨考虑使用 image.expression(),它会解析数学运算的文本表示法。 以下示例使用 expression() 计算增强型植被指数 (EVI):

Code Editor (JavaScript)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

Python 设置

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

请注意,expression() 的第一个实参是数学运算的文本表示法,第二个实参是字典,其中键是表达式中使用的变量名称,值是应将变量映射到的图像波段。您可以将图片中的波段称为 b("band name")b(index)(例如 b(0)),而不是提供字典。使用波段映射字典时,可以从输入以外的图片中定义波段。请注意,expression() 使用“向下取整除法”,该方法会在两个整数相除时舍弃余数并返回整数。例如 10 / 20 = 0。如需更改此行为,请将其中一个操作数乘以 1.010 * 1.0 / 20 = 0.5。在评估来自多个源图像的波段时,系统只会考虑未遮盖像素的交集,并将其返回为未遮盖。下表列出了支持的表达式运算符。

expression() 的运算符
类型 符号 名称
算术 + - * / % ** 加减乘除、模运算、指数
关系 == != < > <= >= 等于、不等于、小于、大于等。
逻辑 && || ! ^ And、Or、Not、Xor
三元组 ? : if then else