Lặp lại trên ImageCollection
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Mặc dù map()
áp dụng một hàm cho mọi hình ảnh trong một bộ sưu tập, nhưng hàm này sẽ truy cập vào mọi hình ảnh trong bộ sưu tập một cách độc lập. Ví dụ: giả sử bạn muốn tính toán một giá trị bất thường tích luỹ (At) tại thời điểm t từ một chuỗi thời gian. Để lấy một chuỗi được xác định đệ quy ở dạng At =
f(Hình ảnht, At-1), việc ánh xạ sẽ không hoạt động vì hàm
(f) phụ thuộc vào kết quả trước đó (At-1). Ví dụ: giả sử bạn muốn tính toán một loạt hình ảnh bất thường về Chỉ số thực vật khác biệt chuẩn hoá (NDVI) tích luỹ so với đường cơ sở. Đặt A0 = 0 và
f(Imaget, At-1) = Imaget + At-1
trong đó At-1 là giá trị bất thường tích luỹ cho đến thời điểm t-1 và
Imaget là giá trị bất thường tại thời điểm t. Sử dụng imageCollection.iterate()
để tạo ImageCollection
được xác định đệ quy này. Trong ví dụ sau, hàm accumulate()
nhận hai tham số: một hình ảnh trong bộ sưu tập và danh sách tất cả các kết quả trước đó. Với mỗi lệnh gọi đến iterate()
, giá trị bất thường sẽ được thêm vào tổng đang chạy và kết quả sẽ được thêm vào danh sách. Kết quả cuối cùng được chuyển đến hàm khởi tạo ImageCollection
để lấy một trình tự hình ảnh mới:
Trình soạn thảo mã (JavaScript)
// Load MODIS EVI imagery.
var collection = ee.ImageCollection('MODIS/006/MYD13A1').select('EVI');
// Define reference conditions from the first 10 years of data.
var reference = collection.filterDate('2001-01-01', '2010-12-31')
// Sort chronologically in descending order.
.sort('system:time_start', false);
// Compute the mean of the first 10 years.
var mean = reference.mean();
// Compute anomalies by subtracting the 2001-2010 mean from each image in a
// collection of 2011-2014 images. Copy the date metadata over to the
// computed anomaly images in the new collection.
var series = collection.filterDate('2011-01-01', '2014-12-31').map(function(image) {
return image.subtract(mean).set('system:time_start', image.get('system:time_start'));
});
// Display cumulative anomalies.
Map.setCenter(-100.811, 40.2, 5);
Map.addLayer(series.sum(),
{min: -60000, max: 60000, palette: ['FF0000', '000000', '00FF00']}, 'EVI anomaly');
// Get the timestamp from the most recent image in the reference collection.
var time0 = reference.first().get('system:time_start');
// Use imageCollection.iterate() to make a collection of cumulative anomaly over time.
// The initial value for iterate() is a list of anomaly images already processed.
// The first anomaly image in the list is just 0, with the time0 timestamp.
var first = ee.List([
// Rename the first band 'EVI'.
ee.Image(0).set('system:time_start', time0).select([0], ['EVI'])
]);
// This is a function to pass to Iterate().
// As anomaly images are computed, add them to the list.
var accumulate = function(image, list) {
// Get the latest cumulative anomaly image from the end of the list with
// get(-1). Since the type of the list argument to the function is unknown,
// it needs to be cast to a List. Since the return type of get() is unknown,
// cast it to Image.
var previous = ee.Image(ee.List(list).get(-1));
// Add the current anomaly to make a new cumulative anomaly image.
var added = image.add(previous)
// Propagate metadata to the new image.
.set('system:time_start', image.get('system:time_start'));
// Return the list with the cumulative anomaly inserted.
return ee.List(list).add(added);
};
// Create an ImageCollection of cumulative anomaly images by iterating.
// Since the return type of iterate is unknown, it needs to be cast to a List.
var cumulative = ee.ImageCollection(ee.List(series.iterate(accumulate, first)));
// Predefine the chart titles.
var title = {
title: 'Cumulative EVI anomaly over time',
hAxis: {title: 'Time'},
vAxis: {title: 'Cumulative EVI anomaly'},
};
// Chart some interesting locations.
var pt1 = ee.Geometry.Point(-65.544, -4.894);
print('Amazon rainforest:',
ui.Chart.image.series(
cumulative, pt1, ee.Reducer.first(), 500).setOptions(title));
var pt2 = ee.Geometry.Point(116.4647, 40.1054);
print('Beijing urbanization:',
ui.Chart.image.series(
cumulative, pt2, ee.Reducer.first(), 500).setOptions(title));
var pt3 = ee.Geometry.Point(-110.3412, 34.1982);
print('Arizona forest disturbance and recovery:',
ui.Chart.image.series(
cumulative, pt3, ee.Reducer.first(), 500).setOptions(title));
Thiết lập Python
Hãy xem trang
Môi trường Python để biết thông tin về API Python và cách sử dụng geemap
để phát triển tương tác.
import ee
import geemap.core as geemap
Colab (Python)
import altair as alt
# Load MODIS EVI imagery.
collection = ee.ImageCollection('MODIS/006/MYD13A1').select('EVI')
# Define reference conditions from the first 10 years of data.
reference = collection.filterDate('2001-01-01', '2010-12-31').sort(
# Sort chronologically in descending order.
'system:time_start',
False,
)
# Compute the mean of the first 10 years.
mean = reference.mean()
# Compute anomalies by subtracting the 2001-2010 mean from each image in a
# collection of 2011-2014 images. Copy the date metadata over to the
# computed anomaly images in the new collection.
series = collection.filterDate('2011-01-01', '2014-12-31').map(
lambda image: image.subtract(mean).set(
'system:time_start', image.get('system:time_start')
)
)
# Display cumulative anomalies.
m = geemap.Map()
m.set_center(-100.811, 40.2, 5)
m.add_layer(
series.sum(),
{'min': -60000, 'max': 60000, 'palette': ['FF0000', '000000', '00FF00']},
'EVI anomaly',
)
display(m)
# Get the timestamp from the most recent image in the reference collection.
time_0 = reference.first().get('system:time_start')
# Use imageCollection.iterate() to make a collection of cumulative anomaly over time.
# The initial value for iterate() is a list of anomaly images already processed.
# The first anomaly image in the list is just 0, with the time_0 timestamp.
first = ee.List([
# Rename the first band 'EVI'.
ee.Image(0)
.set('system:time_start', time_0)
.select([0], ['EVI'])
])
# This is a function to pass to Iterate().
# As anomaly images are computed, add them to the list.
def accumulate(image, list):
# Get the latest cumulative anomaly image from the end of the list with
# get(-1). Since the type of the list argument to the function is unknown,
# it needs to be cast to a List. Since the return type of get() is unknown,
# cast it to Image.
previous = ee.Image(ee.List(list).get(-1))
# Add the current anomaly to make a new cumulative anomaly image.
added = image.add(previous).set(
# Propagate metadata to the new image.
'system:time_start',
image.get('system:time_start'),
)
# Return the list with the cumulative anomaly inserted.
return ee.List(list).add(added)
# Create an ImageCollection of cumulative anomaly images by iterating.
# Since the return type of iterate is unknown, it needs to be cast to a List.
cumulative = ee.ImageCollection(ee.List(series.iterate(accumulate, first)))
# Predefine the chart titles.
title = 'Cumulative EVI anomaly over time'
# Chart some interesting locations.
def display_chart(region, collection):
reduced = (
collection.filterBounds(region)
.sort('system:time_start')
.map(
lambda image: ee.Feature(
None,
image.reduceRegion(ee.Reducer.first(), region, 500).set(
'time', image.get('system:time_start')
),
)
)
)
reduced_dataframe = ee.data.computeFeatures(
{'expression': reduced, 'fileFormat': 'PANDAS_DATAFRAME'}
)
alt.Chart(reduced_dataframe).mark_line().encode(
alt.X('time:T').title('Time'),
alt.Y('EVI:Q').title('Cumulative EVI anomaly'),
).properties(title=title).display()
pt_1 = ee.Geometry.Point(-65.544, -4.894)
display('Amazon rainforest:')
display_chart(pt_1, cumulative)
pt_2 = ee.Geometry.Point(116.4647, 40.1054)
display('Beijing urbanization:')
display_chart(pt_2, cumulative)
pt_3 = ee.Geometry.Point(-110.3412, 34.1982)
display('Arizona forest disturbance and recovery:')
display_chart(pt_3, cumulative)
Việc lập biểu đồ các trình tự này cho biết liệu NDVI có đang ổn định so với các sự cố trước đó hay không hoặc liệu NDVI có đang chuyển sang trạng thái mới hay không. Tìm hiểu thêm về biểu đồ trong Earth Engine trong mục Biểu đồ.
Hàm lặp lại bị giới hạn trong các phép toán mà hàm có thể thực hiện. Cụ thể, hàm này không thể
sửa đổi các biến bên ngoài hàm; không thể in bất kỳ nội dung nào; không thể sử dụng câu lệnh "if"
hoặc "for" của JavaScript. Mọi kết quả mà bạn muốn thu thập hoặc thông tin trung gian mà bạn muốn chuyển sang vòng lặp tiếp theo phải nằm trong giá trị trả về của hàm. Bạn có thể sử dụng ee.Algorithms.If() để thực hiện các phép toán có điều kiện.
Trừ phi có lưu ý khác, nội dung của trang này được cấp phép theo Giấy phép ghi nhận tác giả 4.0 của Creative Commons và các mẫu mã lập trình được cấp phép theo Giấy phép Apache 2.0. Để biết thông tin chi tiết, vui lòng tham khảo Chính sách trang web của Google Developers. Java là nhãn hiệu đã đăng ký của Oracle và/hoặc các đơn vị liên kết với Oracle.
Cập nhật lần gần đây nhất: 2025-07-25 UTC.
[null,null,["Cập nhật lần gần đây nhất: 2025-07-25 UTC."],[[["\u003cp\u003e\u003ccode\u003eimageCollection.iterate()\u003c/code\u003e is used to perform calculations that depend on previous results within an ImageCollection, unlike \u003ccode\u003emap()\u003c/code\u003e which processes each image independently.\u003c/p\u003e\n"],["\u003cp\u003eThis example demonstrates using \u003ccode\u003eiterate()\u003c/code\u003e to calculate cumulative anomalies of the Normalized Difference Vegetation Index (NDVI) over time.\u003c/p\u003e\n"],["\u003cp\u003eThe function passed to \u003ccode\u003eiterate()\u003c/code\u003e accumulates anomalies, adding the current image's anomaly to the running sum from previous iterations.\u003c/p\u003e\n"],["\u003cp\u003eResulting cumulative anomaly ImageCollection can be charted to analyze NDVI trends and disturbances over time in different locations.\u003c/p\u003e\n"],["\u003cp\u003eThe iterated function has limitations: it can't modify external variables, print, or use JavaScript 'if'/'for' statements, requiring results and intermediate information to be within its return value.\u003c/p\u003e\n"]]],["`imageCollection.iterate()` computes cumulative anomalies, unlike `map()`, which processes images independently. It defines a series *A~t~* = *f(Image~t~, A~t-1~)*, using a function to add the current anomaly to the previous cumulative anomaly. An example shows calculating cumulative Normalized Difference Vegetation Index (NDVI) anomalies, where `accumulate()` adds the current anomaly to a running sum. The result is stored in a list and then converted to a new `ImageCollection`. The function used in iterate cannot modify variables outside itself or use `if` or `for` statements.\n"],null,["# Iterating over an ImageCollection\n\nAlthough `map()` applies a function to every image in a collection, the\nfunction visits every image in the collection independently. For example, suppose you\nwant to compute a cumulative anomaly (*A~t~* ) at time *t* from a time\nseries. To obtain a recursively defined series of the form *A~t~ =\nf(Image~t~, A~t-1~)* , mapping won't work because the function\n(*f* ) depends on the previous result (*A~t-1~* ). For example, suppose\nyou want to compute a series of cumulative Normalized Difference Vegetation Index (NDVI)\nanomaly images relative to a baseline. Let *A~0~* = 0 and\n*f(Image~t~, A~t-1~)* = *Image~t~ + A~t-1~*\nwhere *A~t-1~* is the cumulative anomaly up to time *t-1* and\n*Image~t~* is the anomaly at time *t* . Use\n`imageCollection.iterate()` to make this recursively defined\n`ImageCollection`. In the following example, the function\n`accumulate()` takes two parameters: an image in the collection, and a list\nof all the previous outputs. With each call to `iterate()`, the anomaly is\nadded to the running sum and the result is added to the list. The final result is\npassed to the `ImageCollection` constructor to get a new sequence of images:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load MODIS EVI imagery.\nvar collection = ee.ImageCollection('MODIS/006/MYD13A1').select('EVI');\n\n// Define reference conditions from the first 10 years of data.\nvar reference = collection.filterDate('2001-01-01', '2010-12-31')\n // Sort chronologically in descending order.\n .sort('system:time_start', false);\n\n// Compute the mean of the first 10 years.\nvar mean = reference.mean();\n\n// Compute anomalies by subtracting the 2001-2010 mean from each image in a\n// collection of 2011-2014 images. Copy the date metadata over to the\n// computed anomaly images in the new collection.\nvar series = collection.filterDate('2011-01-01', '2014-12-31').map(function(image) {\n return image.subtract(mean).set('system:time_start', image.get('system:time_start'));\n});\n\n// Display cumulative anomalies.\nMap.setCenter(-100.811, 40.2, 5);\nMap.addLayer(series.sum(),\n {min: -60000, max: 60000, palette: ['FF0000', '000000', '00FF00']}, 'EVI anomaly');\n\n// Get the timestamp from the most recent image in the reference collection.\nvar time0 = reference.first().get('system:time_start');\n\n// Use imageCollection.iterate() to make a collection of cumulative anomaly over time.\n// The initial value for iterate() is a list of anomaly images already processed.\n// The first anomaly image in the list is just 0, with the time0 timestamp.\nvar first = ee.List([\n // Rename the first band 'EVI'.\n ee.Image(0).set('system:time_start', time0).select([0], ['EVI'])\n]);\n\n// This is a function to pass to Iterate().\n// As anomaly images are computed, add them to the list.\nvar accumulate = function(image, list) {\n // Get the latest cumulative anomaly image from the end of the list with\n // get(-1). Since the type of the list argument to the function is unknown,\n // it needs to be cast to a List. Since the return type of get() is unknown,\n // cast it to Image.\n var previous = ee.Image(ee.List(list).get(-1));\n // Add the current anomaly to make a new cumulative anomaly image.\n var added = image.add(previous)\n // Propagate metadata to the new image.\n .set('system:time_start', image.get('system:time_start'));\n // Return the list with the cumulative anomaly inserted.\n return ee.List(list).add(added);\n};\n\n// Create an ImageCollection of cumulative anomaly images by iterating.\n// Since the return type of iterate is unknown, it needs to be cast to a List.\nvar cumulative = ee.ImageCollection(ee.List(series.iterate(accumulate, first)));\n\n// Predefine the chart titles.\nvar title = {\n title: 'Cumulative EVI anomaly over time',\n hAxis: {title: 'Time'},\n vAxis: {title: 'Cumulative EVI anomaly'},\n};\n\n// Chart some interesting locations.\nvar pt1 = ee.Geometry.Point(-65.544, -4.894);\nprint('Amazon rainforest:',\n ui.Chart.image.series(\n cumulative, pt1, ee.Reducer.first(), 500).setOptions(title));\n\nvar pt2 = ee.Geometry.Point(116.4647, 40.1054);\nprint('Beijing urbanization:',\n ui.Chart.image.series(\n cumulative, pt2, ee.Reducer.first(), 500).setOptions(title));\n\nvar pt3 = ee.Geometry.Point(-110.3412, 34.1982);\nprint('Arizona forest disturbance and recovery:',\n ui.Chart.image.series(\n cumulative, pt3, ee.Reducer.first(), 500).setOptions(title));\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\nimport altair as alt\n# Load MODIS EVI imagery.\ncollection = ee.ImageCollection('MODIS/006/MYD13A1').select('EVI')\n\n# Define reference conditions from the first 10 years of data.\nreference = collection.filterDate('2001-01-01', '2010-12-31').sort(\n # Sort chronologically in descending order.\n 'system:time_start',\n False,\n)\n\n# Compute the mean of the first 10 years.\nmean = reference.mean()\n\n# Compute anomalies by subtracting the 2001-2010 mean from each image in a\n# collection of 2011-2014 images. Copy the date metadata over to the\n# computed anomaly images in the new collection.\nseries = collection.filterDate('2011-01-01', '2014-12-31').map(\n lambda image: image.subtract(mean).set(\n 'system:time_start', image.get('system:time_start')\n )\n)\n\n# Display cumulative anomalies.\nm = geemap.Map()\nm.set_center(-100.811, 40.2, 5)\nm.add_layer(\n series.sum(),\n {'min': -60000, 'max': 60000, 'palette': ['FF0000', '000000', '00FF00']},\n 'EVI anomaly',\n)\ndisplay(m)\n\n# Get the timestamp from the most recent image in the reference collection.\ntime_0 = reference.first().get('system:time_start')\n\n# Use imageCollection.iterate() to make a collection of cumulative anomaly over time.\n# The initial value for iterate() is a list of anomaly images already processed.\n# The first anomaly image in the list is just 0, with the time_0 timestamp.\nfirst = ee.List([\n # Rename the first band 'EVI'.\n ee.Image(0)\n .set('system:time_start', time_0)\n .select([0], ['EVI'])\n])\n\n# This is a function to pass to Iterate().\n# As anomaly images are computed, add them to the list.\ndef accumulate(image, list):\n # Get the latest cumulative anomaly image from the end of the list with\n # get(-1). Since the type of the list argument to the function is unknown,\n # it needs to be cast to a List. Since the return type of get() is unknown,\n # cast it to Image.\n previous = ee.Image(ee.List(list).get(-1))\n # Add the current anomaly to make a new cumulative anomaly image.\n added = image.add(previous).set(\n # Propagate metadata to the new image.\n 'system:time_start',\n image.get('system:time_start'),\n )\n # Return the list with the cumulative anomaly inserted.\n return ee.List(list).add(added)\n\n# Create an ImageCollection of cumulative anomaly images by iterating.\n# Since the return type of iterate is unknown, it needs to be cast to a List.\ncumulative = ee.ImageCollection(ee.List(series.iterate(accumulate, first)))\n\n# Predefine the chart titles.\ntitle = 'Cumulative EVI anomaly over time'\n\n# Chart some interesting locations.\ndef display_chart(region, collection):\n reduced = (\n collection.filterBounds(region)\n .sort('system:time_start')\n .map(\n lambda image: ee.Feature(\n None,\n image.reduceRegion(ee.Reducer.first(), region, 500).set(\n 'time', image.get('system:time_start')\n ),\n )\n )\n )\n reduced_dataframe = ee.data.computeFeatures(\n {'expression': reduced, 'fileFormat': 'PANDAS_DATAFRAME'}\n )\n alt.Chart(reduced_dataframe).mark_line().encode(\n alt.X('time:T').title('Time'),\n alt.Y('EVI:Q').title('Cumulative EVI anomaly'),\n ).properties(title=title).display()\n\npt_1 = ee.Geometry.Point(-65.544, -4.894)\ndisplay('Amazon rainforest:')\ndisplay_chart(pt_1, cumulative)\n\npt_2 = ee.Geometry.Point(116.4647, 40.1054)\ndisplay('Beijing urbanization:')\ndisplay_chart(pt_2, cumulative)\n\npt_3 = ee.Geometry.Point(-110.3412, 34.1982)\ndisplay('Arizona forest disturbance and recovery:')\ndisplay_chart(pt_3, cumulative)\n```\n\nCharting these sequences indicates whether NDVI is stabilizing relative to previous\ndisturbances or whether NDVI is trending to a new state. Learn more about charts in\nEarth Engine from the [Charts section](/earth-engine/guides/charts).\n\nThe iterated function is limited in the operations it can perform. Specifically, it can't\nmodify variables outside the function; it can't print anything; it can't use JavaScript 'if'\nor 'for' statements. Any results you wish to collect or intermediate information you wish to\ncarry over to the next iteration must be in the function's return value. You can use\n\\`ee.Algorithms.If()\\` to perform conditional operations."]]