谷歌地球引擎GEE:栅格数据集ee.ImageCollection操作方法

本文主要对GEEee.ImageCollection格式数据图层基本处理操作加以介绍。本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第十一篇,更多GEE 文章请参考专栏:GEE学习与应用

# 谷歌地球引擎GEE:栅格数据的导入、筛选与可视化中,我们通过搜索的方式导入了GEE内置的遥感影像数据与各类矢量数据;而在# 谷歌地球引擎GEE的JavaScript代码基础知识与用法中,我们通过代码的方式获取了Landsat 5 Collection 1 Tier 1 的大气表观反射率TOA Reflectance 产品。本文依然采用代码方式,获取Landsat 8 Collection 1 Tier 1 的初始影像Raw Scenes产品。

其中,依据# 谷歌地球引擎GEE:一景遥感影像ee.Image数据的基本处理方法中提及的ee.Geometry.Point()函数,设置一个点要素,作为后期研究区域的参照点(即获取能覆盖这一点要素的Landsat 8 遥感影像);同时依据# 谷歌地球引擎GEE:栅格数据的导入、筛选与可视化中提及的遥感影像时间筛选方法,对Landsat 8 遥感影像的时间段进行筛选。这里用到了两个之前教学博客中没有介绍的新函数------首先是.filterBounds()函数,作用为获取覆盖点要素point的遥感影像,即对遥感影像进行空间角度的筛选;其次是.sort()函数,作用为对ee.ImageCollection格式数据中的多层遥感影像按照一定规则进行排序。

ini 复制代码
var point=ee.Geometry.Point(116.36863, 39.961029);
var date_start=ee.Date("2020-05-01");
var date_end=ee.Date("2020-07-01");
var my_landsat=ee.ImageCollection("LANDSAT/LC08/C01/T1").filterBounds(point)
.filterDate(date_start,date_end).sort("CLOUD_COVER",true);
print(my_landsat);

在这里,"CLOUD_COVER"表示遥感影像的云覆盖量,true表示按照排序指标的升序进行排列------即对于ee.ImageCollection格式数据中多景遥感影像,基于云覆盖量由少至多的顺序进行排列。还有需要强调的一点是,"CLOUD_COVER"并不是遥感影像波段的名称,而属于影像的元数据,或者说是属性。

通过print()函数打印在右侧的信息,我们可以看到这个ee.ImageCollection格式数据中包含三个元素(即3 elements),也就是含有三景重叠的遥感影像。

我们可以通过.first()函数获取一个ee.ImageCollection格式数据中的第一景影像。在这里,由于前述代码实现了云覆盖量由少至多的顺序进行排列,因此第一景影像也就是云覆盖量最低的那一景影像。

ini 复制代码
var first_landsat=my_landsat.first();
print(first_landsat);

除了本文开头提及的按照一个点要素来筛选遥感影像,我们还可以按照LandsatPathRow分幅进行筛选。

ini 复制代码
//var point=ee.Geometry.Point(116.36863, 39.961029);
var date_start=ee.Date("2019-07-01");
var date_end=ee.Date("2020-06-01");
var my_landsat=ee.ImageCollection("LANDSAT/LC08/C01/T1")
.filter(ee.Filter.eq("WRS_PATH",123))
.filter(ee.Filter.eq("WRS_ROW",032))
.filterDate(date_start,date_end);
print(my_landsat);

其中,ee.Filter.eq()函数表示按照某种方式进行筛选,"WRS_PATH"参数表示按照遥感影像属性中的Path分幅作为筛选标准,123表示筛选出Path号为123的遥感影像。

筛选完后,我们可以将ee.ImageCollection格式数据中每一个要素的名称(即每一景遥感影像的名称)转为列表格式。

ini 复制代码
var list=my_landsat.toList(100);
print(list);

其中,.toList()函数作用是将原有数据(ee.ImageCollection格式数据中每一个要素的名称)转为列表,100表示从ee.ImageCollection格式数据中获取要素名称的最大个数(即最多从ee.ImageCollection格式数据中获取100个要素的名称存入列表),这一参数只要远大于ee.ImageCollection格式数据中的要素个数即可。

可以通过.length()函数获取列表数据的长度;这一长度也就是ee.ImageCollection格式数据中要素的个数。

ini 复制代码
var list_size=list.length();
print("The size of list is:",list_size);

