การทำซ้ำใน ImageCollection

แม้ว่า map() จะใช้ฟังก์ชันกับรูปภาพทุกรูปในคอลเล็กชัน แต่ฟังก์ชันดังกล่าวจะเรียกใช้รูปภาพทุกรูปในคอลเล็กชันแยกกัน ตัวอย่างเช่น สมมติว่าคุณต้องการคํานวณความผิดปกติสะสม (At) ณ เวลา t จากอนุกรมเวลา หากต้องการรับชุดค่ายําที่กําหนดแบบซ้ำซ้อนของรูปแบบ At = f(Imaget, At-1) การแมปจะไม่ทํางานเนื่องจากฟังก์ชัน (f) ขึ้นอยู่กับผลลัพธ์ก่อนหน้า (At-1) ตัวอย่างเช่น สมมติว่าคุณต้องการคํานวณชุดรูปภาพความผิดปกติของดัชนีความแตกต่างของพืช (NDVI) ที่ปรับให้เป็นมาตรฐานแบบสะสม (Cumulative Normalized Difference Vegetation Index) เทียบกับภาพฐาน สมมติให้ A0 = 0 และ f(Imaget, At-1) = Imaget + At-1 โดยที่ At-1 คือความผิดปกติสะสมจนถึงเวลา t-1 และ Imaget คือความผิดปกติ ณ เวลา t ใช้ imageCollection.iterate() เพื่อทำให้นิยามนี้ทำงานแบบซ้ำ ImageCollection ในตัวอย่างต่อไปนี้ ฟังก์ชัน accumulate() จะใช้พารามิเตอร์ 2 รายการ ได้แก่ รูปภาพในคอลเล็กชันและรายการเอาต์พุตก่อนหน้าทั้งหมด เมื่อเรียกใช้ iterate() แต่ละครั้ง ระบบจะเพิ่มความผิดปกติลงในผลรวมที่สะสมอยู่และเพิ่มผลลัพธ์ลงในรายการ ผลลัพธ์สุดท้ายจะส่งผ่านไปยังตัวสร้าง ImageCollection เพื่อรับลำดับรูปภาพใหม่

เครื่องมือแก้ไขโค้ด (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));

การตั้งค่า Python

ดูข้อมูลเกี่ยวกับ Python API และการใช้ geemap สําหรับการพัฒนาแบบอินเทอร์แอกทีฟได้ที่หน้า สภาพแวดล้อม Python

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)

แผนภูมิของลำดับเหล่านี้จะระบุว่า NDVI มีแนวโน้มที่จะคงที่เมื่อเทียบกับความผันผวนก่อนหน้า หรือ NDVI มีแนวโน้มที่จะเข้าสู่สถานะใหม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับแผนภูมิใน Earth Engine ได้จากส่วนแผนภูมิ

ฟังก์ชันที่วนซ้ำจะจำกัดการดำเนินการที่ทำได้ กล่าวโดยละเอียดคือ ไม่สามารถแก้ไขตัวแปรที่อยู่นอกฟังก์ชัน ไม่สามารถพิมพ์ข้อมูลใดๆ และใช้คำสั่ง "if" หรือ "for" ของ JavaScript ไม่ได้ ผลลัพธ์ที่คุณต้องการรวบรวมหรือข้อมูลกลางที่ต้องการนําไปใช้กับการวนซ้ำครั้งถัดไปต้องอยู่ในค่าส่งกลับของฟังก์ชัน คุณสามารถใช้ ee.Algorithms.If() เพื่อดำเนินการแบบมีเงื่อนไขได้