แม้ว่า 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));
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() เพื่อดำเนินการแบบมีเงื่อนไขได้