I am attempting to do a burn scar analysis by getting the difference between the Normalized Burn Ratio of two scenes from different dates. It must be possible to do it in Playground with a custom script, but how would one go about doing that?
In case you want to compare two specific dates, you might use something along the lines of:
function filterScenes (scenes, inputMetadata) {
return scenes.filter(function (scene) {
var allowedDates = ["2017-11-05","2017-12-05"];
var sceneDateStr = getDateInISO(scene.date);
if (allowedDates.indexOf(sceneDateStr)>=0) return true;
else return false;
});
}
in the filterScenes section.
To do this in a dynamic fashion, you would want to use EVALSCRIPT parameter - e.g. prepare the script in your application, then encode it (BASE64) and then pass it as EVALSCRIPT.
Thanks Grega, your help is much appreciated! I got the results I wanted with the script below:
function setup (dss) {
// get all bands for display and analysis
setInputComponents([dss.B02,dss.B03,dss.B04,dss.B08,dss.B12]);
// return as RGB
setOutputComponentCount(3);
}
function filterScenes (scenes, inputMetadata) {
return scenes.filter(function (scene) {
// set dates for pre-and-post fire analysis
var allowedDates = ["2017-05-15","2017-06-24"]; // Knysna fires
// format scene date timestamp to match allowed dates
var sceneDateStr = dateformat(scene.date);
if (allowedDates.indexOf(sceneDateStr)!= -1) return true;
else return false;
});
}
// Normalized Burn Ration calculation
function calcNBR(sample) {
var denom = sample.B08+sample.B12;
var nbrval = ((denom!=0) ? (sample.B08-sample.B12) / denom : 0.0);
return nbrval;
}
function dateformat(d){
var dd = d.getDate();
var mm = d.getMonth()+1;
var yyyy = d.getFullYear();
if(dd<10){dd='0'+dd}
if(mm<10){mm='0'+mm}
var isodate = yyyy+'-'+mm+'-'+dd;
return isodate;
}
function evaluatePixel(samples,scenes) {
var nbrpre = 0;
var nbrpost = 0;
// get pre-fire image
nbrpre = calcNBR(samples[1]);
// get post-fire image
nbrpost = calcNBR(samples[0]);
// get difference
var dnbr = nbrpre - nbrpost;
// set output display layers
var NaturalColors = [3 * samples[0].B04, 3 * samples[0].B03, 3 * samples[0].B02];
var burnModerate = [1,0.5,0];
var burnSevere = [1,0,0];
return (dnbr < 0.27 ?
NaturalColors : (dnbr < 0.66 ?
burnModerate : burnSevere)
);
}
Hi ! I found very interesting what you are doing.
I tried to run the scrypt on the playground with out success. I zoomed in a area where i know a fire scar, and changed the pre and post fire dates. Should i change any other parameter?
Great script and idea, up until I came across this I had been downloading terabytes of sentinel 2 to calculate difference NBR. However, I cannot see to get the above script to work in the Sentinel Hub Playground (“Error loading image:”), I am a complete noob to this platform. Do you mind please pointing me in the right direction?
Thank you very much for the very interesting script. It is great.
I’m probably asking something very simple, but my problem is that I’m not a programmer. I don´t know if it is possible to use a script like this in “wms configurator”.
In my case what I need is an image resulting from subtracting NDVI values between two dates. But trying to make you more simple, if you can tell me how to use the “Burned area temporal analysis” script in “wms configurator” it would be great. Then I will try to adapt it to what I need.
It is not urgent and thank you very much for you time
You are right, multi-temporal processing is not yet supported in EO Browser, which was designed to show data from single time slices. We do plan to update this, but not one of the top priority features.
You can obviously take EO Browser application source-code and deploy your own, modified, version:
Thank you very much for the reply. It’s great if this option is implemented in the future. Anyway, EO Browser is still very useful and the statistical info option is already very interesting for temporary analysis.