谷歌地球引擎ee。图像格式单网格图像处理

  本文主要对GEE中的ee.Image格式数据图层基本处理操作加以介绍。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第十篇,更多GEE文章请参考专栏:GEE学习与应用_疯狂学习GIS的博客-CSDN博客。

  首先,导入第九篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE中JavaScript脚本语言代码基础规则与函数语句_疯狂学习GIS的博客-CSDN博客)中提及的遥感影像:

var landsat_5=ee.Image("LANDSAT/LT05/C01/T1_TOA/LT05_123032_20100605");

  这里需要注意:在第九篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE中JavaScript脚本语言代码基础规则与函数语句_疯狂学习GIS的博客-CSDN博客)中也提到了,通过上述代码导入的这一景遥感影像是成像时间为2010年06月05日、Path与Row号分别为123与032(覆盖北京市)的Landsat 5 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品;其成像时间是一个确定的值,因此是一景图像,此即ee.Image格式的数据。而若是导入很多景图像——例如将上述代码括号中的内容改为"LANDSAT/LT05/C01/T1_TOA",那么所导入的遥感影像就成了不限制成像时间的、全球的Landsat 5 Collection 1 Tier 1大气表观反射率TOA Reflectance产品,即从Landsat 5卫星从升空成像一直到退役这个时间范围内的影像全部包括在内;因此在全球任意一个空间范围内,所导入的遥感影像都是很多时相所对应的很多景图像,相当于是好几景图像重叠、叠合在一起,此即ee.ImageCollection格式的数据。关于ee.ImageCollection格式数据的基本处理操作,我们将会在后期的博客中进行介绍。

  在第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中,我们介绍了在Map.addLayer()函数中对图层可视化参数进行配置的方法:

Map.setCenter(116.36863, 39.961029,10);
Map.addLayer(landsat_5,{bands:["B4","B3","B2"]},"LANDSAT5");

  而上述代码有一个问题——我们必须按照一定顺序填写Map.addLayer()函数的参数,不能跳过。例如,如果在Map.addLayer()函数中,我们不想配置{bands:["B4","B3","B2"]}这个可视化参数,但还需要配置"LANDSAT5"这个地图中所显示图层名称的参数,那么就需要将可视化参数部分用{}留空。即以上代码就需要改为:

Map.addLayer(landsat_5,{},"LANDSAT5");

  针对这种情况,我们可以引入参数名称,将Map.addLayer()函数的参数修改为字典的形式,这样就可以消除函数参数顺序的问题。不过这里要注意:不要忘记字典前后需要有大括号{}包围哦。

Map.addLayer({visParams:{bands:["B4","B3","B2"]},eeObject:landsat_5,name:"LANDSAT5_New"});

  其中,visParams、eeObject、name就是Map.addLayer()函数的参数名称。函数的参数名称可以在编辑栏编写代码时,按下GEE快捷键Ctrl+Space实现获取(有点类似于代码提示的功能);而在Windows系统中,由于这一对快捷键同时是Windows输入法中切换中英文输入的快捷键,因此由于快捷键冲突导致GEE中无快捷键Ctrl+Space实现获取参数名称。针对这一问题,我个人比较习惯直接搜索对应的函数,在GEE官方文档中查看相关函数的详细解释,如下图所示。

  执行代码,可以看到这种基于字典形式的参数输入方式与第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中采用的参数输入方式效果是一致的。

  此外,第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中还介绍了将全部可视化参数首先存储于一个独立的参数中,随后在Map.addLayer()函数中调用这一独立参数的方法;这一点本文就不再赘述。

  在第九篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE中JavaScript脚本语言代码基础规则与函数语句_疯狂学习GIS的博客-CSDN博客)中,我们通过Map.setCenter()函数,将交互式地图的显示位置自动定位到北京师范大学附近的位置;与此同时,Landsat 5遥感影像的覆盖范围非常广泛,而上述自动定位的范围则比较小,因此可以通过ROI对遥感影像显示区域加以限制。

