重要概念
1、地图
Google earth engine中地图(map)主要是指显示影像栅格数据、矢量数据,是编辑器中的地图展示区
彩色合成
三波段彩色合成显示一幅Landsat影像。
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");
-
第一行,设置默认地图显示样式为卫星底图
-
第二行,加载默认的单张影像
-
第三行,设置显示地图以image的边界为中心,缩放级别是7
-
第四~九行,映射影像到map显示区,加载使用的是addLayer()方法
2、影像
遥感学中影像主要是指卫星、航拍飞机或者无人机等飞行设备远距离拍摄的影像,存储格式有Geotiff、netCDF、或者HDF等。而在GEE中,程序在使用时通过GEE提供的Image API来调用。
在GEE中,用户不需要对整张影像的像素做“遍历”运算,而是在GEE内部实现对整幅影像的操作。这种操作方式与Python中的numpy库对整体Array的操作类似。
影像信息
-
影像的id
-
版本号
-
波段信息
-
属性信息
影像加载
以下代码通过print()输出了 影像的详细信息,同时选择性加载了两个波段影像 (B1、B2),还有就是加载了RGB波段影像数据
var image = ee.Image("LANDSAT/LC08/C01/T1_TOA/LC08_123037_20180611");
Map.centerObject(image, 7);
print(image);
Map.addLayer(image.select("B1"), {min:0, max:0.3}, "B1");
Map.addLayer(image.select("B2"), {min:0, max:0.3}, "B2");
Map.addLayer(image, {min:0, max:0.3, bands:["B4","B3","B2"]}, "RGB");
3、影像集合
4、矢量数据
几何图形类(geometry)、矢量数据类(feature)、矢量数据集合类(feature collection)
//定义点线面
var point = ee.Geometry.Point([116.387928, 40.00649]);//
var line = ee.Geometry.LineString(
[[116.3782558270866, 40.02023566292988],
[116.3782558270866, 39.9984096033757],
[116.41069982733075, 39.9984096033757],
[116.41069982733075, 40.02023566292988]]);
var polygon = ee.Geometry.Polygon(
[[[116.3782558270866, 40.02023566292988],
[116.3782558270866, 39.9984096033757],
[116.41069982733075, 39.9984096033757],
[116.41069982733075, 40.02023566292988]]]);
print("point", point);
print("line", line);
print("polygon", polygon);
Map.addLayer(polygon, {color: "green"}, "polygon");
//定义feature矢量数据;两种方式;
//1、自定义的方式f1,同时加载
//2、从矢量数据集合feature中获取的方式f2
var f1 = ee.Feature(point, {count:100});
print("feature 1", f1);
Map.addLayer(f1, {color: "blue"},'point');
var fCol = ee.FeatureCollection("users/landusers/province");
var f2 = ee.Feature(fCol.first());
print("feature 2", f2);
//使用fitter过滤方式取得指定区域的矢量数据集合同时将数据加载在地图上
var sCol = fCol.filterBounds(point);
print("featureCollection", sCol);
Map.addLayer(sCol, {color: "red"}, "province");
Map.centerObject(point, 12);
5、过滤筛选
从集合中筛选出符合条件的数据,在GEE中实现过滤的方法叫fitter
-
空间过滤
-
时间过滤
-
属性过滤
var roi = ee.Geometry.Point([116.387928, 40.00649]);
Map.centerObject(roi, 7);
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA");
var scol = l8.filterBounds(roi) //空间过滤
.filterDate("2017-4-1", "2017-6-1") //时间过滤
.filter(ee.Filter.lt("CLOUD_COVER", 5)); //属性过滤
print("scol", scol); //输出数据集合
6、数据整合
在GEE中按照时间、空间、波段、矩阵或者其他数据结构整合数据的方法。
ee.Reducer()这一大类指定了数据整合的方式。
Reducer是指将数据整合起来的某种简单的统计算法(min;max;avg;mean;),或者是对输入数据进行更为复杂的总结。
-
时间:imageCollection.reduce();
-
空间:image.reduceRegion();image.reduceNeighborhood();
-
波段:image.reduce();
-
Feature Collection的属性空间:Feature Collection.reduceColumns()或者以“aggregate_”开头的Feature Collection的方法。
实现NDVI 的计算
var roi = ee.Geometry.Polygon(
[[[114.62959747314449, 33.357067677774594],
[114.63097076416011, 33.32896028884253],
[114.68315582275386, 33.33125510961763],
[114.68178253173824, 33.359361757948754]]]);
Map.centerObject(roi, 9);
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"]
}; //计算NDVI
Map.addLayer(ndvi, visParam, "NDVI");
Map.addLayer(roi, {color: "red"}, "roi");
var mean = ndvi.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
//调用Image中的ReducerRegion方法计算roi区域内的NDVI均值,参数分别是Reducer均值计算器、
//Geometry计算区域roi、scale计算使用的分辨率为30m。
print("reduceRegion value is: ", mean);
7、循环遍历map
循环遍历是依次对列表或者集合中每一个元素做相同的处理,通常在其他编程语言中用for或者well来实现,同样在GEE中也可以使用这两种方式来做循环。但是由于GEE语言的特殊性,更推荐使用GEE原生的循环遍历方法map来做。
-
对整个影像集合中的每一景影像进行处理,先对每一景影像添加NDVI波段,然后筛选波段循环进行计算roi中NDVI均值,实现对每一景影像的操作,最后为影像增加了NDVI的属性。
var roi = ee.Geometry.Polygon(
[[[116.3782558270866, 40.02023566292988],
[116.3782558270866, 39.9984096033757],
[116.41069982733075, 39.9984096033757],
[116.41069982733075, 40.02023566292988]]]);
Map.addLayer(roi, {color: "red"}, "roi");
Map.centerObject(roi, 13);
var l8Col = ee.ImageCollection("LANDSAT/LC08/C01/T1_TOA")
.filterBounds(roi)
.filterDate("2018-1-1", "2018-6-1")
.map(function(image){
var ndvi = image.normalizedDifference(["B5", "B4"])
.rename("NDVI");
return image.addBands(ndvi);
}) //循环遍历,计算每一景影像中roi区域内的NDVI均值,并把这个均值赋给新的属性字段"ndvi"
.select("NDVI")
.map(function(image) {
var dict = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
var ndvi = ee.Number(dict.get("NDVI"));
image = image.set("ndvi", ndvi);
return image;
});
print("l8Col", l8Col);
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.first().clip(roi), visParam, "l8Col");
//使用first(),返回集合的第一个非空元素,即第一景影像
8、发布APP
9、存储空间
-
Google Driver
-
Google Assets
10、公共库
公共库是软件程序开发中的一个概念,具体指把通用的方法编写到一个或者多个文件中,这些公共的文件可以在所有的项目中以类库的方式进行调用,这就是公共库。
在GEE中定义公共库是将公共代码放置在一个单独文件内,使用exports作为导出定义,在调用库的地方使用require即可实现
公共库中计算NDVI代码
/**
* NDVI = (nir - red) / (nir + red)
* */
function l8NDVI(image) {
return image.addBands(image.normalizedDifference(["B5", "B4"]).rename("NDVI"));
}
exports.l8NDVI = l8NDVI;
公共库的主程序代码
var lib = require("users/wangweihappy0/myTrainingShare:training01/lib");
var geometry = /* color: #d63000 */ee.Geometry.Polygon(
[[[115.73063354492183, 38.0283609762046],
[115.83225708007808, 38.02727921876993],
[115.8336303710937, 38.09756022187834],
[115.73338012695308, 38.09539873615892]]]);
var l8NDVI = ee.ImageCollection("LANDSAT/LC08/C01/T1_RT_TOA")
.filterDate("2018-2-1", "2018-5-1")
.filterBounds(geometry)
.map(lib.l8NDVI)
.select("NDVI")
.mosaic()
.clip(geometry);
Map.centerObject(geometry, 11);
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'
};
print(l8NDVI);
Map.addLayer(l8NDVI, visParam, "NDVI");