Я пытаюсь использовать данные о температуре 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');