Map.setCenter(116.36863, 39.961029,13);
//Map.addLayer(landsat_5,{bands:["B4","B3","B2"]},"LANDSAT5");
var roi=ee.Geometry.Point([116.36863, 39.961029]).buffer(2000);
Map.addLayer(roi);
Map.addLayer({visParams:{bands:["B4","B3","B2"]},eeObject:landsat_5.clip(roi),name:"LANDSAT5_New"});

  其中,首先基于ee.Geometry.Point()函数,通过一个给定的经、纬度,确定一个点类型的矢量要素,随后通过.buffer()函数构建缓冲区,作为ROI;并将ROI与经过.clip()函数裁剪后的遥感影像分别在地图中显示。其中,.buffer()函数的详细介绍请参考第八篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE直方图与时间序列多波段折线图绘制与可视化参数调整_疯狂学习GIS的博客-CSDN博客_gee直方图);.clip()函数的详细介绍请参考第三篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE矢量数据裁剪栅格数据_疯狂学习GIS的博客-CSDN博客)。

Google Earth引擎JavaScript代码规则和函数

  本文主要对GEE中的JavaScript代码基础规则与语句、函数等加以介绍。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第九篇,更多GEE文章请参考专栏:GEE学习与应用_疯狂学习GIS的博客-CSDN博客。

  在前面的八篇GEE教学博客中,我们对GEE的基本与主要操作加以了详细介绍与应用实践;通过前八篇文章,我们初步了解了GEE的简单规则与应用。有了初步的了解,我们便可以开始更为深入地学习;因此,从本篇教学博客开始,我们就将对GEE的代码细节与实际应用加以进一步的、更为广泛且细致的介绍与实践。那么,本文先从前面几篇教学博客没有提及的JavaScript语言代码基础规则与语句、函数等入手,进行细致梳理。

1 JavaScript代码基础规则

  本部分介绍JavaScript代码的基础规则。其中,以下每一条为一个规则

  • 每一行代码都需要以分号;结尾:

var my_age=18;

  • 利用关键词var创造新变量:

var my_age=18;

  • 利用括号()传递函数的参数:

print("My name is GIS");

  • 文本等String格式数据以单引号''或双引号""作为起止符号:

var string_data="My name is GIS";

  • List格式数据以方括号[]作为起止符号:

var list_data=["my","name","is","GEE"];

  • List格式数据初始下标为0。
  • 方括号[]可以用来通过key值获取字典的value值:

print(dict_data["Name"]);

  • 点符号.亦可以用来通过key值获取字典的value值:

print(dict_data.Name);

  • 字典格式数据通过大括号{}进行定义:

var dict_data={"Name":"GIS","Age":"18","Home":"Henan"};

  • 两个正斜杠//可以作为注释的开始:

var my_name="GIS";//Define my name.

  • 多行内容注释可以用/`作为开始,用`/作为结束:

var my_name="GIS";
/*
Here
is
a
multi-line
comments
*/

2 JavaScript代码基础函数与语句

  本部分介绍JavaScript代码的基础函数与语句。其中,以下每一段为一个方面的函数或语句

  在第六篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格代数与NDVI波段计算手动求取_疯狂学习GIS的博客-CSDN博客_gee波段计算)中,我们运用了.subtract()函数表示波段之间进行相减的操作;而若参与运算的参数均为常数(即参数不含图像),我们还可以直接通过数学符号进行运算:

print(3-2);

  我们可以在print()函数中,增加用单引号或双引号表示的字符串格式的内容,从而对即将打印的内容加以描述:

print("Subtracting two from three equals:",3-2);

  对于一些常用的操作步骤,我们可以将其封装至一个函数中,从而提升代码运行效率。例如以下两个函数,我们分别首先对其加以定义,随后通过print()函数加以调用:

var hello=function(string){
return "Hello "+string+"!";
};

print(hello("GISer"));

var my_add=function(a){
return a+7;
};

var b=100;
print(b+" plus 7 is:"+my_add(b));

  在第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中,我们通过搜索的方式导入了GEE内置的遥感影像数据与各类矢量数据;而在实际应用中,我们往往通过代码调用的方式导入需要的数据。例如,通过如下代码导入Landsat 5 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品;其中,Path与Row号分别为123与032(覆盖北京市),成像时间为2010年06月05日。

var landsat_5=ee.Image("LANDSAT/LT05/C01/T1_TOA/LT05_123032_20100605");

  导入数据完毕后,我们可以通过Map.setCenter()函数,将交互式地图的显示位置自动定位到指定的位置。其中,前两个参数为指定点的经度与纬度,地图将以这个点为中心进行定位;第三个参数为地图的缩放比例系数,其数值越大表示缩放的精度越高——一般的,缩放比例系数为1时即为全球视野,为5时即为大洲视野,为10时即为城市视野,为15时即为街道视野,为20时则为建筑物视野。例如,将缩放比例系数固定为17,执行如下代码,就可以看到新街口外大街与西侧的北京师范大学。

