首先过滤再select()
通常,在对集合执行任何其他操作之前,按时间、位置和/或元数据过滤输入集合。在选择性较少的过滤器之前应用更多选择性过滤器。空间和/或时间过滤器通常更具选择性。例如,请注意select()
和之前filter()
应用: map()
var images = ee.ImageCollection('COPERNICUS/S2_SR'); var sf = ee.Geometry.Point([-122.463, 37.768]); // 归约图像邻域功能。 var reduceFunction = function(image) { return image.reduceNeighborhood({ reducer: ee.Reducer.mean(), kernel: ee.Kernel.square(4) }); }; var bands = ['B4', 'B3', 'B2']; // Select and filter 首先进行,然后再进行MAP之类或者计算的操作! var reasonableComputation = images .select(bands) .filterBounds(sf) .filterDate('2018-01-01', '2019-02-01') .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 1)) .aside(print) // Useful for debugging. .map(reduceFunction) .reduce('mean') .rename(bands); var viz = {bands: bands, min: 0, max: 10000}; Map.addLayer(reasonableComputation, viz, 'resonableComputation');
使用updateMask()
代替mask()
updateMask()
和 之间的区别在于mask()
前者and()
对参数(新掩码)和现有图像掩码进行逻辑处理,而mask()
只是用参数替换图像淹没掉。后者的危险在于您可能会无意中取消屏蔽像素。在此示例中,目标是屏蔽小于或等于 300 米高程的像素。正如您所看到的,使用 mask()
会导致很多像素被掩盖,这些像素不属于感兴趣的图像:
var l8sr = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR'); var sf = ee.Geometry.Point([-122.40554461769182, 37.786807309873716]); var aw3d30 = ee.Image('JAXA/ALOS/AW3D30_V1_1'); Map.centerObject(sf, 7); var image = l8sr.filterBounds(sf) .filterDate('2019-06-01', '2019-12-31') .first(); var vis = {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000}; Map.addLayer(image, vis, 'image', false); var mask = aw3d30.select('AVE').gt(300); Map.addLayer(mask, {}, 'mask', false); // NO! Don't do this! var badMask = image.mask(mask); Map.addLayer(badMask, vis, 'badMask'); //这样做比较好 var goodMask = image.updateMask(mask); Map.addLayer(goodMask, vis, 'goodMask', false);
组合reducer
如果您需要来自单个输入(例如图像区域)的多个统计信息(例如均值和标准差),则组合减速器会更有效。例如,要获取图像统计信息,请按如下方式组合 reducer:这里用到了平均数和标准差之间的计算这样就不同再单独罗列和再次写一次reducer了
var image = ee.Image('COPERNICUS/S2/20150821T111616_20160314T094808_T30UWU'); // 通过组合减速器获得每个波段的均值和标准差 var stats = image.reduceRegion({ reducer: ee.Reducer.mean().combine({ reducer2: ee.Reducer.stdDev(), sharedInputs: true }), geometry: ee.Geometry.Rectangle([-2.15, 48.55, -1.83, 48.72]), scale: 10, bestEffort: true // Use maxPixels if you care about scale. }); print(stats); // 将平均值和 SD 提取到图像。 var meansImage = stats.toImage().select('.*_mean'); var sdsImage = stats.toImage().select('.*_stdDev');
在这个例子中,请注意均值归约器与标准偏差归约器相结合,并且sharedInputs
能够单次通过输入像素。在输出字典中,reducer 的名称附加到带名称。要获得均值和 SD 图像(例如对输入图像进行归一化),您可以将值转换为图像并使用正则表达式分别提取均值和 SD,如示例中所示。