GEE的每一个API都值得我们去研究,就以GEE中最为普通的方法拼接来讲就有很多的内容可以研究,这一篇文章就是探讨一下GEE中拼接方法。关于GEE中的影像集合拼接为单张影像有很多中方法,最为普通的莫过于mosiac()方法,利用这个方法我们可以将影像集合拼接为单张影像。还有偶尔会用到的是qualityMosiac(),这个方法在我们要筛选某些数据的时候比较有用。先看一下这个两个的API:
从字面解释的意识可以知道:
mosaic获取的是最后一个有值的像素,然后生成一张影像;
qualityMosaic提取的是按照qunalityBand排序后最大值的数据,类似对集合使用max函数;
如果还是不太理解上面的解释,我们直接使用代码来解释相关内容。下面的例子都使用了公共的数据:
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR"),
roi = /* color: #d63000 */ee.Geometry.Point([-104.78007812499999, 37.982913413138604]);
1、普通的Mosaic
具体代码:
//普通的mosaic,获取的是最后一个有值的像素
//默认的addLayer(imageCollection)使用的是普通的mosaic
function normalMosaicDemo() {
Map.centerObject(roi, 8);
var scol = l8.filterBounds(roi)
.filterDate("2018-1-1", "2018-3-1")
.select("B1")
.map(function(image) {
return image.updateMask(image.lt(2000));
});
print(scol);
Map.addLayer(scol, {}, "1");
var img1 = scol.mosaic();
Map.addLayer(img1, {}, "2");
}
normalMosaicDemo();
分析代码:
这里需要注意的是,直接使用addLayer()添加imageCollection与imageCollection调用mosaic方法是结果是一致的。同时通过点击查看点的数据,可以看到mosaic计算所得是最后一个有效的像素值。
运行结果:
2、质量排序的qualityMosaic
(1)例子一,直接使用qualityMosaic方法
具体代码:
//qualityMosaic()提取的是排序后最大值的数据
function qualityMosaicDemo1() {
Map.centerObject(roi, 8);
var scol = l8.filterBounds(roi)
.filterDate("2018-1-1", "2018-3-1")
.select("B1");
print(scol);
Map.addLayer(scol, {}, "1");
var img1 = scol.qualityMosaic("B1");
Map.addLayer(img1, {}, "2");
}
qualityMosaicDemo1();
代码分析:
从结果可以看到qualityMosaic提取的是像素点的最大值。
运行结果:
(2)例子二,单波段影像对比max和qualityMosaic结果
具体代码:
//单波段与max对比
function qualityMosaicDemo2() {
Map.centerObject(roi, 8);
var scol = l8.filterBounds(roi)
.filterDate("2018-1-1", "2018-3-1")
.select("B1");
print(scol);
Map.addLayer(scol, {}, "1");
var img1 = scol.qualityMosaic("B1");
Map.addLayer(img1, {}, "2");
var img2 = scol.max();
Map.addLayer(img2, {}, "3");
var img3 = scol.reduce(ee.Reducer.max());
Map.addLayer(img3, {}, "4");
var img4 = scol.reduce(ee.Reducer.max(1));
Map.addLayer(img4, {}, "5");
}
qualityMosaicDemo2();
代码分析:
从结果可以看到使用max和qualityMosaic在拼接单波段影像中两者是没有区别的。
运行结果:
(3)例子三,多波段影像对比max和qualityMosaic的结果
具体代码:
//多波段与max对比
function qualityMosaicDemo3() {
Map.centerObject(roi, 8);
var scol = l8.filterBounds(roi)
.filterDate("2018-1-1", "2018-3-1")
.map(function(image) {
var doy = ee.Date(image.get("system:time_start")).format("DDD");
doy = ee.Number.parse(doy).int();
image = image.addBands(ee.Image.constant(doy).toInt().rename("doy"));
return image;
})
.select(["B1", "doy"]);
print(scol);
Map.addLayer(scol, {}, "1");
var img1 = scol.qualityMosaic("B1");
Map.addLayer(img1, {}, "2");
var img2 = scol.max();
Map.addLayer(img2, {}, "3");
var img3 = scol.reduce(ee.Reducer.max());
Map.addLayer(img3, {}, "4");
var img4 = scol.reduce(ee.Reducer.max(2));
Map.addLayer(img4, {}, "5");
}
qualityMosaicDemo3();
代码分析:
这个结果可能有些人看得就有些懵了,使用qualityMosaic只会对imageCollection中的qualityBand排序不会影响其他波段,这种效果类似ee.Reducer.max(2)这种方法,关于max中参数有无的区别后续在讨论。而直接使用max()或者ee.Reducer.max()则是对所有波段排序后取值。这点区别需要注意一下。
运行结果:
大家如果有问题需要交流或者有项目需要合作,可以微信联系我,加微信好友请留言加上“GEE”。
知乎专栏:https://zhuanlan.zhihu.com/c_123993183
微信号:shi_weihappy