# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://comingboy.gitbook.io/gee/di-3-zhang/3.3-jie/3.3.1-jie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