Map.setCenter(116.36863, 39.961029,17);
//Map.addLayer(landsat_5,{},"LANDSAT5");

谷歌地球引擎GEE网格代数和波段计算NDVI计算

  本文主要对GEE中的栅格代数与波段计算操作加以介绍。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第六篇,更多GEE文章请参考专栏:GEE学习与应用_疯狂学习GIS的博客-CSDN博客。

  首先,依据第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中内容,我们将Landsat 8 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品导入GEE,并对其做好重命名。接下来,同样依据第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中内容,将Landsat 8 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品按照时间进行选取(具体时间范围大家任意选择即可),并求取对应时间范围内的平均值;同时,将经过上述操作后的图层在地图中加以显示。

var landsat_202006=landsat_8.filterDate('2020-06-01','2020-06-30').mean();
Map.addLayer(landsat_202006,{},"Landsat");

  接下来,我们就开始栅格计算。在第五篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE多图层像元条件筛选与掩膜处理_疯狂学习GIS的博客-CSDN博客)中,我们利用normalizedDifference()函数计算了NDVI图层;而在本文中,我们则尝试手动进行波段运算的方式计算NDVI图层,具体代码如下。其中,.select()表示从遥感影像中选择对应的波段,.subtract()函数表示波段之间进行相减的操作;同理,.add()函数表示相加操作,.divide()表示相除操作。

var band_4=landsat_202006.select('B4');
var band_5=landsat_202006.select('B5');
var numerator=band_5.subtract(band_4);
var denominator=band_5.add(band_4);
var NDVI=numerator.divide(denominator);
Map.addLayer(NDVI,{},"NDVI");

  运行上述代码,可以看到NDVI图层已经生成。

  这里还有一点需要注意:在对最原始的Landsat 8 Collection 1 Tier 1大气表观反射率TOA Reflectance产品(数据类型为ee.ImageCollection)按照时间进行选取并求取对应时间范围内的平均值后(数据类型为ee.Image),遥感影像各波段才可以参与计算。也就是说,.subtract()等这些波段运算函数仅对于ee.Image数据有效;而若是ee.ImageCollection等数据类型需要参与波段计算,还需要映射等其它操作。

  此外,我们还可以按照第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中方法,对NDVI图层加以手动可视化配置,并将配置嵌入到代码中,从而实现每一次代码运行得到的NDVI图层可视化设置都是一致的。

  具体代码如下:

Map.addLayer(NDVI,{min:[-0.2111],max:[0.6778],palette:["ff2a08","fff810","56ff10","1889ff","e510ff"]},"NDVI");

  运行后可以看到NDVI图层已经具有默认的可视化配置了~

谷歌地球引擎GEE有条件地过滤和屏蔽像素

  本文主要对GEE中的栅格图层像元条件筛选与掩膜操作加以介绍。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第五篇,更多GEE文章请参考专栏:GEE学习与应用_疯狂学习GIS的博客-CSDN博客。

  首先,依据第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中内容,我们将Landsat 8 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品与GMTED2010数据导入GEE;并对二者做好重命名。

  接下来,同样依据第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中内容,将Landsat 8 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品按照时间进行选取(具体时间范围大家任意选择即可),并求取对应时间范围内的平均值;同时,将DEM图层在地图中加以显示。

var landsat_2020=landsat_8.filterDate('2020-5-1','2020-5-31').mean();
Map.addLayer(dem,{},"DEM");

  接下来,依据第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中内容,将DEM图层可视化参数中的拉伸选项进行设置,并在得到合适的结果后将图层像元值的范围嵌入代码中。

Map.addLayer(dem,{min:[-811.28],max:[1238.4]},"DEM");

  随后执行代码,即可看到每次运行后DEM图层的可视化参数配置都是一致的。

  接下来,就进行图层像元筛选的操作。在GEE中,我们可以直接通过.gt()(大于)、.lt()(小于)、.gte()(大于等于)等函数,对像元数值加以关系判别并选取。例如,通过dem.gt(1800),我们就可以筛选出像素数值大于1800的DEM像元。

var top_pixel=dem.gt(1800);
Map.addLayer(top_pixel,{},"Top");

  执行代码,可以看到海拔较高(即大于1800m)地区像元显示为白色,其它地区显示为黑色。

  我们还可以对筛选后的像元加以掩膜,从而将不满足筛选条件的像元直接删除,在地图中不显示。其中,这里还用到了第四篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE栅格数据图层可视化设置代码嵌入_疯狂学习GIS的博客-CSDN博客_栅格数据可视化)中调整单波段栅格图像的可视化palette参数的内容。

var top_mask=top_pixel.mask(top_pixel)
Map.addLayer(top_mask,{palette:["63ff14"]},"Top_mask");

  执行代码,可以看到海拔较高区域像元被筛选出并以彩色显示,而其它地区像元则不再显示。

  接下来,我们利用normalizedDifference()函数计算一下NDVI,并对NDVI图层加以更进一步的像素筛选操作。关于GEE中NDVI的计算我们在后期的教学博客中会详细讲解,这里暂时不具体介绍。

var NDVI=landsat_2020.normalizedDifference(["B5","B4"]);
Map.addLayer(NDVI,{},"NDVI");

  依据与前述内容一致的方法,首先手动调整NDVI图层的可视化参数。

  找到合适的参数配置后,将其嵌入代码中。

var NDVI=landsat_2020.normalizedDifference(["B5","B4"]);
Map.addLayer(NDVI,{min:[-0.2098],max:[0.5692],palette:["ff3d6a","645aff","b1ff80","fff687"]},"NDVI");

  再依据同样的像素筛选与掩膜代码,对NDVI图层加以处理:

var high_NDVI=NDVI.gt(0.45);
var high_NDVI_mask=high_NDVI.mask(high_NDVI);
Map.addLayer(NDVI,{min:[-0.2098],max:[0.5692],palette:["ff3d6a","645aff","b1ff80","fff687"]},"NDVI");
Map.addLayer(high_NDVI_mask,{palette:["000000"]},"High_NDVI");

  其中,"000000"表示黑色。执行代码可以看到,大于0.45的NDVI被显示为黑色,其余地区则依旧显示为彩色。

  接下来,我们尝试对同一个图层进行两个限定条件的筛选。两个限定条件其实也很简单,直接在第一个筛选条件后用.and()函数跟随第二个限定条件即可。

var middle_NDVI=NDVI.gt(-0.5).and(NDVI.lt(0.5));
var middle_NDVI_mask=middle_NDVI.mask(middle_NDVI);
Map.addLayer(NDVI,{min:[-0.2098],max:[0.5692],palette:["ff3d6a","645aff","b1ff80","fff687"]},"NDVI");
Map.addLayer(middle_NDVI_mask,{palette:["000000"]},"Middle_NDVI");

  执行代码,即可将大于-0.5而小于0.5的NDVI区域加以筛选。

  同样的,我们还可以同时对多个不同的图层加以像素筛选。依旧是利用.and()函数,在对第一个图层的限定条件后跟随对第二个图层的限定条件即可。

var middle_NDVI=NDVI.gt(-0.5).and(NDVI.lt(0.5));
var middle_NDVI_mask=middle_NDVI.mask(middle_NDVI);
Map.addLayer(NDVI,{min:[-0.2098],max:[0.5692],palette:["ff3d6a","645aff","b1ff80","fff687"]},"NDVI");
//Map.addLayer(middle_NDVI_mask,{palette:["000000"]},"Middle_NDVI");
var across_image=NDVI.gt(0.45).and(dem.lt(1500));
var across_image_mask=across_image.mask(across_image);
Map.addLayer(across_image_mask,{palette:["000000"]},"Across_image");

  执行代码,黑色区域即为NDVI大于0.45且海拔低于1500m的区域,完成筛选。

Google Earth引擎GEE网格层可视化代码嵌入操作

  本文主要对GEE中的数据图层可视化代码嵌入操作加以介绍。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第四篇,更多GEE文章请参考专栏:GEE学习与应用_疯狂学习GIS的博客-CSDN博客。

  可视化代码嵌入,即将图层可视化选项在代码中直接配置,不需要手动进行数据可视化的调整;同时可以保证每一次运行代码,图层可视化结果都是我们所设定的配置,而不是GEE默认的配置。

  首先,依据第二篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE数据导入后筛选并显示_疯狂学习GIS的博客-CSDN博客)中内容,我们将Landsat 8 Collection 1 Tier 1的大气表观反射率TOA Reflectance产品导入GEE;同时依据第三篇GEE教学博客(Google Earth Engine谷歌地球引擎GEE矢量数据裁剪栅格数据_疯狂学习GIS的博客-CSDN博客)中内容,我们将美国人口普查局United States Census Bureau)的2018年主要合法边界划分数据TIGER: US Census Counties 2018导入GEE;并对二者做好重命名。

  接下来,我们基于第二篇GEE教学博客与第三篇GEE教学博客中内容,对刚刚导入的数据加以时间筛选、平均值合成、空间区域裁剪等,同时将图层导入到地图中。

