首页 > 解决方案 > GEE - 使用 NASA GLDAS 温度数据的问题

问题描述

我正在尝试使用 NASA GLDAS 温度数据来生成年度和长期统计数据。数据是每小时 3 次,我需要每天获取最大值。然后我想计算每日数据的长期平均值(即2010年到2018年)。该代码的工作时间很短(几个月),但时间序列较长。

错误消息是:超出用户内存限制或计算超时。

可能有更好的方法来编写代码以避免错误。有什么帮助吗?

这是 GEE 代码的链接 https://code.earthengine.google.com/a83616530a8ed4af96dc4118328691e1

下面是代码

// USER SETTINGS //////////////////////////////////////////////////////////////////////////////
//


var ROI = geometry;


// Define time range
var startyear = 2010;
var endyear = 2018;

var startmonth = 1 
var endmonth = 12 

var startday = 1 
var endday = 31  



var vis = {min: 10.0,max: 30.0,palette: ['1303ff', '42fff6', 'f3ff40', 'ff5d0f'],};
var vis_D = {min: -2.0,max: 2.0,palette: ['1303ff', '42fff6', 'f3ff40', 'ff5d0f'],};



////////////////////////////////////////////////////////////////////////////////////////////////

var clip = function(img) {return img.clip(ROI);}   
var collection = ee.ImageCollection('NASA/GLDAS/V021/NOAH/G025/T3H')
                    .filterBounds(ROI)
                    .map(clip)
                    .select('Tair_f_inst');


// Set date in ee date format
var startdate = ee.Date.fromYMD(startyear,startmonth,startday);
var enddate = ee.Date.fromYMD(endyear,endmonth,endday).advance(1, 'day');

// create list for years
var years = ee.List.sequence(startyear,endyear);

// create list for months
var months = ee.List.sequence(startmonth,endmonth);

// get days in month
function getDaysInMonth(y,m) {
  var dt = ee.Date.fromYMD(y,m,1);
  var n = dt.advance(1,"month").difference(dt,'day');
  return ee.List.sequence(1,n);
}

// get days in month for AVG
function getDaysInMonth2(m) {
  var dt = ee.Date.fromYMD(1970,m,1);
  var n = dt.advance(1,"month").difference(dt,'day');
  return ee.List.sequence(1,n);
}

//get projection of the dataset
var proj = ee.Image(collection.first()).projection();



// Filter data
var datain = collection.filterDate(startdate, enddate)
  // .filter(ee.Filter.calendarRange(startmonth,endmonth, 'month'))


// convert to Celsius
var datain = datain.select('Tair_f_inst').map(function(image) {
  return image.subtract(273.15).rename('tmp')
  .set('system:time_start', image.get('system:time_start'))
  .set('doy', image.date().format('YYYY-MM-dd'))
})
// print(datain,'datain')



// aggregate hourly to daily
var daily =  ee.ImageCollection.fromImages(
  years.map(function (y) {
     return months.map(function(m) {
        var days = getDaysInMonth(y,m) 
        return days.map(function(d) {
          var filtered_Daily = datain.filter(ee.Filter.calendarRange(y, y, 'year'))
                    .filter(ee.Filter.calendarRange(m, m, 'month'))
                    .filter(ee.Filter.calendarRange(d, d, 'day_of_month'))
                    .max();
        return filtered_Daily.set('year', y)
              .set('month', m)
              .set('day', d)
              .set('date', ee.Date.fromYMD(y, m, d))
              .set('system:time_start', ee.Date.fromYMD(y, m, d).millis());

    });
    });
  }).flatten()
);

// print (daily,'daily');
// Map.addLayer(daily.first(), vis,'Air_Tmp');



var daily_LTA =  ee.ImageCollection.fromImages(
     months.map(function(m) {
        var days = getDaysInMonth2(m) 
        return days.map(function(d) {
          var filtered_Daily = datain
                    .filter(ee.Filter.calendarRange(m, m, 'month'))
                    .filter(ee.Filter.calendarRange(d, d, 'day_of_month'))
                    .mean()
                    .rename('tmp_LTA');
        return filtered_Daily.set('year', 1970)
              .set('month', m)
              .set('day', d)
              .set('date', ee.Date.fromYMD(1970, m, d))
              .set('system:time_start', ee.Date.fromYMD(1970, m, d).millis());

    });
  }).flatten()
);

print (daily_LTA,'daily_LTA');
Map.addLayer(daily_LTA.first(), vis,'Air_Tmp_LTA');

标签: google-earth-engine

解决方案


通过使用我的包,脚本可以非常简单,即使对于全球应用程序也非常高效。

// USER SETTINGS //////////////////////////////////////////////////////////////////////////////
var pkg_trend = require('users/kongdd/pkgs:/pkgs.js');

function add_date(img){
    var date  = ee.Date(img.get('system:time_start'));
    var date_daily = date.format('YYYY-MM-dd');
    return img.set('date_daily', date_daily);
}

function k2C(img){
    return img.subtract(273.15);
}

var clip = function(img) { return img.clip(ROI); };

/** END OF FUNCTIONS -------------------------------------------------------- */

// CREATE GLOBAL ROI
// var ROI = ee.Geometry.Polygon([-180, 90, 0, 90, 180, 90, 180, -90, 10, -90, -180, -90], null, false)
// Map.addLayer(ROI,{}, 'ROI')
// IF YOU DRAW A POLY OR POINT
var ROI = geometry;

// Set date in ee date format
var date_start = ee.Date('2016-01-01');
var date_end   = ee.Date('2018-12-31');

var imgcol = ee.ImageCollection('NASA/GLDAS/V021/NOAH/G025/T3H')
    // .filterBounds(ROI) // this not work
    .filterDate(date_start, date_end)
    .map(add_date)
    // .map(clip)
    .select('Tair_f_inst');

var imgcol_daily = pkg_trend.aggregate_prop(imgcol, "date_daily", 'mean')
    .map(k2C);

// imgcol = pkg_trend.imgcol_addSeasonProb(imgcol); 
print(imgcol.limit(3), imgcol.size());
print(imgcol_daily.limit(3), imgcol_daily.size());

var vis = { min: 10.0, max: 30.0, palette: ['1303ff', '42fff6', 'f3ff40', 'ff5d0f'], };
var vis_D = { min: -2.0, max: 2.0, palette: ['1303ff', '42fff6', 'f3ff40', 'ff5d0f'], };

/** VISUALIZATION ------------------------------------------------------------*/
// print (daily,'daily');
// Map.addLayer(daily.first(), vis,'Air_Tmp');
print(imgcol_daily.size(), 'daily_LTA');
Map.addLayer(imgcol_daily.first(), vis, 'Air_Tmp_LTA');

另一个例子可以在这里找到。


推荐阅读