GEE学习笔记(9): 循坏for,while,map,evaluate和iterate的异同


目录:
  • 利用 landsat8 的数据,导出 2013-2020 年武汉市年平均 NDVI 值的 GIF 图

  • 实现同一个目的,分别展示for,map,evaluate,iterate 之间的不同用法

1 结果显示

| | |

| :---: | :---: |

| NDBI | EVI |

| NDVI | 真彩色 |

2 异同

  • for、while:就是基本的循环结构语句,但是在GEE里很少用,基本用 map 替代,因为是顺序执行代码,效率太慢

  • map:用的最多,执行效率最快,相当于“并行执行任务”,能用 map,就用 map,但是函数里一般不能用 print,Map,toDrive 等方法

  • iterate:“迭代”,顺序执行,每次执行都在前面执行的结果上继续执行,很遗憾,这次的例子没有体现“迭代”的意思

  • evaluate:主要用来异步导出和显示,加快速度,一般没有返回值,结合 for 和 map 一起用,这里的 map 里可以有 print,Map,toDrive 方法

3 代码

// 去云操作

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));