-
-
Save landsurveyorsunited/a5c1e9bce85765cefe9d0983741b5f51 to your computer and use it in GitHub Desktop.
Greenest cities Germany / EarthEngine script for: http://interaktiv.morgenpost.de/gruenste-staedte-deutschlands
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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')); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment