GEE学习笔记 四十二:Reducer介绍(一)

日期:

ee.Reducer是GEE中非常有用的类,我们的所有工程几乎都会用到这个方法,接下来一段时间我会详细介绍一下Reducer的各种方法。

 

先看一下GEE对Reducer的解释

 

这里使用的是影像集合做为例子来说明,就是将一个集合通过对每一个像素列表求和、求极值等方式变成为一张影像。对于列表可以直接理解为数组求和、求极值等。

 

我们先看一下GEE中有哪些Reducer:

 

这些Reducer大概有几十个吧,接下来很长时间我尽量做到介绍每一个Reducer,开篇先讲一下最简单的几个Reducer。

 

注释:在API文档中可以看到有两个Reducer是红色的,这个代表这个API是已经废弃了,不在建议使用(DEPRECATED: ee.Reducer.and() ee.Reduer.or())。

  • ee.Reducer.allNonZero()

解释:检查输入是否都是非0值,如果都是非0值,则返回1,否则0。

 

例子:

function allNonZero() {
  //ee.Reducer.allNonZero(),
  var a = ee.List([1,0,2,3]);
  //输出结果为0,因为包含0
  print("result1", a.reduce(ee.Reducer.allNonZero()));
  var b = ee.List([1,2,3,4]);
  //输出结果为1,因为全是非0值
  print("result2", b.reduce(ee.Reducer.allNonZero()));
}
allNonZero();

 

  • ee.Reducer.anyNonZero()

解释:检测输入是否包含非0值,如果包含非0只,则返回1,否则0。

 

例子:

function anyNonZero() {
  //ee.Reducer.anyNonZero()
  var a = ee.List([1,0,2,3]);
  //因为包含非0值,输出1
  print("result1", a.reduce(ee.Reducer.anyNonZero()));
  var b = ee.List([0,0]);
  //值全为0,输出0
  print("result2", b.reduce(ee.Reducer.anyNonZero()));  
}
anyNonZero();

 

  • ee.Reducer.first()

解释:返回输入的第一个元素

 

例子:

var roi = /* color: #d63000 */ee.Geometry.Polygon(
        [[[116.11220202824006, 38.133561577393166],
          [116.37569631837516, 38.1696689233409],
          [116.32936651641012, 38.35173534234094],
          [116.07083980910647, 38.31789056147068]]]),
    l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA");
 
function generateImage() {
  Map.centerObject(roi, 10);
  var img = l8.filterDate("2018-6-1", "2018-8-1")
              .filterBounds(roi)
              .map(ee.Algorithms.Landsat.simpleCloudScore)
              .map(function(image){
                image = image.updateMask(image.select("cloud").lte(20));
                return image;
              })
              .map(function(image) {
                return image.addBands(image.normalizedDifference(["B5", "B4"]).rename("NDVI"));
              })
              .select("NDVI")
              .mosaic()
              .clip(roi);
  var visParam = {
    min: -0.2,
    max: 0.8,
    palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
      '3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
  };
  Map.addLayer(img, visParam, "NDVI");
  return img;
}
var img = generateImage();


function first() {
  //ee.Reducer.first()
  //list
  var a = ee.List([1,2,3,4,5]);
  //返回列表的第一个元素 1
  print("result", a.reduce(ee.Reducer.first()));
 
  //image
  var firImg = ee.Image(l8.reduce(ee.Reducer.first()));
  //返回集合中每一景影像的波段第一个像素,同时重命名波段名称
  print("firImg", firImg);
}
first();

 

输出结果:

 

  • ee.Reducer.firstNonNull()

解释:返回输入的第一个非null元素

 

例子:

function firstNonNull() {
  //ee.Reducer.firstNonNull()
  //list
  var a = ee.List([null, 1,2,3,4,5]);
  //返回第二个元素 1
  print("result", a.reduce(ee.Reducer.firstNonNull()));
}
firstNonNull();

 

  • ee.Reducer.last()

解释:返回输入的最后一个元素

 

例子:

function last() {
  //ee.Reducer.last()
  //list
  var a = ee.List([1,2,3,4,5]);
  //返回最后一个元素 5
  print("result", a.reduce(ee.Reducer.last()));
}
last();

 

  • ee.Reducer.lastNonNull()

解释:返回输入的最后一个非null元素

 

例子:

function lastNonNull() {
  //ee.Reducer.lastNonNull()
  //list
  var a = ee.List([0, 1,2,3,4, null]);
  //返回倒数第二个元素 4
  print("result", a.reduce(ee.Reducer.lastNonNull()));
}
lastNonNull();