此外,还可以对ee.ImageCollection格式数据执行.size()函数,同样可以获取其要素个数。

ini 复制代码
var image_count=my_landsat.size();
print("The size of image is:",image_count);

我们还可以对ee.ImageCollection格式数据的元数据(属性)进行获取。

scss 复制代码
print(my_landsat);

首先,打印一下ee.ImageCollection格式数据,可以看到其properties中包含了很多属性信息;接下来我们就以date_range为例进行操作。date_range表示ee.ImageCollection格式数据中,遥感影像成像的起止时间。

利用.get()函数就可以获取ee.ImageCollection格式数据的具体某一项属性。

ini 复制代码
var date_range=my_landsat.get("date_range");
print(date_range);

打印出的起止时间格式如下图所示。这种用一长串数字来表示时间的格式为Unix Epoch ,即Unix时间戳 ,其表示从1970年01月01 日00:00:00(GMT)开始以来的秒数;这里还需要注意,在JavaScript 中,Unix Epoch的单位是毫秒,若要换为秒需要进行换算。

我们还可以将起止时间转换为列表的形式。

ini 复制代码
var date_range_list=ee.List(date_range);
print(date_range_list);

执行代码,可以看到是否转换为列表对于起止时间的显示而言并没有很大区别。

Unix Epoch这种时间表示方法看起来不方便,我们可以将其转换为我们熟知的日期表示格式。

dart 复制代码
var date_range_ymd=ee.DateRange(date_range_list.get(0),date_range_list.get(1));
print("Date range is:",date_range_ymd);

其中,ee.DateRange()就是一个可以起到转换时间格式作用的函数;同时,分别用.get()函数获取起止时间的第一个和第二个元素;# 谷歌地球引擎GEE的JavaScript代码基础知识与用法已经介绍过,列表元素初始下标为0,因此分别用01来获取列表中的第一个和第二个元素。

起止时间转换后,我们可以看到2013年04月到2021年08月这个范围并不是前面我们用.filterDate(date_start,date_end)语句筛选后的日期,而是Landsat 8 卫星发射并投入使用后到目前的时间;因此我们可以知道,ee.ImageCollection格式数据中properties内的date_range属性指的是整个初始数据集Landsat 8 Collection 1 Tier 1 的初始影像Raw Scenes 产品)的起止时间,而不是经过筛选后(包括经过成像时间筛选与空间筛选后)得到的剩下几景遥感影像的起止时间。

还可以利用.aggregate_stats()函数统计ee.ImageCollection格式数据某一项属性的信息,其统计得到的信息包括ee.ImageCollection格式数据中,全部遥感影像的某一项属性值的极值、总和、平均值、标准差等。

ini 复制代码
var statistics=my_landsat.aggregate_stats("SUN_ELEVATION");
print(statistics);

此外,可以将.sort()函数与.first()函数一起执行,从而获取排序后,排在第一位的那一景遥感影像。

ini 复制代码
var least_cloud=my_landsat.sort("CLOUD_COVER",true).first();
print(least_cloud);

这里需要注意,执行上述代码后得到的是一景 遥感影像(即ee.Image格式的数据)。

同时,.sort()函数排序后,我们还可以获取排序前几位的遥感影像。

ini 复制代码
var recent_image=my_landsat.sort("system:time_start",false).limit(10);
print(recent_image);

其中,利用.limit()函数获取有限的遥感影像,10表示获取10景,即获取成像时间离目前最近的10景遥感影像。因此,执行这一代码后获取的是多景 遥感影像,即ee.ImageCollection格式的数据。

至此,大功告成。

相关推荐
蜗牛快跑21312 分钟前
面向对象编程 vs 函数式编程
前端·函数式编程·面向对象编程
Dread_lxy13 分钟前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
涔溪1 小时前
Ecmascript(ES)标准
前端·elasticsearch·ecmascript
榴莲千丞1 小时前
第8章利用CSS制作导航菜单
前端·css
奔跑草-1 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
羡与1 小时前
echarts-gl 3D柱状图配置
前端·javascript·echarts
guokanglun1 小时前
CSS样式实现3D效果
前端·css·3d
咔咔库奇2 小时前
ES6进阶知识一
前端·ecmascript·es6
前端郭德纲2 小时前
浏览器是加载ES6模块的?
javascript·算法
JerryXZR2 小时前
JavaScript核心编程 - 原型链 作用域 与 执行上下文
开发语言·javascript·原型模式