I want to calculate the mean NDVI per region (admin level 3, also called woreda), month and year. So my end result would look something like this:
regions year month NDVI
---------------------------------
region_1 2010 1 0.5
region_1 2010 2 -0.6
region_1 2010 3 0.7
region_1 2010 4 -0.3
region_1 2010 5 0.4
region_1 2010 6 -0.5
region_1 2010 7 0.5
region_1 2010 8 -0.7
region_1 2010 9 0.8
region_1 2010 10 -0.55
region_1 2010 11 -0.3
region_1 2010 12 -0.2
region_2 2010 1 0.5
region_2 2010 2 -0.6
region_2 2010 3 0.7
region_2 2010 4 -0.3
region_2 2010 5 0.4
region_2 2010 6 -0.5
region_2 2010 7 0.5
region_2 2010 8 -0.7
region_2 2010 9 0.8
region_2 2010 10 -0.55
region_2 2010 11 -0.3
region_2 2010 12 -0.2
... ... ... ...
My code basically does this for a predetermined region in the var modisNDVI. However I want my code to be able to do this for 2010 untill 2015, for each month for each region.
How can I do this without writing more for loops (the iterating through the years and months)?
Should I be using reduceRegion or .map() in order to skip (all) the for loops?
I've made an attempt to use reduceRegions but failed to apply this to an imageCollection.
// import data
var region = ee.FeatureCollection("ft:1zRUOJL1LYCPJj-mjP6ZRx8sxYKNH8EwDw3EPP66K"),
modisNDVI = ee.ImageCollection("MODIS/MCD43A4_006_NDVI");
// Get NDVI
var modisNDVI = ee.ImageCollection(modisNDVI.filterDate('2015-01-01', '2015-06-01'));
var woredaNames = region.aggregate_array("HRpcode")
// do something so I can get monthly data for each year (2010-2015) for earch woreda (690)
// I don't want to write another for loop for the year and month what is a more optimized way?
// Processing all the 690 takes long, for this example I've used 10 woreda's
for (var woreda=0; woreda < 10 ;woreda++){
// Focus on one region:
var focusRegion = region.filter(ee.Filter.eq('system:index', String(woreda)));
// Clip modis image on focused region:
var focus_NDVI_clip = modisNDVI.mean().clip(focusRegion);
// aggregate mean over geometry from focused region:
var mean_dict = focus_NDVI_clip.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: focusRegion.geometry(),
scale: 500,
});
// Append index to mean_dictionary and print it (eventually this should turn into a list):
var woreda_code = ee.List(woredaNames).get(woreda);
mean_dict = mean_dict.set('Woreda_code', ee.String(woreda_code));
print(mean_dict);}
edit: I tried to use the script that Bert Coerver proposed. However this calculates the mean NDVI for each date (I only need it for one month per region). Subsequently the daily calculation of the ndvi per region results in a run time error.