0%

Google Earth Engine (GEE) 学习记录

最前

本文用于记录博主学习Google Earth Engine (GEE)的相关过程。GEE不同于Google Earth,根据官网介绍,它是一个面向学者、科研人员和开发人员的GIS、RS工具,它集成了数以PB计量的卫星影像和地理空间数据,它提供了丰富的分析功能,使用户可以检测地球表面的变化、绘制趋势图并量化差异。

学习资料及参考教程:

基本数据类型

参考来源:https://code.earthengine.google.com/99dd5001aafcc56a1be2d231487b4979

JavaScript中常见数据类型

JavaScript中常见的数据类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
print("-----------数据类型-----------");
var num_a = 1; //整数
var num_b = 2.1; //保留小数
var num_c = 1e2; //科学计数法
print(num_a);


var str_1 = "hello world!"; //双引号
var str_2 = 'hello world!'; //单引号,两者不能混用
print(str_1);
print(str_2);

var bool_1 = true; //布尔值表示的就是真假
var bool_2 = false;

var dict = { "name": "bili", "age": 12, "desc": "he is good!" };
print(dict.name); //获取制定key的对象
print(dict['name']);

var arr_num = [1,2,3]; //数字数组
var arr_str = ["a", "b", "c" ]; //字符串数组
var arr_mul = [1,2, "a"]; //混合数组
print(arr_num[0]); //数组的索引是从0开始,最后一位是 (arr.length() - 1)

var x = null;
print(x);

var y;
print(y);

print("-----------数学运算-----------");
//数学运算
var a1 = 10;
var a2 = 20;
//数字运算的加、减、乘、除、求余
print(a1 + a2);
print(a1 - a2);
print(a1 * a2);
print(a1 / a2);
print(a2 % a1);
//累加,就是对自己本身加1
var a3 = ++a1;
print("a3: " + a3 + " a1: " + a1);
//递减,就是对自己本身减1
var a4 = --a2;
print("a4: " + a4 + " a2: " + a2);
// +=, -=, *=, /=, %=
var a5 = 10;
a5 += 1;
print("a5: " + a5);

//字符串连接
var b1 = "hello";
var b2 = "GEE";
print(b1 + " " + b2);

//字符串和数字连接
print(b1 + " " + a5);

print("-----------控制循环语句-----------");
//if...else...
var seen = true;
if (seen) {
print("find it");
} else {
print("not find it");
}

//for循环
var sum = 0;
for (var i=0; i<=10; i++) {
sum += i;
}
print("sum is: " + sum);


print("-----------方法(函数)-----------");
//方法一:直接定义
function mySum1(a, b) {
return a + b;
}
//方法二:使用定义变量方式定义
var mySum2 = function(a, b) {
return a + b;
};
//方法三:在对象内部定义函数,主要是为了封装某些方法,
// 只有特定的对象才能使用
var funcObj = {
mySum3: function(a, b) {
return a + b;
}
};

print(mySum1(1, 2));
print(mySum2(1, 2));
print(funcObj.mySum3(1, 2));

GEE中常见数据类型

可理解为GEE对JavaScript数据类型和函数的二次封装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//////////////////////// ee.String 字符串 //////////////////////
var ee_str1 = ee.String("this is string.");
//拼接字符串
var ee_str2 = ee.String("second string");
var ee_str3 = ee_str1.cat(" ").cat(ee_str2);
print("concatenates more strings", ee_str3);

var ee_str4 = ee.String("This is landsat8 image.");
//获取子字符串,字符串的起始索引0
print("get substring", ee_str4.slice(1, 6));
//分割字符串
print("split string to list", ee_str4.split(" "));

//////////////////////// ee.Number 数值 //////////////////////
var ee_num1 = ee.Number(100.01);
print("ee number is", ee_num1);

// 绝对值 abs
print("ee abs is", ee.Number(-100).abs());

// 浮点型转换类型 toInt ...
print("float to int", ee_num1.toInt());

//近似值 round ceil floor
var ee_num2 = ee.Number(1.4);
print("ee num2 round", ee_num2.round());
print("ee num2 ceil", ee_num2.ceil());
print("ee num2 floor", ee_num2.floor());

//四则运算 add subtract multiply divide mod
print("add values", ee_num1.add(ee_num2));
print("divide values", ee_num1.divide(ee_num2));

