Geographic Information Systems Asked by Loukas Garanis on July 28, 2021
EDIT: My mistake was calling system:time_start ‘day’ at the very beginning of my script. So when I called ‘system:time_start’ later on, it didn’t work. When I replaced that by ‘day’, it worked correctly.
After doing multiple operations on image collections, I lose the timestamp on the irr_d_corr image collection. So my last block of code, which aims to reduce daily values to monthly accumulated irrigation values, doesn’t work and I get the error reduce.sum: Can’t apply calendarRange filter to objects without a timestamp. My attempt at re-inserting the system:time_start property are below but doesn’t work. Any thoughts?
var imageCollection = ee.ImageCollection("NASA/GLDAS/V021/NOAH/G025/T3H"),
geometry =
/* color: #d63000 */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[20.817754866045995, 52.34077419473341],
[20.817754866045995, 44.17282518184684],
[40.593145491045995, 44.17282518184684],
[40.593145491045995, 52.34077419473341]]], null, false);
var dataset = imageCollection.filterBounds(geometry).filterDate('2000-01-01', '2020-01-01');
var pcp = dataset.select('Rainf_tavg').filterDate('2019-01-01', '2020-01-01');
var et = dataset.select('Evap_tavg').filterDate('2019-01-01', '2020-01-01');
var rof = dataset.select('Qs_acc').filterDate('2019-01-01', '2020-01-01');
//Reduce precipitation, evapotranspiration and runoff to daily values and combine them into a single image collection.
var days = ee.List.sequence(1, 365);
var daily = ee.ImageCollection.fromImages(days.map(function(d) {
var image = pcp.filter(ee.Filter.calendarRange({
start: d,
field: 'day_of_year'
})).mean().rename('pcp').addBands(
et.filter(ee.Filter.calendarRange({
start: d,
field: 'day_of_year'
})).mean().rename('et').addBands(
rof.filter(ee.Filter.calendarRange({
start: d,
field: 'day_of_year'
})).mean().divide(10800).rename('rof')
));
return image
.set('day', d);
}));
print(daily);
//Compute soil moisture derivative.
var s1 = (dataset.select('SoilMoi0_10cm_inst').filterDate('2000-01-01','2001-01-01').mean()).divide(10800);
var s2 = (dataset.select('SoilMoi0_10cm_inst').filterDate('2019-01-01','2020-01-01').mean()).divide(10800);
var dt = ee.Image(19);
var dsdt = (s2.subtract(s1)).divide(dt);
//Compute daily irrigation values.
var irrigation = daily.map(function(image){
var test = image
.addBands(image
.select('rof')
.add(image.select('et'))
.add(dsdt)
.subtract(image.select('pcp'))
.rename('irr_d')
);
return test;
});
print(irrigation);
//Reduce soil moisture to daily values and compute mean, std dev, and anomalies.
var days = ee.List.sequence(1, 365);
var sm = dataset.select('SoilMoi0_10cm_inst').filterDate('2019-01-01', '2020-01-01');
var pcp = dataset.select('Rainf_tavg').filterDate('2019-01-01', '2020-01-01');
var bands = ee.ImageCollection.fromImages(days.map(function(d) {
var image = sm.filter(ee.Filter.calendarRange({
start: d,
field: 'day_of_year'
})).mean().rename('sm')
.addBands(
pcp.filter(ee.Filter.calendarRange({
start: d,
field: 'day_of_year'
})).mean().multiply(86400).rename('pcp')
)
return image
.set('day', d)
}));
var sm_mean = bands.select('sm').mean();
var sm_stdev = bands.select('sm').reduce(ee.Reducer.stdDev());
print(sm_stdev);
//Compute SM anomalies and related irrigation events (0 or 1).
var irr_event = bands.map(function(image){
var sm_anom = image
.addBands(image
.select('sm')
.subtract(sm_mean)
.divide(sm_stdev)
.rename('sm_anom')
)
return sm_anom.addBands(image
.select('pcp').lte(1)
.and(sm_anom.select('sm_anom').gte(1))
.rename('irrigation_event')
)
})
print(irr_event);
//Combine daily irrigation values and irrigation events into a single image collection.
var combined = irrigation.combine(irr_event);
print(combined);
//Only keep days where there was an irrigation event.
var irr_d_corr = combined.map(function(image) {
var date = image.get('system:time_start');
return image
.select('irr_d')
.multiply(image.select('irrigation_event'))
.set('system:time_start', date);
});
print(irr_d_corr);//This is where I lose system:time start property.
//Compute the accumulated irrigation quantities per month.
var months = ee.List.sequence(1, 12);
var irr_acc = ee.ImageCollection.fromImages(months.map(function(g) {
var filtered = irr_d_corr.filter(ee.Filter.calendarRange({
start: g,
field: 'month'
}));
return filtered.sum().set('month', g);
}));
print(irr_acc);
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP