LonghaoWang

V1

2023/02/10阅读:40主题:姹紫

GEE月合成与天合成

GEE中的很多影像都是日尺度、4-day、8-day之类的。但是有时候我们不需要这么精细的时间分辨率。

日合成(以8-day为例)

比如我需要把4-day的LAI(MCD15A3H.061 MODIS Leaf Area Index)合成8-day

image-20230117163507013
image-20230117163507013

这时需要创建List,给List时间属性,用Map循环完成操作:

pkgs.aggLAI = function(imagecollection, start, end){

  // calculate days
  var days = end.difference(start,'days');
  var day8_list = ee.List.sequence(0, days, 8);
  // define the day advance function
  function make_8day_list(n){
    return start.advance(n, 'day');
  }
  var date_points = day8_list.map(make_8day_list);
  
  // (2) 
  var aggLAI = function(date){
    var image = imagecollection.filter(ee.Filter.date(ee.Date(date), ee.Date(date).advance(9'day')))
    var image1 = image.first()
    var LAI = image.select('Lai').mean()
    return LAI
//    .copyProperties(image1, image1.propertyNames())
    .set("system:time_start", date)
    .set("time", date)
  }
  var new_LAI = date_points.map(aggLAI)
  var new_LAI = ee.ImageCollection(new_LAI)
  return new_LAI 
}
exports = pkgs;

这里写了一个合成8-day的函数,只要给出起始和终止时间即可~

这里的基本思路是创建一个间隔8day的List,如[0, 8, 16, ...]

只需要初始时间.advance相应的days即可获得8-day的时间

再用8-day筛选该时间内的影像赋值平均值

月合成

pkgs.aggLAI = function(imagecollection, start, end){

  // calculate month
  var startYear = start.get('year')
  var endYear = end.get('year')
  var years = ee.List.sequence(startYear,endYear);
  var months = ee.List.sequence(1,12);
  
  var monthlyImage =  ee.ImageCollection.fromImages(
    years.map(function (y
      return months.map(function(m{
        var monthly = imagecollection
          .filter(ee.Filter.calendarRange(ee.Number(y), ee.Number(y), "year"))
          .filter(ee.Filter.calendarRange(ee.Number(m), ee.Number(m), "month"))
          .mean(); 
        return monthly
          .set("year", y) 
          .set("month", m)
          .set('date', ee.Date.fromYMD(y,m,1))
          .set("system:time_start", ee.Date.fromYMD(y, m, 1));}); })
    .flatten());
    return monthlyImage
}

exports = pkgs;

月合成的难点是不能再用advance进行固定的day了,因为每个月的天数不一样。

这就要用year和month双循环map,再用Filter.calendarRange

分类:

后端

标签:

云计算

作者介绍

LonghaoWang
V1