//////////////////////// ee.Date 日期 ////////////////////////
var ee_date1 = ee.Date("2017-01-01");
print("ee_date1 is", ee_date1);
//http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html
var ee_date2 = ee.Date.parse("yyyyDDD", "2017010");
print("ee date2 is", ee_date2);
print("ee date2 year is", ee_date2.get("year"));

//获取后一天,单位可以是'year', 'month' 'week', 'day', 'hour', 'minute', or 'second'
var ee_date4 = ee.Date("2017-1-10");
var next_date = ee_date4.advance(1, "day");
print("next date is", next_date);
var pre_date = ee_date4.advance(-1, "day");
print("pre date is", pre_date);

//日期间隔,单位可以是'year', 'month' 'week', 'day', 'hour', 'minute', or 'second'
var ee_date5 = ee.Date("2017-1-1");
var ee_date6 = ee.Date("2017-1-10");
print("days number", ee_date6.difference(ee_date5, "day"));

//获取指定格式的日期返回值,比如当前是一年中的第几天
var doy1 = ee_date6.format("DDD");
print("day of year1", doy1);

//////////////////////// ee.Dictionary 字典 ////////////////////////
var ee_dict1 = ee.Dictionary({
name: "AA",
age: 10,
desc: "this is a boy"
});
print("keys is", ee_dict1.keys());
print("values is", ee_dict1.values());
print("age is ", ee_dict1.get("age"));
print("name is ", ee_dict1.get("name"));


//////////////////////// ee.List 列表 ////////////////////////
var ee_list1 = ee.List([1,2,3,4,5]);
print("ee list create first method", ee_list1);

//列表初始化除了可以直接使用Js数组,还可以使用内部方法
var ee_list2 = ee.List.sequence(1, 5);
print("ee list create second method", ee_list2);
print("ee_list2[1] = ", ee_list2.get(1));
print("length ", ee_list2.length());
print("size ", ee_list2.size());

//添加元素
var ee_list3 = ee.List([1,2,3]);
ee_list3 = ee_list3.add(4);
print("ee_list3 is", ee_list3);
print("insert index", ee_list3.insert(0, 9));

//提取部分List
print("slice list", ee_list1.slice(1, 3));

//to string
var ee_list4 = ee.List(["a", "b", "c"]);
print("join string", ee_list4.join("-"));

////////////////////////// ee.Array 数组 ////////////////////////
var ee_arr1 = ee.Array([[1,2], [2,2]]);
print("ee_arr1 is", ee_arr1);
var ee_arr2 = ee.Array(ee.List([[1,1], [3,3]]));

//加、减、除、乘计算
print("add result ", ee_arr1.add(ee_arr2));
//[[2,3],[5,5]]
print("subtract result", ee_arr1.subtract(ee_arr2));
//[[0,1],[-1,-1]]
print("divide result", ee_arr1.divide(ee_arr2));
//[[1,2],[0.6666666865348816,0.666666686534]]
print("multiply result", ee_arr1.multiply(ee_arr2));
//[[1,2],[6,6]]

//axis 0 1
print("axis 0", ee_arr2.reduce(ee.Reducer.sum(), [0]));
//[[4,4]]
print("axis 1", ee_arr2.reduce(ee.Reducer.sum(), [1]));
//[[2],[6]]

矢量数据

本部分全部Demo来源于知乎专栏《GEE开发》,作者:无形的风

几何图形Geometry

  • Demo 1:创建两个几何图形,求面积area、界限bounds、中心点centroid和坐标coordinates等信息。两个多边形相交intersects(取共同部分)、缓冲区buffer、相切difference(取不同部分)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var polygon1 = /* color: #d63000 */ee.Geometry.Polygon(
[[[116.18363255709164, 39.73608336682765],
[116.62857884615414, 39.75297820506206],
[116.60660618990414, 40.08580181855619],
[116.15067357271664, 40.077395868796174]]]);
var polygon2 = /* color: #ffc82d */ee.Geometry.Polygon(
[[[116.45728060961198, 40.23636657920226],
[116.42981478929948, 39.97166693527704],
[116.82806918383073, 39.95903650847623],
[116.88849398851823, 40.20700637790917]]]);


Map.centerObject(polygon1, 9);
Map.addLayer(polygon1, {color: "red"}, "polygon1");
Map.addLayer(polygon2, {color: "blue"}, "polygon2");

//polygon area
print("polygon area is: ", polygon1.area());
//polygon bounds
print("polygon bounds is: ", polygon1.bounds());
//polygon center point
print("polygon centroid is: ", polygon1.centroid());
//polygon coordinates
print("polygon coordinates is: ", polygon1.coordinates());

