Reducer是GEE中按照时间、空间、波段等进行整合数据的方法;类似于从部分到整体。
ee.Reducer()可以指定数据整合的方式,如:max\min\mean\etal。
- 时间:imageCollection.reduce()
- 空间:image.reduceRegion() ; image.reduceNeighborhood()
- 波段:image.reduce()
- Feature Collection 的属性:Feature Collection.reduceColumns()
以计算NDVI数值并添加至影像合集为例
具体需求:
为一个影像集合添加NDVI波段,同时计算每一景影像上roi的NDVI均值
var mean = ndvi.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
print("reduceRegion value is: ", mean);
map遍历循环
-
map:用的最多,执行效率最快,相当于“并行执行任务”,能用 map,就用 map,但是函数里一般不能用 print,Map,toDrive 等方法
-
for、while:就是基本的循环结构语句,但是在GEE里很少用,基本用 map 替代,因为是顺序执行代码,效率太慢
-
iterate:“迭代”,顺序执行,每次执行都在前面执行的结果上继续执行,很遗憾,这次的例子没有体现“迭代”的意思
-
evaluate:主要用来异步导出和显示,加快速度,一般没有返回值,结合 for 和 map 一起用,这里的 map 里可以有 print,Map,toDrive 方法
完整代码:
roi是我自己画的
var roi = ee.FeatureCollection(geometry);
Map.addLayer(roi, {color: "red"}, "roi"); // 显示roi
Map.centerObject(roi, 9); // 以roi为中心,缩放等级9
// 筛选影像
var Col = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")
.filterBounds(roi)
.filterDate("2022-1-1", "2022-7-1")
// 循环遍历影像集合,为每景影像计算并添加一个NDVI波段
.map(function(image){
var ndvi = image.normalizedDifference(["B5", "B4"])
.rename("NDVI");
return image.addBands(ndvi);
})
// 选择NDVI波段用于后续计算
.select("NDVI")
// 循环遍历影像集合,计算每景影像roi的NDVI均值,并赋为新的属性字段“ndvi”
.map(function(image) {
var dict = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
var ndvi = ee.Number(dict.get("NDVI"));
image = image.set("ndvi", ndvi);
return image;
});
// 可视化参数,加载显示新的影像集合,使用first(),返回集合的第一个非空元素,即第一景影像
print("Col", Col);
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(Col.first().clip(roi), visParam, "Col");