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中所有影像