//check intersects
print("polygon1 and polygon2 is intersects ?", polygon1.intersects(polygon2));
var intersec = polygon1.intersection(polygon2);
Map.addLayer(intersec, {}, "intersec");

//outer 2000m
var bufferPolygon1 = polygon1.buffer(2000);
Map.addLayer(bufferPolygon1, {color:"ff00ff"}, "bufferPolygon1");
//innner 2000m
var bufferPolygon2 = polygon1.buffer(-2000);
Map.addLayer(bufferPolygon2, {color:"00ffff"}, "bufferPolygon2");

//difference
var differ = bufferPolygon1.difference(bufferPolygon2);
Map.addLayer(differ, {color:"green"}, "differ");

矢量数据Feature

  • Demo 2:创建矢量数据,区别于几何图形,可以添加属性property。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var polygon = /* color: #d63000 */ee.Geometry.Polygon(
[[[116.18363255709164, 39.73608336682765],
[116.62857884615414, 39.75297820506206],
[116.60660618990414, 40.08580181855619],
[116.15067357271664, 40.077395868796174]]]);

var feature = ee.Feature(polygon, {year: 2019, count: 100});
Map.centerObject(feature, 9);

//add property
feature = feature.set("desc", "polygon");
print("new feature", feature);
print("feature area", feature.area());
print("feature year", feature.get("year"));

Map.addLayer(feature, {color: "red"}, "feature");

var outterBuffer = feature.buffer(1000);
var innerBuffer = feature.buffer(-1000);
var differ = outterBuffer.difference(innerBuffer);
Map.addLayer(differ, {color: "green"}, "differ");

矢量数据集FeatureCollection

地图加载显示FeatureCollection

  • Demo 3:加载矢量数据集,添加中国台湾,显示到新的Layer中。
1
2
3
4
5
6
7
8
//Large Scale International Boundary Lines (LSIB)
var fCol = ee.FeatureCollection("USDOS/LSIB/2013");
var roi = /* color: #bf04c2 */ee.Geometry.Point([120.92596957445573, 23.827835588423437]);
var sCol = fCol.filterBounds(roi);
print("select sCol", sCol);

Map.centerObject(roi, 9);
Map.addLayer(sCol, {color: "red"}, "roi");
  • Demo 4:功能和上面一致,区别一个有颜色填充,一个没有填充(仅边框)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Large Scale International Boundary Lines (LSIB)
var fCol = ee.FeatureCollection("USDOS/LSIB/2013");
var roi = /* color: #bf04c2 */ee.Geometry.Point([120.92596957445573, 23.827835588423437]);
var sCol = fCol.filterBounds(roi);
print("select sCol", sCol);

Map.centerObject(roi, 6);
var empty = ee.Image().toByte();
var outline = ee.Image()
.toByte()
.paint({
featureCollection:sCol,
color:0,
width:3
});
Map.addLayer(outline, {palette: "ff0000"}, "outline");

FeatureCollection的reduce计算

  • Demo 5:按照列名称提取对应列名称(未理解)
1
2
3
4
5
6
7
8
//Large Scale International Boundary Lines (LSIB)
var fCol = ee.FeatureCollection("USDOS/LSIB/2013");

var sCol = fCol.limit(100);
print("select sCol", sCol);
var result = sCol.reduceColumns(ee.Reducer.toList(), ["system:index"])
.get("list");
print(result);
  • Demo 6:将矢量文件转为栅格文件(单波段)。
1
2
3
4
5
6
7
8
9
10
11
var counties = ee.FeatureCollection("ft:1S4EB6319wWW2sWQDPhDvmSBIVrD3iEmCLYB7nMM");
var properties = ['Census 2000 Population'];
var image = counties
.filter(ee.Filter.neq('Census 2000 Population', null))
.reduceToImage({
properties: properties,
reducer: ee.Reducer.mean()
});
print("generate image", image);
Map.setCenter(-99.976, 40.38, 5);
Map.addLayer(image, {min:1000, max:100000, palette: ["green", "blue", "red"]});

合并FeatureCollection数据集

  • Demo 7:merge功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var fCol1 = ee.FeatureCollection([
ee.Feature(null, {count: 1}),
ee.Feature(null, {count: 2}),
ee.Feature(null, {count: 3})
]);

var fCol2 = ee.FeatureCollection([
ee.Feature(null, {count: 11}),
ee.Feature(null, {count: 21}),
ee.Feature(null, {count: 31})
]);

