如何在Google Earth Engine中实现年际样本动态迁移(附完整代码)
GEE学习室是一群由认真学习和使用GEE等遥感大数据平台的高校博士生(含在读和已毕业)组建的团队,致力于GEE等大数据原创和优质算法开发,希冀通过团队的努力为遥感大数据智能处理普及和广大学子科研之路提供。再次说明,本文只实现了简单的过程,具体效果和原文有偏差可以理解,诸君自行甄别。当然,这种迁移从现有技术标准等角度来看还是一种朴素的方法,但是这篇论文作为样本迁移研究的pioneer,还是很值得学习
我们今天分享的就是宫鹏老师团队在2020年发表在ISPRS期刊上的论文“The migration of training samples towards dynamic global land covermapping”,里面涉及到的样本迁移操作,具体信息如下:
“Huang H, Wang J, Liu C, et al. The migration of training samples towards dynamic global land cover mapping[J]. ISPRS Journal of Photogrammetry and Remote Sensing, 2020, 161: 27-36.”

该论文的思路其实也很直观、结构化,就是利用光谱距离等度量不同年份样本数据的相似性,从而筛选出那些没有变化的样本数据,这些没有变化的数据则可以用于目标年份的分类研究,从而完成了年际迁移任务。具体流程图和效果如下:


