map()
는 컬렉션의 모든 이미지에 함수를 적용하지만 함수는 컬렉션의 모든 이미지를 독립적으로 방문합니다. 예를 들어 시계열에서 t 시점의 누적 이상치 (At)를 계산하려고 한다고 가정해 보겠습니다. At =
f(Imaget, At-1) 형식의 재귀적으로 정의된 계열을 얻으려면 매핑이 작동하지 않습니다. 함수(f)가 이전 결과 (At-1)에 종속되기 때문입니다. 예를 들어 기준점에 대해 일련의 누적 정규 식생 지수 (NDVI) 이상치 이미지를 계산하려고 한다고 가정해 보겠습니다. A0 = 0 및 f(Imaget, At-1) = Imaget + At-1로 두고 여기서 At-1은 t-1 시간까지 누적된 이상치이고 Imaget는 t 시간의 이상치입니다. imageCollection.iterate()
를 사용하여 재귀적으로 정의된 ImageCollection
를 만듭니다. 다음 예에서 accumulate()
함수는 컬렉션의 이미지와 이전의 모든 출력 목록이라는 두 가지 매개변수를 사용합니다. 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의 차트에 관해 자세히 알아보세요.
반복되는 함수는 실행할 수 있는 작업이 제한됩니다. 특히 함수 외부의 변수를 수정할 수 없으며 아무것도 출력할 수 없고 JavaScript 'if' 또는 'for' 문을 사용할 수 없습니다. 수집하려는 결과나 다음 반복으로 전달하려는 중간 정보는 함수의 반환 값에 있어야 합니다. `ee.Algorithms.If()` 를 사용하여 조건부 작업을 실행할 수 있습니다.