var fCol3 = fCol1.merge(fCol2);
print("fCol3", fCol3);

遍历循环

  • Demo 8:evaluate、iterate、map(未理解)。
1
2
3
4
5
6
7
8
9
10
11
12
//Large Scale International Boundary Lines (LSIB)
var fCol = ee.FeatureCollection("USDOS/LSIB/2013");

var sCol = fCol.limit(10);
print("pre sCol", sCol);

sCol = sCol.map(function(feature) {
var area = feature.area();
feature = feature.set("area", area);
return feature;
});
print("add area properties", sCol);

栅格数据

本部分全部Demo来源于知乎专栏《GEE开发》,作者:无形的风

影像数据Image

导入影像

  • Demo 1:导入Landsat 8卫星的数据,显示波段名称(B1、B2……)、数据类型(Float)、生成日期、编号ID、云量信息。
1
2
3
4
5
6
7
8
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
print("image", image);

print("image bandNames", image.bandNames());
print("image bandTypes", image.bandTypes());
print("image date", image.date());
print("image id", image.id());
print("cloud cover", image.get("CLOUD_COVER"));

显示影像

  • Demo 2:选择,并显示遥感影像。
1
2
3
4
5
6
7
8
9
Map.setOptions("SATELLITE"); // 设置背景地图为地球栅格数据
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
Map.centerObject(image, 7);
var visParam = {
min: 0,
max: 0.3,
bands: ["B4", "B3", "B2"]
};
Map.addLayer(image, visParam, "rawIamge");

影像数学运算

  • Demo 3:常规数学运算,例如add、subtract、divide、multiply、sin等等。示例为计算NDVI指数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Map.setOptions("SATELLITE");
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
Map.centerObject(image, 7);

