GEE学习笔记 三十一:地图加载影像
日期:
看到标题很多小伙伴可能非常疑惑,在GEE工作空间中加载影像是非常简单的一件事情也就一句话而已:
Map.addLayer(image, {}, ‘layerName’);
确实没有错,就是这一句话。但是有个小伙伴问了我一个问题,他想要加载一个ImageCollection中的所有影像都加载到地图上那该如何做?
这个问题对于某些人来讲非常简单,但是对于一些初学者还是比较有难度,这里就简单分享一下解决思路供大家参考。
1.最基本方法使用for循环
要解决这个问题,通常第一反应就是使用for循环,结果怎么样呢?直接上代码查看结果。
var roi = /* color: #d63000 */ee.Geometry.Point([-98.96484375, 39.16414104768743]);
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA");
var rawCol = l8.filterDate("2018-1-1", "2018-6-1")
.filterBounds(roi);
//method 1
var sCol = rawCol.toList(10);
var num = sCol.size();
var cnum = num.getInfo();
for (var i=0; i
从结果上看应该是可以的

2. 循环升级版使用异步方式循环
考虑到直接使用for循环是非常不推荐的方式,而且最为重要的是第一种方法使用了getInfo()方法,这个方法是非常非常建议不要使用的方法。灵光一现,是否可以使用异步方式来循环相关数据,示例如下:
var roi = /* color: #d63000 */ee.Geometry.Point([-98.96484375, 39.16414104768743]);
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA");
var rawCol = l8.filterDate("2018-1-1", "2018-6-1")
.filterBounds(roi);
//method 2
var rawLayer = null;
var computedIds = rawCol.reduceColumns(ee.Reducer.toList(), ['system:index'])
.get('list');
computedIds.evaluate(function(ids) {
print("computedIds ", ids);
for (var i=0; i
结果和上面类似:

3. 必杀大招
喜闻乐见放大招阶段到了,不知道各位小伙伴想到没有,上面两种方法最大的问题是什么?聪明的小伙伴一定想到了,是图像数量的问题。测试的时候我只是加载了十几张图片,那么就是加载了十几个图层。问题来了,我们平时在搜索ImageCollection时候一般都是几百张的影像,那可是没办法一次性全部加载在地图上的。
不多废话,直接上解决方案:每次加载一张影像(一个图层),通过按钮控制加载删除图层。
var roi = /* color: #d63000 */ee.Geometry.Point([-98.96484375, 39.16414104768743]);
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA");
var rawCol = l8.filterDate("2018-1-1", "2018-6-1")
.filterBounds(roi);
//method 3
var rawLayer = null;
var computedIds = rawCol.reduceColumns(ee.Reducer.toList(), ['system:index'])
.get('list');
computedIds.evaluate(function(ids) {
print("computedIds ", ids);
var total = ids.length;
var showTitle = ui.Label("", {fontWeight: 'bold'});
var curIndex = 0;
var bPlus = ui.Button("+", function() {
curIndex += 1;
if (curIndex >= total) {
curIndex = 0;
}
showTitle.setValue(ids[curIndex]);
showSelectRawImage(ids[curIndex]);
});
var bReduce = ui.Button("-", function() {
curIndex -= 1;
if (curIndex < 0) {
curIndex = total - 1;
}
showTitle.setValue(ids[curIndex]);
showSelectRawImage(ids[curIndex]);
});
showTitle.setValue(ids[curIndex]);
showSelectRawImage(ids[curIndex]);
var main = ui.Panel({
widgets: [
ui.Label('click "+" or "-" to move time window', {fontWeight: 'bold'}),
bPlus, bReduce,
ui.Label("select date: ", {fontWeight: 'bold'}),
showTitle
],
style: {width: '200px', padding: '8px'}
});
ui.root.insert(0, main);
});
function showSelectRawImage(key) {
if (rawLayer !== null) {
Map.remove(rawLayer);
}
print("show raw image id is: " + key);
var image = ee.Image(rawCol.filter(ee.Filter.eq("system:index", key)).first());
rawLayer = Map.addLayer(image, {bands:["B4", "B3", "B2"], min:0, max:0.3}, key);
}
Map.centerObject(roi, 7);
运行结果:

点击+、-号可以切换图像,同时左侧也显示了加载的影像index。
最后一种方法在实际应用中可以非常灵活,通过这种方式可以非常方便观察查看不同的ImageCollection中所有影像