// tables with germany shape and the cities we are using in our application var germany = ee.FeatureCollection('ft:1KDrYXBDlAx1fhcfmWRx7u_qqN2O_gwBNInjnGmnZ') var cities = ee.FeatureCollection('ft:1w4PgU3okfzwKFEIpH32oPMlOtei6hUWa9tkXv5Rt'); // landsat properties we need to create our image collection over different years // we use a feature collection here, because we can easily filter it var landsats = ee.FeatureCollection([ ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LT5_L1T_TOA'), nir: 'B4', red: 'B3', from: 1984, to: 1992 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LT4_L1T_TOA'), nir: 'B4', red: 'B3', from: 1992, to: 1994 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LT5_L1T_TOA'), nir: 'B4', red: 'B3', from: 1994, to: 1999 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LE7_L1T_TOA'), nir: 'B4', red: 'B3', from: 1999, to: 2003 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LT5_L1T_TOA'), nir: 'B4', red: 'B3', from: 2003, to: 2012 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LE7_L1T_TOA'), nir: 'B4', red: 'B3', from: 2012, to: 2013 }), ee.Feature(null, { collection: ee.ImageCollection('LANDSAT/LC8_L1T_TOA'), nir: 'B5', red: 'B4', from: 2013, to: 2016 }) ]); // color palette preview: http://gka.github.io/palettes/#colors=#101721,#282e36,#2f423d,#345744,#376d4b,#398552,#399b58,#37b35e,#30cc64,#24e56a,#00ff70|steps=11|bez=0|coL=0 var palette = ['#101721','#282e36', '#2f423d', '#345744', '#376d4b', '#398552', '#399b58', '#37b35e', '#30cc64', '#24e56a', '#00ff70']; var startYear = 2005; var endYear = 2015; var startDay = '-06-01'; var endDay = '-07-31'; var ndviThresholdMin = 0.45; var ndviThresholdMax = 0.8; var cloudCoverMax = 5; var yearList = ee.List.sequence(startYear, endYear); Map.setCenter(10.5, 51.3, 6); // create an image collection with images between // start- and endyear in summer months for germany var accumulateImages = function(year, imageCollection){ var startDate = ee.Date(ee.String(ee.Number(year).toInt()).cat(startDay)); var endDate = ee.Date(ee.String(ee.Number(year).toInt()).cat(endDay)); var landsat = getLandsatByYear(year); var ndviCollection = ee.ImageCollection(landsat.get('collection')) .filterBounds(germany) .filterDate(startDate, endDate) .filterMetadata('CLOUD_COVER', 'less_than', cloudCoverMax) .map(addNDVI(landsat)); return ee.ImageCollection(imageCollection).merge(ndviCollection); } var resultCollection = yearList.iterate(accumulateImages, ee.ImageCollection([])); resultCollection = ee.ImageCollection(resultCollection); print(resultCollection); // to crossvalidate our result, we can randomly filter out 10% of the images // resultCollection = resultCollection // .randomColumn('random') // .sort('random') // .limit(resultCollection.size().multiply(0.9).toInt()); // create collection that only has the ndvi band // and reduce that collection to one image with the median reducer var resultCollectionReduced = ee.ImageCollection(resultCollection) .select('ndvi') .reduce(ee.Reducer.median()); // add greenamount and center properties for all cities cities = cities.map(function(feature){ feature = feature.set('center', ee.Feature(feature.centroid()).geometry().coordinates()); return feature.set('greenamount', addGreenamount(resultCollectionReduced, 0.45, feature)); }); // export data as geojson Export.table(cities, 'greencities_export', { fileFormat: 'GeoJSON' }); // add clipped layer to the map Map.addLayer( resultCollectionReduced.clip(germany), { min: ndviThresholdMin, max: ndviThresholdMax, palette: palette }, 'NDVI map' ); var ndviRGB = resultCollectionReduced.visualize({ min: ndviThresholdMin, max: ndviThresholdMax, palette: palette }); // export colored shape of germany Export.image(ndviRGB, 'germany_ndvi', { scale: 30, region: germany.geometry(), maxPixels: 130000000000 }); // helper functions function getLandsatByYear(year) { return landsats .filter(ee.Filter.lte('from', year) .and(ee.Filter.gt('to', year))) .first(); } // add greenamount for a specific threshold for a feature function addGreenamount(ndviReduced, threshold, feature){ var ndviAll = ndviReduced.gte(-1); var ndviHigh = ndviReduced.gte(threshold); var allReducedSum = ndviAll.reduceRegion({ reducer: ee.Reducer.sum(), geometry: feature.geometry(), scale: 30 }); var partReducedSum = ndviHigh.reduceRegion({ reducer: ee.Reducer.sum(), geometry: feature.geometry(), scale: 30 }); var value_all = ee.Number(allReducedSum.get('ndvi_median')); var value_high = ee.Number(partReducedSum.get('ndvi_median')); return value_high.divide(value_all).multiply(100); } // returns an image with a new ndvi band with the given landsat bands function addNDVI(landsat) { return function(image) { return image.addBands(image.normalizedDifference([landsat.get('nir'), landsat.get('red')]).rename('ndvi')); } }