The code that you copied uses an Earth Engine object of type "Image", and Image objects have a method/function named clip. Your reworked code (i.e. Landsat) uses an Earth Engine object of type "ImageCollection", and ImageCollection objects do not have a method named clip, so it produces an error. To get around this, you can either:
- Convert the ImageCollection to an Image using a reducing method (i.e. median, mode, mosaic, max, etc.)
- Write a function that clips an Image object, and map that function over the collection using ee.ImageCollection.map().
Also, it probably doesn't make sense to add the entire Landsat 5 collection as a layer on the interactive map... it contains over 25 years of data. Add a step that filters the Landsat collection down to a shorter time interval, using ImageCollection.filterDate().
Assuming your affirmation that the remote sensing reflectance has to divide by pi, it is preferable to have three functions for mapping original and followings ImageCollections. First of them, it prepares selected bands for correct use (dividing by pi and it is also necessary a scale factor). Second function calculates band max between B1 and B2 and includes it in a new collections as 'B12_max' and finally, your desired function. They were incorporated in following code and one value, for pixel in point (-15.857348155192721, 28.47817439021581), arbitrarily selected in the ocean, was tested with respective formulas in LibreOffice. They matched perfectly.
var pt = ee.Geometry.Point([-15.857348155192721, 28.47817439021581]);
function prepareImages(image) {
var time = image.get('system:time_start');
return image.divide(Math.PI*10000)
.set('system:time_start', time);
}
var dataset = ee.ImageCollection('COPERNICUS/S2_SR')
.filterDate('2020-01-01', '2020-01-03')
.filterBounds(pt)
.select('B1', 'B2', 'B3', 'B4')
.map(prepareImages);
var collBandMax = dataset.map(function (image) {
var img_B1 = image
.select('B1');
var img_B2 = image
.select('B2');
var img_max_B1_B2 = img_B1.max(img_B2)
.rename('B12_max');
image = image.addBands([img_max_B1_B2]);
var time = image.get('system:time_start');
return image.set('system:time_start', time);
});
print("Collection with Band Max", collBandMax);
var chl_oc2 = collBandMax.map(function(image){
var x = image.expression(
'log10 ( Bmax / B3 )', {
'Bmax': image.select('B12_max'),
'B3': image.select('B3'),
}).rename('x');
var chl_conc = image.expression('10**(0.2389-1.9369*x+1.7627*x**2-3.077*x**3-0.1054*x**4)',
{'x':x} ).rename('chl_conc');
var time = image.get('system:time_start');
return chl_conc.set('system:time_start', time); });
print(chl_oc2);
var visualization = {
min: 0.0020371832715762603,
max: 0.018589297353133374,
bands: ['B4', 'B3', 'B2'],
};
Map.setCenter(-15.6871, 28.647, 20);
Map.addLayer(dataset.mean(), visualization, 'RGB');
Map.addLayer(chl_oc2, {}, 'chl_oc2');
//Image (3 bands)
//B1: 0.009963099437553
//B2: 0.016074649252282
//B3: 0.011681972822945
After running above code, I got result of following image for corroborating pixel value in that point.
In following image it can be observed that this value matched with obtained in LibreOffice spreadsheet.
Best Answer
Another way would be by using groupReducers
as referenced here