需求分析:需要下载s5p数据用于模型的构建,时间范围为1年~2年,空间范围为自定义范围矩阵。
提取数据可视化(S5P_L3_NO2_2019_Mean):
一、Methods。gee code平台默认为js处理器,虽然也可以自己构建python环境,但是很累。
// 这里的有效范围:2018-06-28T10:24:07Z - 2022-03-19T00:00:00
// S5P卫星的上天时间:2017-10-13
// 数据原始的分辨率:7x3.5km2
// (1)set the boundary
var china_bound = ee.FeatureCollection(
ee.Geometry.Polygon({
coords: [[72.5, 54.5], [72.5,18], [136.25, 18], [136.25, 54.5]], // 自定义研究区域
geodesic:false
})); /
// (2)define the time range
var start = ee.Date.fromYMD(2019, 1, 1);
var end = ee.Date.fromYMD(2019, 12,31);
var n_days = end.difference(start, 'day').round(); // 获得总天数
var date_list = ee.List.sequence(0, n_days, 1); // 获得原始的时间序列
function list2date(n){
return start.advance(n, 'day') // 根据偏移得到每天的范围
}
var dates = date_list.map(list2date); // 得到对应的每天
function getrg(d1){
var dg = ee.Date(d1).getRange( 'day' ); // 得到每天对应的range
return dg;}
var daterg = dates.map(getrg); // 得到我们数据每天对应的range
print(daterg, daterg.get(0))
// (3) select the data by the date range
var imgcol = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2')
.select('tropospheric_NO2_column_number_density') // 自定义数据以及波段
function rg2im(rg){
var day_image = imgcol.filterDate(rg)
var name = day_image.first().date().format('YYYY-MM-dd')
var image = day_image.mosaic().set('system:id', name)
return image
}
var images = daterg.map(rg2im)
print(images)
var test = ee.ImageCollection(images)
print(test)
// (4) 多张图片的保存
// (4.1) 将365张日图像合并为具有多个波段的一张图像
// var year_image = test.toBands() // 将多张图像合并为一张图像的多个波段
// print(year_image)
// Export.image.toDrive({
// image: year_image,
// description: 'NO2_year_2019',
// scale: 1113.2,
// folder: 'NO2',
// region: china_bound,
// });
// (4.2) 多张图像依次导出
// (4.2.1) 根据map函数依次导出,name 对应日期
// emm, 这里getInfo()服务器端使用,因此这里代码不可行
// function exportImage(img){
// Export.image.toDrive({
// image: img,
// description: img.get('system:id').getInfo(),
// scale: 1113.2,
// folder: 'NO2',
// region: china_bound
// });
// }
// // test.first().map(exportImage)
// exportImage(test.first())
// (4.2.2) 根据其他作者的封装函数,进行批量导出
var batch = require('users/fitoprincipe/geetools:batch');
// 使用limit(3),即用三张图片作为测试
batch.Download.ImageCollection.toDrive(test.limit(3), "S5P Download",
{name: 'S5P_{system:id}',
region: china_bound,
folder: 'NO2',
})
// (5)将获得的图像可视化
var band_viz = {
min: 0,
max: 0.0002,
palette: ['black', 'blue', 'purple', 'cyan', 'green', 'yellow', 'red']
};
Map.addLayer(ee.Image(images.get(0)).clip(china_bound), band_viz, 'day 0'); // 添加layer的时候需要将图片定义到服务器
Map.addLayer(ee.Image(images.get(1)).clip(china_bound), band_viz, 'day 1'); // 添加layer的时候需要将图片定义到服务器
Map.addLayer(ee.Image(images.get(2)).clip(china_bound), band_viz, 'day 2'); // 添加layer的时候需要将图片定义到服务器
Map.addLayer(ee.Image(images.get(-1)).clip(china_bound), band_viz, 'day -1'); // 添加layer的时候需要将图片定义到服务器
Map.addLayer(test.mean().clip(china_bound), band_viz, 'year mean');
// Map.addLayer(ds.first().clip(china_bound), band_viz, 'S5P N02');
Map.setCenter(104.5, 28.5, 3);
// // print(ds)
代码分析:在(2) define the time range里,advance函数可以在start日期的基础上以’day‘的格式添加n天,达到遍历全年的效果;getRange函数可以在’day’的格式上得到该天的一个时间范围。最后通过map函数得到全年的image.
重要的地方在于将处理好的image导出到drive。在得到全年的image之后,想的办法是通过函数将image一张一张导出,花费了蛮多时间研究异步导出;后来GEE交流群里大神的代码提到可可以通过image.toBands() 方法将大量图片转为一张图片的众多波段,简直是妙不可言。
在选定图像提交run之后,按f12打开控制台,输入代码进行批量RUN:
function runTaskList() {
var runButtons = document.querySelector('#task-pane').shadowRoot.querySelectorAll(".run-button")
runButtons.forEach(function(e) {e.click()})
}
runTaskList()
setTimeout(
function(){
var taskDialog = document.querySelectorAll("ee-image-config-dialog") //table的话-image-改成-table-
taskDialog.forEach(function(e) {e.shadowRoot.querySelector("ee-dialog").shadowRoot.querySelector("paper-dialog").querySelector(".ok-button").click()})
},5 * 1000 );
二、Result:
输出一个包含365个波段的Image图像,方便导出到drive以及后续的下载。
三、简单验证:
在可视化里分别输出该数据集在2019年第一天和最后一天的图像
参考文章:google earth engine随缘学习(十二)批量下载影像&批量执行RUN任务(2021-9-17已更新,见末尾)