影像集合(Image Collection),说白了就是把一堆影像打包在一起形成的集合,我们可以用用前文讲过的矢量集合的方法来理解(http://t.csdnimg.cn/bRJOT),学习影像集合的过程中,同样需要掌握影像集合数据的定义、属性信息的访问、过滤筛选、以及区域统计等等。
接下来我们一个一个进行讲解
A.固定影像输出个数与获取影像大小
由于数据集合中往往存在数以千计的单张影像,在进行分析时,我们不一定能够用上所有的影像,因此限制影像的输出就显得必要,它可以减小云端内存的存储量。提升计算效率,我们在这里用上limit进行限制。
var L8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_TOA");
var Col1 = L8.limit(10);
print(Col1);
print(Col1.size());
此处我们使用Landsat8的大气层顶反射率数据集合进行案例示范,该数据包含多张影像,我们使用limit方法,重新建立了新的影像集合,改集合包含10张影像,因此结果输出的时候size的大小自然就是10啦。
B.过滤筛选
影像集合的过滤筛选主要包括时间过滤、属性过滤和空间过滤,我们来举个例子吧
//时间过滤
var L9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA");
var Col2 = L9.filterDate("2023-01-01","2023-01-02");
print(Col2);
//空间过滤
var roi = ee.Geometry.Polygon([[[-74.13240375034862,-48.93016861528302],
[-70.52888812534862,-47.61403250654011],
[-72.81404437534862,-46.29428986987951],
[-74.13240375034862,-48.93016861528302]]]);
Map.addLayer(roi,{"color":"red"},"roi");
var Col3 = L9.filterBounds(roi);
print(Col3);
//属性过滤
var Col4 = L9.filterMetadata("CLOUD_COVER","equals",10);
print(Col4);
//三种过滤的综合
var Col5 = L9.filterDate("2023-01-01","2023-01-30")
.filterBounds(roi)
.filterMetadata("CLOUD_COVER","less_than",20);
print(Col5);
var trueColor432Vis = {
min: 0.0,
max: 0.4,
bands:["B4","B3","B2"]
};
Map.addLayer(Col5.first(), trueColor432Vis, 'True Color (432)');
上面的代码展示了在影像集合数据中进行过滤的操作,主要用到的过滤操作方法有filterDate(时间)、filterBounds(空间)、filterMetadata(属性)。其中以属性过滤的方法参数较多,此处小编想筛选云层覆盖分数为10的L9影像。最终得到的结果如下:
C.遍历循环
影像集合与矢量集合一样,当我们需要对每一张影像进行同一个操作时,为了方便,就要用到循环了。举个例子,我们现在在亚马逊流域划定一块区域,期望利用L9数据计算经过该区域的每一张影像的NDVI均值,并将结果添加到原图像中。
//遍历循环
//研究区域定义
var roi1 = ee.Geometry.Polygon([[[-57.48322729874109,-3.181066228738518],
[-54.59382300186609,-3.181066228738518],
[-54.59382300186609,-1.4357253044917677],
[-57.48322729874109,-1.4357253044917677],
[-57.48322729874109,-3.181066228738518]]]);
Map.addLayer(roi1,{"color":"orange"},"roi1");
Map.centerObject(roi1,6);
//影像数据筛选
var Col6 = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")
.filterDate("2023-06-01","2023-06-30")
.filterBounds(roi1)
.filterMetadata("CLOUD_COVER","less_than",20);
print(Col6,"Col6");
Map.addLayer(Col6.first(),trueColor432Vis,"Col6");
//计算NDVI添加波段
var Col6NDVI = Col6.map(function(image){
var ndvi = image.normalizedDifference(["B5","B4"]);
return image.addBands(ndvi.rename("NDVI"));
}).select("NDVI");
print(Col6NDVI,"Col6NDVI");
//统计研究区域每一张影像NDVI均值
var Col6NDVIMean = Col6NDVI.map(function(image){
var mean = image.reduceRegion({
reducer:ee.Reducer.mean(),
geometry:roi1,
scale:250,
});
var ndvi = ee.Number(mean.get("NDVI"));
image = image.set("ndvi",ndvi);
return image;
});
print("Col6NDVIMean",Col6NDVIMean);
遍历循环我们常常用到map方法,该方法一定要掌握,我们在前面多次强调。map方法主要结构为:
collection.map(function(element{order1,order2,return element})
上面的代码中,我们在两个地方用到了map方法,第一部分采用map遍历每一张影像,计算其NDVI,并且添加波段重命名为NDVI,考考大家,结尾为什么要使用select方法?这是因为原L9单景影像波段数量较多,select类似与复制粘贴的含义,通过select方法,挑选出自己想要的波段,再生成新的影像,这样输出的影像结果就只会保留我们选择的波段。因此,这里我们生成的影像只保留NDVI波段。第二部分我们采用map方法统计经过研究区域影像的NDVI均值,由于进行统计计算时,reduceRegion最后返回的是字典对象,因此我们需要使用get讲NDVI均值提取出来,再设置其为影像的属性。我们来看看,最后的结果是不是这样的:
除了map方法,遍历循环还有什么方法?相信大家在学习矢量集合的时候还接触过iterate方法,小编在当时的文章里花了较大的篇幅进行讲解,要是友友们对这个方法感兴趣,可以回看小编此前写的文章,在此就不花笔墨啦。
D.统计方法
接着上文的例子,我们涉及到了影像的区域统计。今天最后一部分时间,把视角切入到区域统计计算的讨论。在GEE中,针对于ImageCollection,主要有两种方法开展统计,第一种是应用于多波段的高光谱数据,第二种是针对于属性信息的统计。
D1—多波段数据的统计
多波段数据的统计常常使用reduce方法,这个方法一共有两个参数,第一个参数是reducer,代表你是想统计什么?均值、最大值、最小值、中值?这里的统计,是针对于同一个像素展开的,最后得到的结果就是所有像素在某一种统计方法下合成的单景影像。第二个参数是parallelScale,用来应对缩放内存溢出的状况。
//reduce统计
//导入研究区域
var roi2 = ee.Geometry.Polygon([[[32.12760898702021,-14.957509026064299],
[36.10465976827021,-14.957509026064299],
[36.10465976827021,-9.353667321411514],
[32.12760898702021,-9.353667321411514],
[32.12760898702021,-14.957509026064299]]]);
Map.centerObject(roi2,6);
//数据预处理
var Landsat9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")
.filterDate("2023-01-31","2023-12-31")
.filterBounds(roi2);//筛选
var Landsat9maskcloud = Landsat9.map(ee.Algorithms.Landsat.simpleCloudScore)
.map(function(image){
var mask = image.select("cloud").lte(20);
return image.updateMask(mask);
});//去云
//计算NDVI
var Landsat9NDVI = Landsat9maskcloud.map(function(image){
var ndvi = image.normalizedDifference(["B5","B4"]);
return image.addBands(ndvi.rename("NDVI"));
}).select("NDVI");
//可视化参数设置
var palettes = require('users/gena/packages:palettes');
var visParams = {
min:-0.2,
max:0.8,
palette:palettes.colorbrewer.RdYlGn[10]
};
//区域统计
var image = Landsat9NDVI.reduce(ee.Reducer.mean());
//图层显示
Map.addLayer(image,visParams,"NDVIimage");
Map.addLayer(roi2,{"color":"orange"},"roi2");
print("Image",image)
此处小编选择了非洲的某著名湖泊作为研究区域,目标是统计该湖泊周边的区域NDVI均值。主要的过程包括研究区域的定义,数据的预处理,这里要复习一下去云哦(http://t.csdnimg.cn/sJxuj),接着计算NDVI,并且进行区域的NDVI数值的统计。关于Lnadsat大段的代码,其实还有简化的空间,所有的map都是可以一气呵成的,如此就可以不用定义那么多的中间变量了。
var Landsat9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")
.filterDate("2023-01-31","2023-12-31")
.filterBounds(roi2)
.map(ee.Algorithms.Landsat.simpleCloudScore)
.map(function(image){
var mask = image.select("cloud").lte(20);
return image.updateMask(mask);
}).map(function(image){
var ndvi = image.normalizedDifference(["B5","B4"]);
return image.addBands(ndvi.rename("NDVI"));
}).select("NDVI");
华丽欣赏在地图上最终得到的结果:
D2—属性信息统计
//reduceColumns统计
//研究区域定义
var roi3 = ee.Geometry.Polygon([[[127.93463885872399,41.91358883254171],
[128.22577655403649,41.91358883254171],
[128.22577655403649,42.06771501827376],
[127.93463885872399,42.06771501827376],
[127.93463885872399,41.91358883254171]]]);
Map.centerObject(roi3,6);
//数据预处理
var Landsat9 = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")
.filterDate("2023-01-31","2023-12-31")
.filterBounds(roi3)
.map(ee.Algorithms.Landsat.simpleCloudScore)
.map(function(image){
var mask = image.select("cloud").lte(10);
return image.updateMask(mask);
});
print("Landsat9",Landsat9);
//属性信息统计
var index = Landsat9.reduceColumns(ee.Reducer.toList(),["system:index"]);
print("index",index);
var index1 = index.get("list");
print("index1",index1);
属性信息的统计即统计某一个影像集合的属性信息。此处小编想找出覆盖2023年长白山天池云量小于10%的所有影像的索引号,使用reduceColumns方法,在计算上选择toList的形式,意图将索引号以列表的形式进行存储,采用get方法提取处列表,这样便能够单独得到一张表格,里头存储了符合目标要求的所有影像索引号。且看结果:
好啦,以上就是小编想分享的关于GEE中影像集合数据的所有内容,至此,GEE上常用的数据类型小编基本上都和大家一起学习完了,从数字开始到现在,想必现在看到GEE就可以好好相处!
后续小编对GEE的解读将从案例展开,和大家继续学习哦!
大家加油!更多内容欢迎扫码关注小编的公众号“梧桐凉月”,我是梧桐君,地理路上并不孤单,咱们下期再会!