0
点赞
收藏
分享

微信扫一扫

从GEE中批量导出S5P的图像数据(tif)

Just_Esme 2022-04-01 阅读 56

需求分析:需要下载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)
var year_image = test.toBands()  // 将多张图像合并为一张图像的多个波段
print(year_image)

// (4) 将全年数据以bands的方式保存
Export.image.toDrive({
  image: image,
  description: 'NO2_year_2019',
  scale: 1113.2,
  folder: 'NO2',
  region: geometry,
});

// (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() 方法将大量图片转为一张图片的众多波段,简直是妙不可言。

二、Result:
在这里插入图片描述
输出一个包含365个波段的Image图像,方便导出到drive以及后续的下载。
三、简单验证:
在可视化里分别输出该数据集在2019年第一天和最后一天的图像
在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论