> For the complete documentation index, see [llms.txt](https://comingboy.gitbook.io/gee/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://comingboy.gitbook.io/gee/di-3-zhang/3.3-jie/3.3.1-jie.md).

# 3.1节 循坏for,while,map,evaluate和iterate的异同

* 利用 landsat8 的数据，导出 2013-2020 年武汉市年平均 NDVI 值的 GIF 图
* 实现同一个目的，分别展示for,map,evaluate,iterate 之间的不同用法

## 1 结果显示

|                                                                                                                                                                                                                    |                                                                                                                                                                                                                   |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![NDBI](https://357480708-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4gCiCCbz0Z842iX9K9%2F-M4i_IzhikZeDrk0zW2M%2F-M4i_MktLJHkikVSRevG%2Fgif-ndvi2.gif?generation=1586698226878504\&alt=media) | ![EVI](https://357480708-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4gCiCCbz0Z842iX9K9%2F-M4i_IzhikZeDrk0zW2M%2F-M4i_MkvWn23Wki5GDUY%2Fgif-true2.gif?generation=1586698226496332\&alt=media) |
|                                                                                                        NDVI                                                                                                        |                                                                                                        真彩色                                                                                                        |

## 2 异同

* for、while：就是基本的循环结构语句，但是在GEE里很少用，基本用 map 替代，因为是顺序执行代码，效率太慢
* map：用的最多，执行效率最快，相当于“并行执行任务”，能用 map,就用 map，但是函数里一般不能用 print,Map,toDrive 等方法
* iterate：“迭代”，顺序执行，每次执行都在前面执行的结果上继续执行，很遗憾，这次的例子没有体现“迭代”的意思
* evaluate：主要用来异步导出和显示，加快速度，一般没有返回值，结合 for 和 map 一起用，这里的 map 里可以有 print,Map,toDrive 方法

## 3 代码

```javascript
// 去云操作
var maskcloud = function(image) {
  var qa = image.select('BQA');
  var mask = qa.bitwiseAnd(1 << 4)
            .or(qa.bitwiseAnd(1 << 8));
  return image.updateMask(mask.not());
};

// 计算NDVI
var ndvi = function(image){
      var ndvi = image.normalizedDifference(['B5','B4']).rename('NDVI');
      return image.addBands(ndvi)
    };

var roi = ee.FeatureCollection("users/comingboy1118/China/CH_shi");

var roi = roi.filter(ee.Filter.eq("市","武汉市")).geometry()
Map.addLayer(roi,{"color":'red',},"roi")
Map.centerObject(roi, 8)

// for 很少用，顺序执行，计算慢
var time = ["2013","2014","2015","2016","2017","2018","2019","2020"];
var list = ee.List([])//
for(var index in time){
  var year = time[index]+"-01"+"-01"
  var image = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA")
    .filterBounds(roi)
    .filterDate(year,ee.Date(year).advance(1,"year"))
    .map(maskcloud)
    .map(ndvi)
    .median()
    .select(["B2","B3","B4","NDVI"],['blue','green','red','NDVI'])
    .clip(roi)
    .setMulti({"system:index":year,'system:time_start':ee.Date(year)})
  list = list.add(image)
}
var imgMonth = ee.ImageCollection.fromImages(list);
print(imgMonth,"imgMonth_for")

// map 一般计算最快，用的最多，异步计算,能用map,就用map，但是函数里一般不能用print,Map,toDrive
var time = ee.List.sequence(2013,2020)
var imgMonth = time.map(function(year){
  var year = ee.Number(year).format("%04d").cat("-01-01")
  var image = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA")
    .filterBounds(roi)
    .filterDate(year,ee.Date(year).advance(1,"year"))
    .map(maskcloud)
    .map(ndvi)
    .median()
    .select(["B2","B3","B4","NDVI"],['blue','green','red','NDVI'])
    .clip(roi).setMulti({"system:index":year,'system:time_start':ee.Date(year)})

    return image
  })
var  imgMonth = ee.ImageCollection(imgMonth)
print(imgMonth,"imgMonth_map")

// itetate 迭代的方式和 for 很相似，都是往原list添加元素
var time = ee.List.sequence(2013,2020)
var filterImg = function(year,first){

  var year = ee.Number(year).format("%04d").cat("-01-01")
  var image = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA")
    .filterBounds(roi)
    .filterDate(year,ee.Date(year).advance(1,"year"))
    .map(maskcloud)
    .map(ndvi)
    .median()
    .select(["B2","B3","B4","NDVI"],['blue','green','red','NDVI'])
    .clip(roi).setMulti({"system:index":year,'system:time_start':ee.Date(year)})
  return ee.List(first).add(image);
}
var imgMonth = time.iterate(filterImg,ee.List([]))
var  imgMonth= ee.ImageCollection.fromImages(imgMonth)
print(imgMonth,"imgMonth_iterate")

// evaluate --主要用来异步导出和显示，一般没有返回值，结合for 和map 一起用，这里的map里可以有print,Map,toDrive方法
var  time = imgMonth.reduceColumns(ee.Reducer.toList(), ['system:index'])
                        .get('list');
var visParams = {min: -0.8, max: 0.8, palette: ['blue', 'white','green']};
time.evaluate(function(years) {

  years.map(function(year){
    var image = ee.Image(imgMonth.filter(ee.Filter.eq("system:index", year)).first());
    Map.addLayer(image.select("NDVI"), visParams, year);
  })

})

// gif - NDVI  
var params01 = { 
  crs: 'EPSG:3857', 
  framesPerSecond: 2, 
  region: roi, 
  min: -0.8, 
  max: 0.8, 
  bands: ["NDVI"], 
  dimensions: 512, 
  format:"gif",
  palette: ['blue', 'white','green']
}; 
print(ui.Thumbnail({image:imgMonth, params:params01}))
print(imgMonth.getVideoThumbURL(params01));

// gif - 真彩色
var params02 = { 
  crs: 'EPSG:3857', 
  framesPerSecond: 2, 
  region: roi, 
  min: 0, 
  max: 0.3, 
  bands: ["red","green","blue"], 
  dimensions: 512, 
  format:"gif",
}; 
print(ui.Thumbnail({image:imgMonth, params:params02}))
print(imgMonth.getVideoThumbURL(params02));
```

### 激励自己，尽可能每周更新1-2篇，2020加油！！！

### 需要交流或者有项目合作可以加微信好友 (备注GEE)

### 微信号：comingboy0701
