I want to mask water bodies with two different conditions and then add the two indexed layers together to create one layer with different values of 0 (no water), 1 (water: based on index 1), 2 (water: based on index2) and 3 (water: based on both index 1 and 2). here is the code, I don't get any error but the final water band has pixel values of 3 for all the pixels. I can't figure out where the problem is. What am I doing wrong?
s2 = s2.filterBounds(region)
.filterDate('2021-01-16', '2021-01-18')
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 35));
function mNDWI(img){
var img = ee.Image(img).divide(10000)
var mndwi = img.normalizedDifference(['B3', 'B11']).rename('mNDWI')
.copyProperties(img,['system:time_start'])
return img.addBands(mndwi)
}
function Fisher(img){
var img = ee.Image(img).divide(10000)
var fisher = img.expression('1.7204 + 171 * Green + 3 * Red - 70 * NIR - 45 * SWIR1 - 71 * SWIR2',
{'Green':img.select('B3'),'Red':img.select('B4'),
'NIR':img.select('B8'),'SWIR1':img.select('B11'),
'SWIR2':img.select('B12')}).rename('Fisher').copyProperties(img, ['system:time_start'])
return img.addBands(fisher)
}
var ic_in= s2.map(mNDWI).map(Fisher)
function water_thresholding(img){
var img = ee.Image(img)
var rvrs = img.select('mNDWI').gt(-0.3).rename('rivers')
var fi_index = img.select('Fisher').gt(0.63)
var mndwi_index = img.select('mNDWI').gt(0)
var otrs = (fi_index.or(mndwi_index)).remap([1, 0], [2, 0], null).rename('others')
var water = (rvrs.add(otrs)).rename('Water')
return img.addBands(water)
}
var s2_ic_msk = ic_in.map(water_thresholding)
print(s2_ic_msk.first())
Map.addLayer(s2_ic_msk.select('Water'), {}, 'Water' )
Best Answer
Your issue is produced because you are dividing by 100,000,000 instead 10,000; as it was well pointed out in comments. One of different ways for avoiding that is combining all functions in only one as follows.
Result is the same with the previous three functions (corroborated by me) and, it can be observed in following picture.