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();