var landsat_8_202007_USA=landsat_8.filterDate('2020-07-01','2020-07-31').mean().clip(county);
Map.addLayer(landsat_8_202007_USA,{},'USA_Landsat');

  所得结果如下图所示。这里需要注意,下图最后一句代码忘记加分号了。

  可以看到,上图中的栅格图层是黑、白、灰色系的,我们可以在代码中对其波段配色方案加以调整。在Map.addLayer()函数中的第二个参数位置,按照如下方式进行配置;而其它两个参数,通过之前的教学文章我们已经知道其分别代表具体图层图层显示在地图中时的名称

Map.addLayer(landsat_8_202007_USA,{bands:['B4','B3','B2']},'USA_Landsat');

  此时可以看到,地图中图层依然是灰白色系,这是由于我们没有调整其拉伸情况,导致眼睛看上去彩色并不明显导致的。在地图右上角的“Layers”勾选框中,我们首先对拉伸情况加以调整。此时我们还可以看到,图像的RGB波段通过我们所输入的代码已经有了自动的更新。

  在这里,我们配置好图像的拉伸情况,一开始先随意选择一种拉伸即可。

  查看地图,可以看到拉伸后的图层相对而言真彩色已经较为明显。但是依然不是很突出,我们可以继续修改拉伸的程度。

  提升拉伸程度,可以看到图层真彩色已经较为明显。

  我们就选择这种方式,记录此时图像的像素范围,并将其按照如下方式嵌入到代码中:

Map.addLayer(landsat_8_202007_USA,{bands:['B4','B3','B2'],min:[-0.0152],max:[0.4054]},'USA_Landsat');

  下图中的红色即为图像像素范围所在的位置。

  执行代码可以发现,图层的可视化配置在每一次代码执行后都会自动形成,不需要我们手动在地图的右上角“Layers”处加以操作了。

  以上是多波段栅格数据的可视化代码,接下来我们再以单波段灰度图像进行操作。在GEE搜索框中输入terrain,选择GMTED2010:Global Multi-resolution Terrain Elevation Data 2010数据,将其导入地图中并将这一变量重命名。我们以这一DEM单波段栅格图层为例加以介绍。

  将这一图层在地图中显示,并将地图中的图层名称显示为DEM;其中,{}表示可视化参数这里暂时不放入任何内容。

Map.addLayer(DEM,{},"DEM");

  可以看到,这一DEM图层的默认可视化情况呈现出无法较好分辨的灰白图像。我们首先在地图图层中调整其拉伸参数,同样也是随意设置一个拉伸即可。

  调整完毕后,将对应的像素取值范围放入代码中:

Map.addLayer(DEM,{min:[-770.68],max:[1304.73]},"DEM");

  执行代码,可以看到每次执行代码后图层的可视化情况都同样固定为我们所设定的样式。

  此外,我们还可以在代码中嵌入单波段栅格图像的“Palette”信息。首先依然是在“Layers”中手动设定其Palette信息。

  需要注意,设定其Palette信息时,最好同时调整拉伸的设置,从而找到一个较为合适的“Palette”设置与拉伸设置组合。

  随后,首先将Palette中的设置放入代码。点击下图所示按钮。

  复制得到的16进制颜色代码。

  将其放入Map.addLayer()函数中第二个参数(可视化参数)中。

  同时记得按照调整后的拉伸设置修改min与max的值。

Map.addLayer(DEM,{min:[-251.82],max:[785.88],palette:["63ff14","41f6ff","5f37ff","e033ff","ff3f7d"]},"DEM");

  随后执行代码,可以看到每次运行代码,得到的DEM图层都是较易分辨的彩色图层。

  同时,我们还可以采用如下的方法,即将Map.addLayer()函数中第二个参数(可视化参数)首先存储为一个变量,随后执行Map.addLayer()函数时,将这一变量放到第二个参数的位置即可。

var dem_vis={
min:[-251.82],
max:[785.88],
palette:["63ff14","41f6ff","5f37ff","e033ff","ff3f7d"]
}
Map.addLayer(DEM,dem_vis,"DEM");

  执行上述代码,可以看到当前效果与前述内容的效果一致。