var b4 = image.select("B4");
var b5 = image.select("B5");
var ndvi = b5.subtract(b4).divide(b5.add(b4));
var visParam = {
min: -0.2,
max: 0.8,
palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
'3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
Map.addLayer(ndvi, visParam, "ndvi");
  • Demo 4:归一化NormalizedDifference运算。
1
2
3
4
5
6
7
8
9
10
11
12
Map.setOptions("SATELLITE");
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
Map.centerObject(image, 7);

var ndvi = image.normalizedDifference(["B5", "B4"]);
var visParam = {
min: -0.2,
max: 0.8,
palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
'3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
Map.addLayer(ndvi, visParam, "ndvi");
  • Demo 5:Expression运算,方便结合公式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Map.setOptions("SATELLITE");
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
Map.centerObject(image, 7);

var visParam = {
min: -0.2,
max: 0.8,
palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
'3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
var EVI = image.expression(
'2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
'NIR': image.select('B5'),
'RED': image.select('B4'),
'BLUE': image.select('B2')
});
Map.addLayer(EVI, visParam, "EVI");
Map.centerObject(image, 6);

影像Reduce计算

  • Demo 6:普通的reduceRegion计算,提取ROI范围内的数值,如平均NDVI等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//reduce image to single value
var roi = /* color: #98ff00 */ee.Geometry.Polygon(
[[[114.62959747314449, 33.357067677774594],
[114.63097076416011, 33.32896028884253],
[114.68315582275386, 33.33125510961763],
[114.68178253173824, 33.359361757948754]]]);
Map.centerObject(roi, 7);
Map.setOptions("SATELLITE");
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
var ndvi = image.normalizedDifference(["B5", "B4"]).rename("NDVI");
var visParam = {
min: -0.2,
max: 0.8,
palette: ["FFFFFF", "CE7E45", "DF923D", "F1B555", "FCD163",
"99B718", "74A901", "66A000", "529400", "3E8601",
"207401", "056201", "004C00", "023B01", "012E01",
"011D01", "011301"]
};
Map.addLayer(ndvi, visParam, "NDVI");
Map.addLayer(roi, {color: "red"}, "roi");

var mean = ndvi.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
print("reduceRegion value is: ", mean);
var ndviValue = ee.Number(mean.get("NDVI"));
print("ndvi mean is: ", ndviValue);
  • Demo 7:栅格数据转矢量数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//reduceToVectors
var roi = /* color: #999900 */ee.Geometry.Polygon(
[[[116.21437502022764, 39.62355024325724],
[116.82960939522764, 39.75881346356145],
[116.75270509835264, 40.213367999414956],
[115.97816896554014, 40.17140672221596]]]);
Map.centerObject(roi, 8);
var image = ee.Image("NOAA/DMSP-OLS/NIGHTTIME_LIGHTS/F182012")
.select("stable_lights")
.clip(roi);

var mask = image.gt(30).add(image.gt(60));
mask = mask.updateMask(mask);
mask = mask.addBands(image);
print("mask", mask);

var vectors = mask.reduceToVectors({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 1000,
geometryType: "polygon",
maxPixels: 1e13
});

print("vectors", vectors);

Map.addLayer(mask.select("stable_lights"), {min:1, max:2, palette: ["red", "green"]}, "image");

var display = ee.Image()
.toByte()
.paint({
featureCollection: vectors,
color: null,
width: 1
});
Map.addLayer(display, {palette: "blue"}, "display");

影像数据集合ImageCollection

影像的过滤筛选

  1. filter:根据传递的ee.Filter过滤。
  2. filterBounds:根据提供的矢量数据过滤,即给定影像的Geometry范围。
  3. filterDate:根据提供的日期过滤,如filterDate(“2019-1-1”, “2020-1-1”),左闭右开。
  4. filterMetadata:根据属性值过滤。

地图加载显示

  • Demo 8:加载显示ImageCollection。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var roi = /* color: #98ff00 */ee.Geometry.Polygon(
[[[114.62959747314449, 33.357067677774594],
[114.63097076416011, 33.32896028884253],
[114.68315582275386, 33.33125510961763],
[114.68178253173824, 33.359361757948754]]]);
Map.centerObject(roi, 7);
Map.setOptions("SATELLITE");

var l8Col = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(roi)
.filterDate("2018-1-1", "2019-1-1");

var visParam = {
min: 0,
max: 0.3,
bands: ["B4", "B3", "B2"]
};
Map.addLayer(l8Col, visParam, "image");
Map.addLayer(roi, {color: "red"}, "roi");

地图循环遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var roi = /* color: #98ff00 */ee.Geometry.Polygon(
[[[114.62959747314449, 33.357067677774594],
[114.63097076416011, 33.32896028884253],
[114.68315582275386, 33.33125510961763],
[114.68178253173824, 33.359361757948754]]]);
Map.centerObject(roi, 7);
Map.setOptions("SATELLITE");

var l8Col = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(roi)
.filterDate("2018-1-1", "2019-1-1")
.map(ee.Algorithms.Landsat.simpleCloudScore)
.map(function(image) {
return image.updateMask(image.select("cloud").lte(20));
})
.map(function(image) {
var ndvi = image.normalizedDifference(["B5", "B4"]).rename("NDVI");
return image.addBands(ndvi);
})
.select("NDVI");

var visParam = {
min: -0.2,
max: 0.8,
palette: ["FFFFFF", "CE7E45", "DF923D", "F1B555", "FCD163",
"99B718", "74A901", "66A000", "529400", "3E8601",
"207401", "056201", "004C00", "023B01", "012E01",
"011D01", "011301"]
};
Map.addLayer(l8Col.median(), visParam, "NDVI");
Map.addLayer(roi, {color: "red"}, "roi");

Reduce相关计算

  • Demo 10:Reduce相关计算(未理解)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var roi = /* color: #98ff00 */ee.Geometry.Polygon(
[[[114.62959747314449, 33.357067677774594],
[114.63097076416011, 33.32896028884253],
[114.68315582275386, 33.33125510961763],
[114.68178253173824, 33.359361757948754]]]);
Map.centerObject(roi, 7);
Map.setOptions("SATELLITE");

var l8Col = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(roi)
.filterDate("2018-1-1", "2019-1-1")
.map(ee.Algorithms.Landsat.simpleCloudScore)
.map(function(image) {
return image.updateMask(image.select("cloud").lte(20));
})
.map(function(image) {
var ndvi = image.normalizedDifference(["B5", "B4"]).rename("NDVI");
return image.addBands(ndvi);
})
.select("NDVI");

var visParam = {
min: -0.2,
max: 0.8,
palette: ["FFFFFF", "CE7E45", "DF923D", "F1B555", "FCD163",
"99B718", "74A901", "66A000", "529400", "3E8601",
"207401", "056201", "004C00", "023B01", "012E01",
"011D01", "011301"]
};
Map.addLayer(l8Col.median(), visParam, "NDVI");
Map.addLayer(roi, {color: "red"}, "roi");

var indexs = l8Col.reduceColumns(ee.Reducer.toList(), ["system:index"])
.get("list");
print("indexs", indexs);

高程数据