公告:所有在
2025 年 4 月 15 日之前注册使用 Earth Engine 的非商业项目都必须
验证是否符合非商业性质的资格条件,才能继续使用 Earth Engine。
数学运算
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
您可以使用 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.0
:10 * 1.0 / 20 = 0.5
。在评估来自多个源图像的波段时,系统只会考虑未遮盖像素的交集,并将其返回为未遮盖。下表列出了支持的表达式运算符。
expression()
的运算符
类型 |
符号 |
名称 |
算术 |
+ - * / % ** |
加减乘除、模运算、指数 |
关系 |
== != < > <= >= |
等于、不等于、小于、大于等。 |
逻辑 |
&& || ! ^ |
And、Or、Not、Xor |
三元组 |
? : |
if then else |
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-25。
[null,null,["最后更新时间 (UTC):2025-07-25。"],[[["\u003cp\u003eEarth Engine provides tools for performing image math, including operators for basic arithmetic and the \u003ccode\u003eexpression()\u003c/code\u003e function for complex computations.\u003c/p\u003e\n"],["\u003cp\u003eOperators like \u003ccode\u003eadd()\u003c/code\u003e, \u003ccode\u003esubtract()\u003c/code\u003e, and \u003ccode\u003edivide()\u003c/code\u003e enable pixel-wise calculations between images or an image and a constant.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eexpression()\u003c/code\u003e function allows implementing custom formulas by parsing text representations of mathematical operations and mapping variables to image bands.\u003c/p\u003e\n"],["\u003cp\u003eWhen using \u003ccode\u003eexpression()\u003c/code\u003e, ensure to handle integer division appropriately by multiplying one operand by \u003ccode\u003e1.0\u003c/code\u003e to preserve decimal values if needed.\u003c/p\u003e\n"],["\u003cp\u003eBoth operators and expressions automatically handle band matching and masking, considering only unmasked pixels in the calculations.\u003c/p\u003e\n"]]],[],null,["# Mathematical Operations\n\n|---------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|\n| [Run in Google Colab](https://colab.research.google.com/github/google/earthengine-community/blob/master/guides/linked/generated/image_math.ipynb) | [View source on GitHub](https://github.com/google/earthengine-community/blob/master/guides/linked/generated/image_math.ipynb) |\n\nImage math can be performed using operators like `add()` and\n`subtract()`, but for complex computations with more than a couple of terms, the\n`expression()` function provides a good alternative. See the following sections\nfor more information on [operators](#operators) and\n[expressions](#expressions).\n\nOperators\n---------\n\nMath operators perform basic arithmetic operations on image bands. They take two inputs:\neither two images or one image and a constant term, which\nis interpreted as a single-band constant image with no masked pixels. Operations are performed\nper pixel for each band.\n\nAs a basic example, consider the task of calculating the Normalized Difference Vegetation\nIndex (NDVI) using VIIRS imagery, where `add()`, `subtract()`,\nand `divide()` operators are used:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load a VIIRS 8-day surface reflectance composite for May 2024.\nvar viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(\n ee.Filter.date('2024-05-01', '2024-05-16')).first();\n\n// Compute NDVI.\nvar ndvi202405 = viirs202405.select('SurfReflect_I2')\n .subtract(viirs202405.select('SurfReflect_I1'))\n .divide(viirs202405.select('SurfReflect_I2')\n .add(viirs202405.select('SurfReflect_I1')));\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Load a VIIRS 8-day surface reflectance composite for May 2024.\nviirs202405 = (\n ee.ImageCollection('NASA/VIIRS/002/VNP09H1')\n .filter(ee.Filter.date('2024-05-01', '2024-05-16'))\n .first()\n)\n\n# Compute NDVI.\nndvi202405 = (\n viirs202405.select('SurfReflect_I2')\n .subtract(viirs202405.select('SurfReflect_I1'))\n .divide(\n viirs202405.select('SurfReflect_I2').add(\n viirs202405.select('SurfReflect_I1')\n )\n )\n)\n```\n| **Note:** the normalized difference operation is available as a shortcut method: [`normalizedDifference()`](/earth-engine/apidocs/ee-image-normalizeddifference).\n\nOnly the intersection of unmasked pixels between the two inputs are\nconsidered and returned as unmasked, all else are masked. In general, if either input has only\none band, then it is used against all the bands in the other input. If the inputs have the same\nnumber of bands, but not the same names, they're used pairwise in the natural order. The\noutput bands are named for the longer of the two inputs, or if they're equal in length, in the\nfirst input's order. The type of the output pixels is the union of the input types.\n\nThe following example of multi-band image subtraction demonstrates how bands are matched\nautomatically, resulting in a \"change vector\" for each pixel for each co-occurring band.\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load a VIIRS 8-day surface reflectance composite for September 2024.\nvar viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(\n ee.Filter.date('2024-09-01', '2024-09-16')).first();\n\n// Compute multi-band difference between the September composite and the\n// previously loaded May composite.\nvar diff = viirs202409.subtract(ndvi202405);\nMap.addLayer(diff, {\n bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],\n min: -1,\n max: 1\n}, 'difference');\n\n// Compute the squared difference in each band.\nvar squaredDifference = diff.pow(2);\nMap.addLayer(squaredDifference, {\n bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],\n min: 0,\n max: 0.7\n}, 'squared diff.');\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Load a VIIRS 8-day surface reflectance composite for September 2024.\nviirs202409 = (\n ee.ImageCollection('NASA/VIIRS/002/VNP09H1')\n .filter(ee.Filter.date('2024-09-01', '2024-09-16'))\n .first()\n)\n\n# Compute multi-band difference between the September composite and the\n# previously loaded May composite.\ndiff = viirs202409.subtract(ndvi202405)\n\nm = geemap.Map()\nm.add_layer(\n diff,\n {\n 'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],\n 'min': -1,\n 'max': 1,\n },\n 'difference',\n)\n\n# Compute the squared difference in each band.\nsquared_difference = diff.pow(2)\n\nm.add_layer(\n squared_difference,\n {\n 'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],\n 'min': 0,\n 'max': 0.7,\n },\n 'squared diff.',\n)\ndisplay(m)\n```\n\nIn the second part of this example, the squared difference is computed using\n`image.pow(2)`. For the complete list of mathematical operators handling\nbasic arithmetic, trigonometry, exponentiation, rounding, casting, bitwise operations\nand more, see the [API documentation](/earth-engine/apidocs).\n\nExpressions\n-----------\n\nTo implement more complex mathematical expressions, consider using\n`image.expression()`, which parses a text representation of a math operation.\nThe following example uses `expression()` to compute the Enhanced\nVegetation Index (EVI):\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load a Landsat 8 image.\nvar image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');\n\n// Compute the EVI using an expression.\nvar evi = image.expression(\n '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {\n 'NIR': image.select('B5'),\n 'RED': image.select('B4'),\n 'BLUE': image.select('B2')\n});\n\nMap.centerObject(image, 9);\nMap.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Load a Landsat 8 image.\nimage = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')\n\n# Compute the EVI using an expression.\nevi = image.expression(\n '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',\n {\n 'NIR': image.select('B5'),\n 'RED': image.select('B4'),\n 'BLUE': image.select('B2'),\n },\n)\n\n# Define a map centered on San Francisco Bay.\nmap_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)\n\n# Add the image layer to the map and display it.\nmap_evi.add_layer(\n evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'\n)\ndisplay(map_evi)\n```\n\nObserve that the first argument to `expression()` is the textual representation of\nthe math operation, the second argument is a dictionary where the keys are variable names used\nin the expression and the values are the image bands to which the variables should be\nmapped. Bands in the image may be referred to as `b(\"band name\")` or\n`b(index)`, for example `b(0)`, instead\nof providing the dictionary. Bands can be defined from images other than the input when using\nthe band map dictionary. Note that `expression()` uses \"floor division\", which\ndiscards the remainder and returns an integer when two integers are divided. For example\n`10 / 20 = 0`. To change this behavior, multiply one of the operands by\n`1.0`: `10 * 1.0 / 20 = 0.5`. Only the intersection of unmasked pixels\nare considered and returned as unmasked when bands from more than one source image are\nevaluated. Supported expression operators are listed in the following table.\n\n| Type | Symbol | Name |\n|----------------|---------------------|----------------------------------------------------|\n| **Arithmetic** | + - \\* / % \\*\\* | Add, Subtract, Multiply, Divide, Modulus, Exponent |\n| **Relational** | == != \\\u003c \\\u003e \\\u003c= \\\u003e= | Equal, Not Equal, Less Than, Greater than, etc. |\n| **Logical** | \\&\\& \\|\\| ! \\^ | And, Or, Not, Xor |\n| **Ternary** | ? : | If then else |\n[Operators for `expression()`]"]]