当然,这种迁移从现有技术标准等角度来看还是一种朴素的方法,但是这篇论文作为样本迁移研究的pioneer,还是很值得学习的。
最后,本学习室对论文方法进行了复现,效果图和代码如下。可以发现,使用这种方法,从原始170个样本中保留了19个样本数据。再次说明,本文只实现了简单的过程,具体效果和原文有偏差可以理解,诸君自行甄别。
var roi = AOI;
Map.addLayer(roi, {'color':'grey'},'studyArea');
var samplePool = sampleData.filterBounds(roi);
Map.addLayer(samplePool,null,"samplePool",false);
print(samplePool.size());
/**************************************************************************
Define the functions
**************************************************************************/
// reomove cloud for Landsat-8
function rmL8Cloud(image) {
var cloudShadowBitMask = (1 << 3);
var cloudsBitMask = (1 << 5);
var qa = image.select('pixel_qa');
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
var mask2 = image.select("B1").lte(2000);
return image.updateMask(mask).updateMask(mask2).toFloat().divide(1e4)
.copyProperties(image)
.copyProperties(image, ["system:time_start",'system:time_end']);
}
// remove cloud for Landsat 4, 5 and 7
function rmL457Cloud(image) {
var qa = image.select('pixel_qa');
// If the cloud bit (5) is set and the cloud confidence (7) is high
// or the cloud shadow bit is set (3), then it's a bad pixel.
var cloud = qa.bitwiseAnd(1 << 5)
.and(qa.bitwiseAnd(1 << 7))
.or(qa.bitwiseAnd(1 << 3));
// Remove edge pixels that don't occur in all bands
var mask2 = image.mask().reduce(ee.Reducer.min());
// remove pixels where the blue reflectance is greater than 0.2
var mask3 = image.select('B1').gt(2000);
return image.updateMask(cloud.not()).updateMask(mask2).updateMask(mask3.not()).toFloat().divide(1e4)
.copyProperties(image)
.copyProperties(image, ["system:time_start",'system:time_end']);
}
/**************************************************************************
Merge Landsat OLI image
**************************************************************************/
// Assign a common name to the sensor-specific bands.
var LC8_BANDS = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7']; //Landsat 8
var LC7_BANDS = ['B1', 'B2', 'B3', 'B4', 'B5', 'B7']; //Landsat 7
var LC5_BANDS = ['B1', 'B2', 'B3', 'B4', 'B5', 'B7']; //Landsat 5
var STD_NAMES = ['blue', 'green', 'red', 'nir', 'swir1', 'swir2'];
var src_year = 2018;
var src_date_start = 1;
var src_date_end = 12;
var src_l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterBounds(roi)
.filter(ee.Filter.calendarRange(src_year, src_year, 'year'))
.filter(ee.Filter.calendarRange(src_date_start, src_date_end, 'month'))
.map(rmL8Cloud)
.select(LC8_BANDS, STD_NAMES)
.sort("system:time_start");
var src_l7 = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
.filterBounds(roi)
.filter(ee.Filter.calendarRange(src_year, src_year, 'year'))
.filter(ee.Filter.calendarRange(src_date_start, src_date_end, 'month'))
.map(rmL457Cloud)
.select(LC8_BANDS, STD_NAMES)
.sort("system:time_start");
var src_landsat = ee.ImageCollection(src_l8.merge(src_l7))
.sort("system:time_start");
Map.addLayer(src_landsat,null,'src_landsat',false);
src_l8 = null;
src_l7 = null;
var srcCol = src_landsat.median().clip(roi);
var target_year = 2010;
var target_date_start = 1;
var target_date_end = 12;
var target_l5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_SR')
.filterBounds(roi)
.filter(ee.Filter.calendarRange(target_year, target_year, 'year'))
.filter(ee.Filter.calendarRange(target_date_start, target_date_end, 'month'))
.map(rmL457Cloud)
.select(LC8_BANDS, STD_NAMES)
.sort("system:time_start");
var target_l7 = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
.filterBounds(roi)
.filter(ee.Filter.calendarRange(target_year, target_year, 'year'))
.filter(ee.Filter.calendarRange(target_date_start, target_date_end, 'month'))
.map(rmL457Cloud)
.select(LC8_BANDS, STD_NAMES)
.sort("system:time_start");
var target_landsat = ee.ImageCollection(target_l5.merge(target_l7))
.sort("system:time_start");
Map.addLayer(target_landsat,null,'target_landsat',false);
target_l7 = null;
target_l5 = null;
var targetCol = target_landsat.median().clip(roi);
// generate the four-season composite
// var targetCol = ee.List.sequence(target_date_start,target_date_end,3).map(function(month){
// var date_start = ee.Date.fromYMD(target_year,month,1);
// var date_end = date_start.advance(3, 'month');
// return target_landsat.filterDate(date_start, date_end).median().clip(roi);
// }).flatten();
// target_landsat = null;
// var targetCol = ee.ImageCollection.fromImages(targetCol);
// targetCol = targetCol.toBands();
// print("targetCol",targetCol);
var sadImg = srcCol.spectralDistance(targetCol, 'sam').cos().unmask(0).clip(roi).rename('sadImg');
var edImg = srcCol.spectralDistance(targetCol, 'sed').unmask(0).clip(roi).rename('edImg');
var metricImg= sadImg.addBands(edImg).clip(roi);
print("metricImg",metricImg);
Map.addLayer(metricImg, null, "metricImg",false);
var samplePoolNew = metricImg.sampleRegions({
collection: samplePool,
properties: ['Category'],
scale: 30,
// tileScale:16,
geometries: true
});
print('samplePoolNew',samplePoolNew);
var samplePool_2 = samplePoolNew.filter(ee.Filter.gt("sadImg", 0.4))
.filter(ee.Filter.lt("edImg", 0.5));
print('samplePool_2',samplePool_2);
Map.addLayer(samplePool_2,{'color':'red'},'samplePool_2');
交流合作
GEE学习室是一群由认真学习和使用GEE等遥感大数据平台的高校博士生(含在读和已毕业)组建的团队,致力于GEE等大数据原创和优质算法开发,希冀通过团队的努力为遥感大数据智能处理普及和广大学子科研之路提供绵薄之力、荧荧之光。
本学习室业已创建了4个学习交流群,即博学群、明辨群、如琢群和修远群,来自各地高校和研究所,涵盖本科、硕士和博士群体,交流群每天活跃度非常高。
想加入交流的加小编微信邀请进群(扫描下方二维码咨询报名或菜单栏“联系我们”选项框都可以找到小编哟)。注意,咨询加群验证信息请备注为“研究方向-学校-加群”格式,否则不予通过。例如,假如你是武汉大学的土地利用分类方向的研究生,则可以备注“LULC-武大-加群”;假如你是北京大学的生态学方向的研究生,则可以备注“生态学-北大-加群”。

更多推荐


所有评论(0)