Advertisement
WakemeUpLater

Simple Temporal Percentile Features Extraction

Jun 17th, 2020
709
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Preprocessing step
  2. var collection = ee.ImageCollection("COPERNICUS/S2_SR")
  3.   .filterDate("2020-01-01", "2020-03-01")
  4.   .filter(
  5.     ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50)
  6.   )
  7.   .map(function (image) {
  8.       var qa = image.select('QA60');
  9.       var cloudBitMask = 1 << 10;
  10.       var cirrusBitMask = 1 << 11;
  11.       var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
  12.                   .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
  13.       image = image.updateMask(mask).divide(10000);
  14.       image = image.addBands(image.normalizedDifference(['B8', 'B4']).toFloat().rename('NDVI'))
  15.                   .addBands(image.normalizedDifference(['B12', 'B4']).toFloat().rename('NDFI'))
  16.       return image.select(["NDVI", "NDFI"]);
  17.   });
  18.  
  19. // Foyou Tian, et al
  20. // Add empty image to prevent null error when calculating percentile
  21. var emptyImage = ee.Image().rename("NDVI").toFloat()
  22.   .addBands(ee.Image().rename("NDFI").toFloat())
  23. collection = ee.ImageCollection(ee.List([emptyImage])).merge(collection);
  24.  
  25. function percentile_transformation(data, bands) {
  26.     function rename_bands(bands, suffix) {
  27.         return bands.map(function (b) {
  28.             return ee.String(b).cat(suffix)
  29.         })
  30.     }
  31.     function get_interval_mean(img, bands, pstart, pend){
  32.         return img
  33.           .select(bands)
  34.           .reduce(ee.Reducer.intervalMean(pstart,pend))
  35.           .rename(rename_bands(bands, "_" + pstart + "-" + pend));
  36.     }
  37.     function get_percentile(img, bands, p){
  38.         return img.select(bands).reduce(ee.Reducer.percentile(p));
  39.     }
  40.  
  41.     return (
  42.         get_interval_mean(data, bands, 0, 100)
  43.         .addBands(get_interval_mean(data, bands, 10, 25))
  44.         .addBands(get_interval_mean(data, bands, 10, 90))
  45.         .addBands(get_interval_mean(data, bands, 10, 100))
  46.         .addBands(get_interval_mean(data, bands, 25, 50))
  47.         .addBands(get_interval_mean(data, bands, 25, 75))
  48.         .addBands(get_interval_mean(data, bands, 50, 75))
  49.         .addBands(get_interval_mean(data, bands, 75, 90))
  50.         .addBands(get_interval_mean(data, bands, 90, 100))
  51.         .addBands(get_percentile(data, bands, [10, 25, 50, 75, 95]))
  52.     );
  53. }
  54.  
  55. var resultImage = percentile_transformation(collection, ["NDVI", "NDFI"]);
  56. Map.addLayer(resultImage)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement