一、筛选器Filter
(1)关系比较型筛选器
(2)差值筛选器
(3)字符筛选器
(4)详细时间筛选
(5)筛选器叠加筛选
二、Join配合Filter进行两数据集联合筛选
(1)仅保留左侧数据集的筛选
(2)两侧均保留的数据集的筛选(数据集融合)
(3)对符合要求数据集以属性形式添加左侧数据集内
(4)空间数据之间的筛选
举例说明:
筛选出河南省空间区域范围内Landsat 8影像日期在2021年5月的影像。
var filter_1 = ee.Filter.eq/neq/gt/gte/lt/lte('字段','字段值');
//关系进行判断,返回筛选器
var result_filter = (FeatureCollection/ImageCollection).fliter(filter_1);
//此时筛选结果仍为Collection类型。
若返回非Collection类型,如下所示:
var result_filter = (FeatureCollection/ImageCollection).fliter(filter_1).first();
var filter_1 = ee.Filter.maxDifference('最大差值','字段','字段数值');
'var filter_1 = ee.Filter.maxDifference('10','area',100); '
//表示面积字段area与100最大相差10的区域
对起始、终止、包含字符串进行筛选
var filter_1 = ee.Filter.stringStartsWith('字段','起始字符串');
var filter_2 = ee.Filter.stringEndsWith('字段','末尾字符串');
var filter_3 = ee.Filter.stringContains('字段','包含字符串');
对范围筛选
var filter_1 = ee.Filter.rangeContains('字段','起始字母', '终止字母');
'var filter_1 = ee.Filter.rangeContains('NAME','B', 'D');'
//表示筛选出NAME字段种包含字母B到D的全部区域
针对某些字段内以列表形式存在的字段值,需要用到listContains()
var filter_1 = ee.Filter.listContains('字段','列表内包含值');
针对多值进行筛选时,需要用到列表进行多值筛选:
var list_1 = ee.List('字符串1', '字符串2', '字符串3');
var filter_1 = ee.Filter.inlist('字段',list_1);
//筛选出字段中包含列表内某些元素的结果(多值筛选)
var filter_1 = ee.Filter.calendarRange(day1, day2, 'day_of_year');
//筛选器:筛选一年中第day1到第day2天中的影像
var filter_2 = ee.Filter.calendarRange(month1, month2, 'month_of_year');
//筛选器:按月份筛选
筛选一年中的天数也可以用DayOfYear()
filter_1 = ee.Filter.day_Of_Year(day1, day2);
//筛选器:筛选一年中第day1到第day2天中的影像
var filter_1 = ee.Filter.and(filter_A, filter_B);
//筛选器:筛选交filter
var filter_2 = ee.Filter.or(filter_A, filter_B);
//筛选器:筛选并filter
var Result = China.filter(filter_1);
//其中相当于filter_A与filter_B结果合并
反筛选
var filter_2 = filter_1.not();
//要filter_1筛选结果不符合的部分
【ee.Join.simple(),对两数据集满足某条件下对某个数据集进行筛选】
【ee.Join.inverted(),对两数据集不满足某条件下对某个数据集进行筛选】
以下完成了对数据集1与数据集2之间相差天数小于times的数据集1进行筛选。
'用于筛选数据集影像之间相差times以内的数据集'
var filter_1 = ee.Filter.maxDifference(
{
difference: times,
'通过系统时间联系数据集(system:time_start)'
leftField: 'system:time_start',//左字段的选择器,类型为time_start,即从起始计时,单位毫秒
rightField: 'system:time_start' //右字段的选择器'
//注意:左右字段(Field)与左右对象只能选其一,如果有左右对象则无选择器(字段的单位已经存在);有选择器时,不能有对象,对象目前为未知
});
//其中times单位为毫秒,例如1天为1*24*60*60*1000
'定义一个空的simpleJoin,后边应用筛选器时是选择符合条件的结果'
var simpleJoin = ee.Join.simple();
'定义一个空的invetJoin,后边应用筛选器时是选择不符合条件的结果'
var invetJoin = ee.Join.inverted();
'对simpleJoin应用筛选器'
var simpleJoined = simpleJoin.apply(数据集1, 数据集2, filter_1);
print(simpleJoined); //可以打印查看满足条件的数据集1影像名称
'用于筛选两影像某字段之间满足条件的数据集'
var filter_1 = ee.Filter.eq(
{
leftField: '字段1名称',
rightField: '字段2名称'
});
'定义一个空的innerJoin,应用筛选器时是选择符合条件的结果'
var innerJoin = ee.Join.inner('名称1', '名称2'); //定义生成结果的合成两产品的名称
'对innerJoin应用筛选器'
var toyJoin = innerJoin.apply(数据集1, 数据集2, filter_1);
print(toyJoin);
//可以打印查看满足条件的两个影像名称,分别对应前边的名称1与名称2
更多地应用于合成不同产品数据集,例如基于系统时间合成同一天下Landsat与MODIS影像数据。多种数据融合形成需要的综合产品。(通过cat()将不同影像进行波段整合,最后形成波段融合后的影像结果)
'inner后续的产品整合'
var toyJoin_result = toyJoin.map(function(IM){
return ee.image.cat(IM.get('名称1'), IM.get('名称2'));
})
ee.Join.saveAll() 用于确定符合要求的数据集,结果标记在新增属性字段内
var filter_1 = ee.Filter.maxDifference(
{
difference: times,
leftField: 'system:time_start',
rightField: 'system:time_start'
});
var saveAllJoin = ee.Join.saveAll(
{
matchesKey: 属性名称,
ordering: 'system:time_start', //排序字段
ascending:true //升序
});
'对saveAllJoin应用筛选器'
var saveAll_Join_Images = saveAllJoin.apply(数据集1, 数据集2, filter_1);
print(saveAll_Join_Images);
ee.Join.saveBest() 确定最优数据集,返回在属性字段内,只保留最优图像
var filter_1 = ee.Filter.maxDifference(
{
difference: times,
leftField: 'system:time_start',
rightField: 'system:time_start'
});
var saveBestJoin = ee.Join.saveBest(
{
matchesKey: 属性名称,
measureKey: 测量字段 //返回测量结果,例如时间差距毫秒
});
'对saveBestJoin应用筛选器'
var saveBest_Join_Images = saveBestJoin.apply(数据集1, 数据集2, filter_1);
print(saveBest_Join_Images);
ee.Join.saveFirst() 只保留右侧第一个符合要求数据影像
空间筛选器介绍:
① ee.Filter.withinDistance()
用于确定两者之间空间距离之间的差距影像筛选(例如:站点数据与影像栅格数据)
var filter_1 = ee.Filter.withinDistance({
distance: 距离,
leftField: '.geo', //.geo特指空间属性
rightField: '.geo',
maxError: 10 //运行电脑最大缩放误差
});
② ee.Filter.intersects()
用于确定相交数据集的影像筛选(例如:矢量数据与其相交的栅格数据筛选)
var filter_1 = ee.Filter.intersects({
leftField: '.geo', //.geo特指空间属性
rightField: '.geo',
maxError: 10 //运行电脑最大缩放误差
});
剩余可以基于该空间筛选得到的筛选器结合Join的操作实现对某个数据集进行空间的筛选操作。
var China = ee.FeatureCollection("users/geometry_try/China_province");
//添加中国省级边界行政区矢量图
var Henan_filter = ee.Filter.eq('City_1', 'henan'); //按字段筛选出河南省
var Henan = China.filter(Henan_filter);
Map.centerObject(Henan);
Map.addLayer(Henan);
var L8_Dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2021-05-01', '2021-06-01'); //添加Landsat 8 T1影像
var Henan_L8_filter = ee.Filter.intersects({
leftField:'.geo',
rightField:'.geo'
}); //get geo intersects filter 构建空间相交筛选器
var Join_simple = ee.Join.simple(); //create Join simple
var Henan_L8_Dataset = Join_simple.apply(L8_Dataset, Henan, Henan_L8_filter); //apply Join simple
print(Henan_L8_Dataset);
var Henan_L8_Dataset_B1 = Henan_L8_Dataset.map(function select_B1(Image){
return Image.get('SR_B1'); //get band1, 运用map函数筛选出第一波段影像
});
//addLayer ImageCollection
Map.addLayer(ee.ImageCollection(Henan_L8_Dataset));
Map.addLayer(Henan,{color:'red'},'henan');
可以看出筛选后影像有23张(List (23 elements))
针对各张影像查看波段如下,查看第一波段的编号:
最后查看筛选出的结果如下所示:
可以看出其中影像存在部分的缺失,河南省西部部分区域在2021年5月没有Landsat 8 T1影像。