{"dcterms:modified":"2023-01-30","dcterms:creator":"Harvard Dataverse","@type":"ore:ResourceMap","@id":"https://dataverse.harvard.edu/api/datasets/export?exporter=OAI_ORE&persistentId=https://doi.org/10.7910/DVN/WOTC7E","ore:describes":{"author":[{"citation:authorName":"Hamidi, Ebrahim","citation:authorAffiliation":"University of Alabama, The","authorIdentifierScheme":"ORCID","authorIdentifier":"0000-0003-3160-6999"},{"citation:authorName":"Peter, Brad","citation:authorAffiliation":"The University of Arkansas","authorIdentifierScheme":"ORCID","authorIdentifier":"0000-0002-5724-4482"},{"citation:authorName":"Muñoz, David F.","citation:authorAffiliation":"Virginia Polytechnic Institute and State University","authorIdentifierScheme":"ORCID","authorIdentifier":"0000-0001-6032-1082"},{"citation:authorName":"Moftakhari, Hamed","citation:authorAffiliation":"University of Alabama, The","authorIdentifierScheme":"ORCID","authorIdentifier":"0000-0003-3170-8653"},{"citation:authorName":"Moradkhani, Hamid","citation:authorAffiliation":"University of Alabama, The","authorIdentifierScheme":"ORCID","authorIdentifier":"0000-0002-2889-999X"}],"citation:datasetContact":{"citation:datasetContactName":"Hamidi, Ebrahim","citation:datasetContactAffiliation":"University of Alabama, The","citation:datasetContactEmail":"shamidi1@crimson.ua.edu"},"citation:dsDescription":{"citation:dsDescriptionValue":"<b>Fast flood extent monitoring with SAR change detection using Google Earth Engine</b>\n<br><br>\nThis dataset develops a tool for near real-time flood monitoring through a novel combining of multi-temporal and multi-source remote sensing data. We use a SAR change detection and thresholding method, and apply sensitivity analytics and thresholding calibration, using SAR-based and optical-based indices in a format that is streamlined, reproducible, and geographically agile. We leverage the massive repository of satellite imagery and planetary-scale geospatial analysis tools of GEE to devise a flood inundation extent model that is both scalable and replicable. The flood extents from the 2021 Hurricane Ida and the 2017 Hurricane Harvey were selected to test the approach. The methodology provides a fast, automatable, and geographically reliable tool for assisting decision-makers and emergency planners using near real-time multi-temporal satellite SAR data sets.\n<br><br>\n<i>GEE code was developed by Ebrahim Hamidi and reviewed by Brad G. Peter; Figures were created by Brad G. Peter.</i>\n<br><br>\nThis tool accompanies a publication Hamidi et al., 2023: \nE. Hamidi, B. G. Peter, D. F. Muñoz, H. Moftakhari and H. Moradkhani, \"Fast Flood Extent Monitoring with SAR Change Detection Using Google Earth Engine,\" in IEEE Transactions on Geoscience and Remote Sensing, doi: 10.1109/TGRS.2023.3240097.\n<br><br>\n<b>GEE input datasets:</b>\n<br>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/180f67640a2dc9a4ad6544051f9472d0e857dcd6/Table_I.PNG?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br><br>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/main/Figure1_StudyArea-v3_05312022.png?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br><br>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/main/Figure3_Before-After-VH_05312022.png?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br><br>\n<b>Methodology flowchart:</b>\n<br>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/84a74a269353c0791ee442bbcc966e43fafd56cb/Figure2_MethodologyFlowchart.PNG?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br><br>\n<b>Sensitivity Analysis:</b>\n<br>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/47c15a03ce7c047fe92a4910df5d849023138647/Figure7_SensitivityAnalysis.PNG?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br><br>\n<b>GEE code (muti-source and multi-temporal flood monitoring): </b>\n<br>\nhttps://code.earthengine.google.com/7f4942ab0c73503e88287ad7e9187150\n<br><br>\n<b>The threshold sensitivity analysis is automated in the below GEE code:</b>\n<br>\nhttps://code.earthengine.google.com/a3fbfe338c69232a75cbcd0eb6bc0c8e\n<br><br>\nThe above scripts can be run independently. The threshold automation code identifies the optimal threshold values for use in the flood monitoring procedure.\n<br><br>\n<b>GEE code for Hurricane Harvey, east of Houston</b> Java script: \n<pre>\n// Study Area Boundaries\nvar bounds = /* color: #d63000 */ee.Geometry.Polygon(\n        [[[-94.5214452285728, 30.165244882083663],\n          [-94.5214452285728, 29.56024879238989],\n          [-93.36650748443218, 29.56024879238989],\n          [-93.36650748443218, 30.165244882083663]]], null, false);\n\n\n// [before_start,before_end,after_start,after_end,k_ndfi,k_ri,k_diff,mndwi_threshold]\nvar params = ['2017-06-01','2017-06-15','2017-08-01','2017-09-10',1.0,0.25,0.8,0.4]\n\n// SAR Input Data \nvar before_start = params[0]\nvar before_end = params[1]\n\nvar after_start = params[2]\nvar after_end = params[3]\n\nvar polarization = \"VH\"\nvar pass_direction = \"ASCENDING\"\n\n// k Coeficient Values for NDFI, RI and DII SAR Indices (Flooded Pixel Thresholding; Equation 4)\nvar k_ndfi = params[4]\nvar k_ri = params[5]\nvar k_diff = params[6]\n\n// MNDWI flooded pixels Threshold Criteria\nvar mndwi_threshold = params[7]\n\n// Datasets -----------------------------------\nvar dem = ee.Image(\"USGS/3DEP/10m\").select('elevation')\nvar slope = ee.Terrain.slope(dem)\nvar swater = ee.Image('JRC/GSW1_0/GlobalSurfaceWater').select('seasonality')\nvar collection = ee.ImageCollection('COPERNICUS/S1_GRD')\n  .filter(ee.Filter.eq('instrumentMode', 'IW'))\n  .filter(ee.Filter.listContains('transmitterReceiverPolarisation', polarization))\n  .filter(ee.Filter.eq('orbitProperties_pass', pass_direction)) \n  .filter(ee.Filter.eq('resolution_meters', 10))\n  .filterBounds(bounds)\n  .select(polarization)\n\nvar before = collection.filterDate(before_start, before_end)\nvar after = collection.filterDate(after_start, after_end)\nprint(\"before\", before)\nprint(\"after\", after)\n\n// Generating Reference and Flood Multi-temporal SAR Data ------------------------\n// Mean Before and Min After ------------------------\nvar mean_before = before.mean().clip(bounds)\nvar min_after = after.min().clip(bounds)\nvar max_after = after.max().clip(bounds)\nvar mean_after = after.mean().clip(bounds)\n\nMap.addLayer(mean_before, {min: -29.264204107025904, max: -8.938093778644141, palette: []}, \"mean_before\",0)\nMap.addLayer(min_after, {min: -29.29334290990966, max: -11.928313976797138, palette: []}, \"min_after\",1)\n\n// Flood identification ------------------------\n// NDFI ------------------------\nvar ndfi = mean_before.abs().subtract(min_after.abs())\n  .divide(mean_before.abs().add(min_after.abs()))\nvar ndfi_filtered = ndfi.focal_mean({radius: 50, kernelType: 'circle', units: 'meters'})\n\n// NDFI Normalization -----------------------\nvar ndfi_min = ndfi_filtered.reduceRegion({\n  reducer: ee.Reducer.min(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\nvar ndfi_max = ndfi_filtered.reduceRegion({\n  reducer: ee.Reducer.max(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ndfi_rang = ee.Number(ndfi_max.get('VH')).subtract(ee.Number(ndfi_min.get('VH')))\nvar ndfi_subtctMin = ndfi_filtered.subtract(ee.Number(ndfi_min.get('VH')))\nvar ndfi_norm = ndfi_subtctMin.divide(ndfi_rang)\n\nMap.addLayer(ndfi_norm, {min: 0.3862747346632676, max: 0.7632898395906615}, \"ndfi_norm\",0)\n\nvar histogram = ui.Chart.image.histogram({\n  image: ndfi_norm,\n  region: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\nprint(\"ndfi_norm Histogram\", histogram)\n\n// NDFI Thresholding ------------------------\nvar ndfi_mean = ndfi_norm.reduceRegion({\n  reducer: ee.Reducer.mean(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ndfi_std = ndfi_norm.reduceRegion({\n  reducer: ee.Reducer.stdDev(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ndfi_th = ee.Number(ndfi_mean.get('VH')).subtract(ee.Number(k_ndfi).multiply(ee.Number(ndfi_std.get('VH'))))\nprint('ndfi_th = ', ndfi_th)\n\n// Apply Thresholding Value on NDFI\nvar ndfi_filtered = ndfi_norm.lt(ndfi_th)\n\n// NDFI Masking -------------------------------------\nvar swater_mask = swater.gte(4)\nvar slope_mask = slope.lt(5)\nvar swater_clip = swater_mask.clip(bounds)\n\nvar ndfi_flooded_masked = ndfi_filtered.where(swater_mask, 0)\n  .updateMask(slope_mask.eq(1))\nvar connections = ndfi_flooded_masked.connectedPixelCount().gte(25)\nndfi_flooded_masked = ndfi_flooded_masked.updateMask(connections.eq(1))\nvar ndfi_flood = ndfi_flooded_masked.updateMask(ndfi_flooded_masked.eq(1))\n\n//------------------------------------------------------------------------\n// RI ------------------------\nvar ri = min_after.abs().divide(mean_before.abs())\nvar ri_filtered = ri.focal_mean({radius: 50, kernelType: 'circle', units: 'meters'})\n\n// RI Normalization -----------------------\nvar ri_min = ri_filtered.reduceRegion({\n  reducer: ee.Reducer.min(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ri_max = ri_filtered.reduceRegion({\n  reducer: ee.Reducer.max(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ri_rang = ee.Number(ri_max.get('VH')).subtract(ee.Number(ri_min.get('VH')))\nvar ri_subtctMin = ri_filtered.subtract(ee.Number(ri_min.get('VH')))\nvar ri_norm = ri_subtctMin.divide(ri_rang)\n\nMap.addLayer(ri_norm, {min: 0.02946113630948349, max: 0.14605562985795736}, \"ri_norm\", 0)\n\nvar histogram = ui.Chart.image.histogram({\n  image: ri_norm,\n  region: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\nprint(\"ri_norm Histogram\", histogram)\n\n// RI Thresholding ------------------------\nvar ri_mean = ri_norm.reduceRegion({\n  reducer: ee.Reducer.mean(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ri_std = ri_norm.reduceRegion({\n  reducer: ee.Reducer.stdDev(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar ri_th = ee.Number(ri_mean.get('VH')).add(ee.Number(k_ri).multiply(ee.Number(ri_std.get('VH'))))\nprint('ri_th = ', ri_th)\n\n// Apply Thresholding on RI\nvar ri_filtered = ri_norm.gt(ri_th)\n\n// RI Masking -------------------------------------\nvar ri_masked = ri_filtered.where(swater_mask, 0)\n  .updateMask(slope_mask.eq(1))\nvar ri_connections = ri_masked.connectedPixelCount().gte(25)\nri_masked = ri_masked.updateMask(ri_connections.eq(1))\nvar ri_flood = ri_masked.updateMask(ri_masked.eq(1))\n\n//------------------------------------------------------------------------\n// DII ------------------------\nvar diff_image = min_after.abs().subtract(mean_before.abs())\nvar diff_image_filtered = diff_image.focal_mean({radius: 50, kernelType: 'circle', units: 'meters'})\n\n// DII Normalization\nvar diff_image_min = diff_image_filtered.reduceRegion({\n  reducer: ee.Reducer.min(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar diff_image_max = diff_image_filtered.reduceRegion({\n  reducer: ee.Reducer.max(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar diff_image_rang = ee.Number(diff_image_max.get('VH')).subtract(ee.Number(diff_image_min.get('VH')))\nvar diff_image_subtctMin = diff_image_filtered.subtract(ee.Number(diff_image_min.get('VH')))\nvar diff_image_norm = diff_image_subtctMin.divide(diff_image_rang)\n\nMap.addLayer(diff_image_norm, {min: 0.1434809241093373, max: 0.7689478379887918}, \"diff_image_norm\", 0)\n\nvar histogram = ui.Chart.image.histogram({\n  image: diff_image_norm,\n  region: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\nprint(\"diff_image_norm Histogram\", histogram)\n\n// DII Thresholding ------------------------\nvar diff_image_mean = diff_image_norm.reduceRegion({\n  reducer: ee.Reducer.mean(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar diff_image_std = diff_image_norm.reduceRegion({\n  reducer: ee.Reducer.stdDev(),\n  geometry: bounds,\n  scale: 10,\n  maxPixels: 1e13\n})\n\nvar diff_image_th = ee.Number(diff_image_mean.get('VH')).add(ee.Number(k_diff).multiply(ee.Number(diff_image_std.get('VH'))))\nprint('diff_image_th = ', diff_image_th)\n\n// Apply Thresholding on DII\nvar diff_image_filtered = diff_image_norm.gt(diff_image_th)\n\n// DII Masking -------------------------------------\nvar diff_image_masked = diff_image_filtered.where(swater_mask, 0)\n  .updateMask(slope_mask.eq(1))\nvar diff_image_connections = diff_image_masked.connectedPixelCount().gte(25)\ndiff_image_masked = diff_image_masked.updateMask(diff_image_connections.eq(1))\nvar diff_image_flood = diff_image_masked.updateMask(diff_image_masked.eq(1))\n\n//-------------------------------------------------------------------------------------------------\n// Validation Using Sentinel-2 Surface Reflectance Imagery Data -----------------------------------\nvar sentinel2_ref = ee.ImageCollection(\"COPERNICUS/S2\")\n  .filterBounds(bounds).filterDate('2017-04-20', '2017-04-30')\nprint(sentinel2_ref,\"sentinel2_ref\")\nvar sentinel2_ref_mosaic = sentinel2_ref.mosaic()\nvar sentinel2_ref_clip = sentinel2_ref_mosaic.clip(bounds)\n\nvar sentinel2_flood = ee.ImageCollection(\"COPERNICUS/S2\")\n  .filterBounds(bounds).filterDate('2017-09-02', '2017-09-11')\nprint(sentinel2_flood,\"sentinel2_flood\")\nvar sentinel2_flood_mosaic = sentinel2_flood.mosaic()\nvar sentinel2_flood_clip = sentinel2_flood_mosaic.clip(bounds)\n\nMap.addLayer(sentinel2_ref_clip,{min:0,max:2500,bands:['B4','B3','B2']},'true color sentinel2_ref_clip',0)\nMap.addLayer(sentinel2_flood_clip,{min:0,max:2500,bands:['B4','B3','B2']},'true color sentinel2_clip',0)\n\n// Cloud Covers and Cloud Shadows Masks\nvar qa = sentinel2_flood_clip.select('QA60')\nvar radix = 2 \nvar cloudBit = 10 // this number can be found in the pixel_qa Bitmask metadata\nvar shadowBit = 11 \nvar clouds_1 = qa.bitwiseAnd(Math.pow(radix,cloudBit)).neq(0).rename('clouds')\nvar clouds_2 = qa.bitwiseAnd(Math.pow(radix,shadowBit)).neq(0).rename('shadows')\n\nMap.addLayer(clouds_1.updateMask(clouds_1.eq(1)),{palette:'crimson'},'clouds [mc]',0)\nMap.addLayer(clouds_2.updateMask(clouds_2.eq(1)),{palette:'gold'},'shadows [mc]',0)\n\nvar cloudsMasked = sentinel2_flood_clip.updateMask(clouds_1.eq(0).and(clouds_2.eq(0)))\n\n// Calculating MNDWI for Optical imagery\nvar green_s2 = cloudsMasked.select('B3')\nvar swir1_s2 = cloudsMasked.select('B11') \nvar swir2_s2 = cloudsMasked.select('B12') \n\nvar mndwi_s2 = green_s2.subtract(swir1_s2).divide(green_s2.add(swir1_s2)).rename('mndwi_s2')\n\nvar mndwi_masked = mndwi_s2.where(swater_mask, 0)\nMap.addLayer(mndwi_masked,{min:-0.5446808338165283,max:0.9092437028884888,palette:['02991c','37a3ff','ff822a']},'mndwi_masked',0)\n\nvar mndwi_filtered = mndwi_masked.gt(mndwi_threshold)\nvar mndwi_connections = mndwi_filtered.connectedPixelCount().gte(25)\nmndwi_filtered = mndwi_filtered.updateMask(mndwi_connections.eq(1))\n\nvar mndwi_flood = mndwi_filtered.updateMask(mndwi_filtered.eq(1))\n\n// Dispaly -----------------------------------\nMap.addLayer(ndfi_flood, {palette: 'red'}, 'ndfi_flood',0)\nMap.addLayer(ri_flood, {palette: '00bee9'}, \"ri_flood\",0)\nMap.addLayer(diff_image_flood, {palette: 'brown'}, \"diff_image_flood\",0)\nMap.addLayer(mndwi_flood, {palette: 'ff822a'}, \"mndwi_flood\", 0)\nMap.addLayer(swater_clip, {palette: ['20cbdc']}, \"Open Waters\", 0)\nMap.setOptions('HYBRID')\nMap.centerObject(bounds)\n\n// NDFI Pixel Analysis -----------------------------------\n// Removing Cloud Covers and Cloud Shadows from NDFI flood inundation layers\nvar ndfi_flood_RemCloud = ndfi_flood.updateMask(clouds_1.eq(0).and(clouds_2.eq(0)))\n\nvar undcldfld_ndfi = ndfi_flood_RemCloud.mask().clip(bounds)\n  .add(ndfi_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\nundcldfld_ndfi = undcldfld_ndfi.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\nundcldfld_ndfi = undcldfld_ndfi.updateMask(undcldfld_ndfi.gt(0));\n\nvar undcldfld_ndfi_pixels = ndfi_flood.updateMask(undcldfld_ndfi.eq(3));\nvar num_undcldfld_ndfi_pixels = undcldfld_ndfi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\n\nMap.addLayer(undcldfld_ndfi_pixels,{palette:['ceff0c']},'undcldfld_ndfi')\nprint(\"num_undcldfld_ndfi_pixels\", num_undcldfld_ndfi_pixels)\n\nvar compare_ndfi = ndfi_flood_RemCloud.mask().clip(bounds)\n  .add(mndwi_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\ncompare_ndfi = compare_ndfi.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\ncompare_ndfi = compare_ndfi.updateMask(compare_ndfi.gt(0));\nMap.addLayer(compare_ndfi,{min:0,max:4,palette:['dadada','0400ff','ff0000','fbff00']},'compare_ndfiANDmndwi')\n\nvar mndwi_pixels = mndwi_flood.updateMask(compare_ndfi.eq(3));\n\nMap.addLayer(mndwi_pixels,{},'mndwi_pixels')\nvar num_mndwi_pixels = mndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_mndwi_pixels\", num_mndwi_pixels)\n\nvar ndfi_pixels = ndfi_flood_RemCloud.updateMask(compare_ndfi.eq(1));\nMap.addLayer(ndfi_pixels,{},'ndfi_pixels')\nvar num_ndfi_pixels = ndfi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_ndfi_pixels\", num_ndfi_pixels)\n\nvar ndfiAndmndwi_pixels = ndfi_flood_RemCloud.updateMask(mndwi_flood);\n\nMap.addLayer(ndfiAndmndwi_pixels,{},'ndfiAndmndwi_pixels')\nvar num_ndfiAndmndwi_pixels = ndfiAndmndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_ndfiAndmndwi_pixels\", num_ndfiAndmndwi_pixels)\n\nvar ToAgre_Percent_ndfi = ee.Number(num_ndfiAndmndwi_pixels.get('VH')).divide(ee.Number(num_ndfiAndmndwi_pixels.get('VH')).add(ee.Number(num_ndfi_pixels.get('VH')).add(ee.Number(num_mndwi_pixels.get('mndwi_s2')))))\nprint(\"Total Agreement % NDFI\", ToAgre_Percent_ndfi)\n\nvar Agr_Percentage_ndfi = ee.Number(num_ndfiAndmndwi_pixels.get(\"VH\")).divide(ee.Number(num_mndwi_pixels.get(\"mndwi_s2\")).add(ee.Number(num_ndfiAndmndwi_pixels.get(\"VH\"))))\nprint(\"Agreement % NDFI = \", Agr_Percentage_ndfi)\n\n\n// RI Pixel Analysis -----------------------------------\n// Removing Cloud Covers and Cloud Shadows from RI flood inundation layers\nvar ri_flood_RemCloud = ri_flood.updateMask(clouds_1.eq(0).and(clouds_2.eq(0)))\n\nvar undcldfld_ri = ri_flood_RemCloud.mask().clip(bounds)\n  .add(ri_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\nundcldfld_ri = undcldfld_ri.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\nundcldfld_ri = undcldfld_ri.updateMask(undcldfld_ri.gt(0));\n\nvar undcldfld_ri_pixels = ri_flood.updateMask(undcldfld_ri.eq(3));\nvar num_undcldfld_ri_pixels = undcldfld_ri_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\n\nMap.addLayer(undcldfld_ri_pixels,{palette:['fbff00']},'undcldfld_ri')\nprint(\"num_undcldfld_ri_pixels\", num_undcldfld_ri_pixels)\n\nvar compare_ri = ri_flood_RemCloud.mask().clip(bounds)\n  .add(mndwi_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\ncompare_ri = compare_ri.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\ncompare_ri = compare_ri.updateMask(compare_ri.gt(0));\nMap.addLayer(compare_ri,{min:0,max:4,palette:['dadada','0400ff','ff0000','00d0ff']},'compare_riANDmndwi')\n\nvar ri_mndwi_pixels = mndwi_flood.updateMask(compare_ri.eq(3));\nMap.addLayer(ri_mndwi_pixels,{},'ri_mndwi_pixels')\nvar num_ri_mndwi_pixels = ri_mndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_ri_mndwi_pixels\", num_ri_mndwi_pixels)\n\nvar ri_pixels = ri_flood_RemCloud.updateMask(compare_ri.eq(1));\nMap.addLayer(ri_pixels,{},'ri_pixels')\nvar num_ri_pixels = ri_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_ri_pixels\", num_ri_pixels)\n\nvar riAndmndwi_pixels = ri_flood_RemCloud.updateMask(mndwi_flood);\n\nMap.addLayer(riAndmndwi_pixels,{},'riAndmndwi_pixels')\nvar num_riAndmndwi_pixels = riAndmndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_riAndmndwi_pixels\", num_riAndmndwi_pixels)\n\nvar ToAgre_Percent_ri = ee.Number(num_riAndmndwi_pixels.get('VH')).divide(ee.Number(num_riAndmndwi_pixels.get('VH')).add(ee.Number(num_ri_pixels.get('VH')).add(ee.Number(num_ri_mndwi_pixels.get('mndwi_s2')))))\nprint(\"Total Agreement % RI\", ToAgre_Percent_ri)\n\nvar Agr_Percentage_ri = ee.Number(num_riAndmndwi_pixels.get(\"VH\")).divide(ee.Number(num_ri_mndwi_pixels.get(\"mndwi_s2\")).add(ee.Number(num_riAndmndwi_pixels.get(\"VH\"))))\nprint(\"Agreement % RI = \", Agr_Percentage_ri)\n\n// DII Pixel Analysis -----------------------------------\n// Removing Cloud Covers and Cloud Shadows from DII flood inundation layers\nvar diff_flood_RemCloud = diff_image_flood.updateMask(clouds_1.eq(0).and(clouds_2.eq(0)))\n\nvar undcldfld_diff = diff_flood_RemCloud.mask().clip(bounds)\n  .add(diff_image_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\nundcldfld_diff = undcldfld_diff.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\nundcldfld_diff = undcldfld_diff.updateMask(undcldfld_diff.gt(0));\n\nvar undcldfld_diff_pixels = diff_image_flood.updateMask(undcldfld_diff.eq(3));\nvar num_undcldfld_diff_pixels = undcldfld_diff_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\n\nMap.addLayer(undcldfld_diff_pixels,{palette:['ceff0c']},'undcldfld_diff_pixels')\nprint(\"num_undcldfld_diff_pixels\", num_undcldfld_diff_pixels)\n\nvar compare_dii = diff_flood_RemCloud.mask().clip(bounds)\n  .add(mndwi_flood.mask().remap([0,1],[0,5]))\n  .rename('flood_compare')\ncompare_dii = compare_dii.remap([0,1,3,5,6,8,9],[0,1,2,3,4,5,6])\ncompare_dii = compare_dii.updateMask(compare_dii.gt(0));\nMap.addLayer(compare_dii,{min:0,max:4,palette:['dadada','0400ff','ff0000','fbff00']},'compare_diiANDmndwi')\n\nvar dii_mndwi_pixels = mndwi_flood.updateMask(compare_dii.eq(3));\nMap.addLayer(dii_mndwi_pixels,{},'dii_mndwi_pixels')\nvar num_dii_mndwi_pixels = dii_mndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_dii_mndwi_pixels\", num_dii_mndwi_pixels)\n\nvar dii_pixels = diff_flood_RemCloud.updateMask(compare_dii.eq(1));\nMap.addLayer(dii_pixels,{},'dii_pixels')\nvar num_dii_pixels = dii_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_dii_pixels\", num_dii_pixels)\n\nvar diiAndmndwi_pixels = diff_flood_RemCloud.updateMask(mndwi_flood);\nMap.addLayer(diiAndmndwi_pixels,{},'diiAndmndwi_pixels')\nvar num_diiAndmndwi_pixels = diiAndmndwi_pixels.reduceRegion({\n  reducer: ee.Reducer.sum(),              \n  geometry: bounds,\n  scale: 10, // native resolution \n  //maxPixels: 1e9,\n  bestEffort: true\n  });\nprint(\"num_diiAndmndwi_pixels\", num_diiAndmndwi_pixels)\n\nvar ToAgre_percent_dii = ee.Number(num_diiAndmndwi_pixels.get('VH')).divide(ee.Number(num_diiAndmndwi_pixels.get('VH')).add(ee.Number(num_dii_pixels.get('VH')).add(ee.Number(num_dii_mndwi_pixels.get('mndwi_s2')))))\nprint(\"Total Agreeemnt % DII\", ToAgre_percent_dii)\n\nvar Agr_Percentage_dii = ee.Number(num_diiAndmndwi_pixels.get(\"VH\")).divide(ee.Number(num_dii_mndwi_pixels.get(\"mndwi_s2\")).add(ee.Number(num_diiAndmndwi_pixels.get(\"VH\"))))\nprint(\"Agreement % DII = \", Agr_Percentage_dii)\n\n//------------------------------------------------------------------------\n//Adding Legend -----------------------------------\n// set position of panel\nvar legend = ui.Panel({\n  style: {\n    position: 'bottom-right',\n    padding: '8px 15px'\n  }\n});\n\n// Create legend title\nvar legendTitle = ui.Label({\n//  value: 'Legend',\n  style: {\n    fontWeight: 'bold',\n    fontSize: '18px',\n    margin: '0 0 4px 0',\n    padding: '0'\n    }\n});\n\n// Add the title to the panel\nlegend.add(legendTitle);\n\nvar makeRow = function(color, name) {\n\n      // Create the label that is actually the colored box.\n      var colorBox = ui.Label({\n        style: {\n          backgroundColor: '#' + color,\n          // Use padding to give the box height and width.\n          padding: '8px',\n          margin: '0 0 4px 0'\n        }\n      });\n\n      // Create the label filled with the description text.\n      var description = ui.Label({\n        value: name,\n        style: {margin: '0 0 4px 6px'}\n      });\n\n      // return the panel\n      return ui.Panel({\n        widgets: [colorBox, description],\n        layout: ui.Panel.Layout.Flow('horizontal')\n      });\n};\n\n//  Palette with the colors\nvar palette =['0400ff','fbff00','ff0000','00d0ff'];\n\n// name of the legend\nvar names = ['Only RI','Under Cloud RI', 'Only MNDWI', 'Agreement' ];\n\n// Add color and and names\nfor (var i = 0; i < 4; i++) {\n  legend.add(makeRow(palette[i], names[i]));\n  }  \n\n// add legend to map (alternatively you can also print the legend to the console)\nMap.add(legend);\n</pre>\n\n<b>Sample outputs:</b>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/main/Figure9_SAR-MNDWI_05312022.png?raw=true\" width=\"1000\" height=\"auto\"</img>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/main/Figure10_SARvsOptical_Agreement.PNG?raw=true\" width=\"1000\" height=\"auto\"</img>\n<img src =\"https://github.com/ebrahimhamidi/SAR-flood-monitoring/blob/main/Table2_Agreements.PNG?raw=true\" width=\"1000\" height=\"auto\"</img>\n<br>\n<b>Project information:</b><br>\n<br>\nThis study is partially funded by the National Science Foundation INFEWS Program (award EAR-1856054). Also, partial support was provided by USACE contract #W912HZ2020055. Brad G. Peter was supported in part by the University of Alabama CyberSeed Program and the Alabama Water Institute—Project name: WaterServ: A Cyberinfrastructure for Analysis, Visualization and Sharing of Hydrological Data. Hamed Moftakhari is also partially supported by the National Academies-Gulf Research Program Early Career Fellowship Award Year 2020 – Grant# 2000011518.","citation:dsDescriptionDate":"2022-07-24"},"citation:keyword":{"citation:keywordValue":"Flood extent monitoring, multi-source remote sensing data, multi-temporal Sentinel-1 radar data, optical remote sensing data, change detection and thresholding, Google Earth Engine, Hurricanes"},"publication":{"publicationCitation":"E. Hamidi, B. G. Peter, D. F. Muñoz, H. Moftakhari and H. Moradkhani, \"Fast Flood Extent Monitoring with SAR Change Detection Using Google Earth Engine,\" in IEEE Transactions on Geoscience and Remote Sensing, doi: 10.1109/TGRS.2023.3240097.","publicationIDType":"doi","publicationIDNumber":"10.1109/TGRS.2023.3240097","publicationURL":"https://doi.org/10.1109/TGRS.2023.3240097"},"subject":["Earth and Environmental Sciences","Engineering","Computer and Information Science"],"title":"Replication Data for: Fast flood extent monitoring with SAR change detection using Google Earth Engine","citation:notesText":"Google Earth Engine Code:\n<br>\nhttps://code.earthengine.google.com/7f4942ab0c73503e88287ad7e9187150","language":"English","dateOfDeposit":"2022-07-24","citation:depositor":"Hamidi, Ebrahim","@id":"https://doi.org/10.7910/DVN/WOTC7E","@type":["ore:Aggregation","schema:Dataset"],"schema:version":"2.1","schema:name":"Replication Data for: Fast flood extent monitoring with SAR change detection using Google Earth Engine","schema:dateModified":"2023-01-30 18:08:45.589","schema:datePublished":"2022-08-01","schema:license":"http://creativecommons.org/publicdomain/zero/1.0","dvcore:fileTermsOfAccess":{"dvcore:fileRequestAccess":true},"schema:includedInDataCatalog":"Harvard Dataverse","schema:isPartOf":{"schema:name":"SAR-based coastal flood extent estimation post-hurricane using Google Earth Engine","@id":"https://dataverse.harvard.edu/dataverse/Coastalfloodmapping","schema:isPartOf":{"schema:name":"Harvard Dataverse","@id":"https://dataverse.harvard.edu/dataverse/harvard","schema:description":"<span><span><span><h3>Share, archive, and get credit for your data. Find and cite data across all research fields.</h3></span></span></span>"}},"ore:aggregates":[{"schema:name":"Figure10_SARvsOptical_Agreement.PNG","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6587500","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6587500","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":55444,"dvcore:storageIdentifier":"s3://dvn-cloud:184101768d2-c40c2c8083a0","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"020f8abb3924c7981ee05eb580748113"}},{"schema:name":"Figure1_StudyArea-v3_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390588","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390588","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":23948662,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a94cbd-5bcc1fdff4e6","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"cac9ed08b8ec3a34cb05d99bdb560f63"}},{"schema:name":"Figure2_MethodologyFlowchart.PNG","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6589008","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6589008","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":78901,"dvcore:storageIdentifier":"s3://dvn-cloud:184104acbe7-ab52fd88e62c","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"5b47e2ec154d415707c6db060a0f8803"}},{"schema:name":"Figure3_Before-After-VH_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390593","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390593","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":15042096,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a9563a-b365e8ef6d52","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"de1209f0dfe7551031aabac9b7c50a88"}},{"schema:name":"Figure4_SAR-Indices.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390596","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390596","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":18602800,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a96424-12a8d0c54951","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"479c50857ef5cb9b36d7acd3e0c6c62d"}},{"schema:name":"Figure5_Flood_Not-Calibrated_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390591","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390591","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":1805092,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a965c0-743a54dd5fa0","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"5709401164075c7f8ee6b7dc584f7f2a"}},{"schema:name":"Figure6_MNDWI_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390589","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390589","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":3694977,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a96d49-21560bba56d4","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"ea74488b0f9e6d84a0ecb0464e20f5c7"}},{"schema:name":"Figure7_SensitivityAnalysis.PNG","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6591267","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6591267","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":41018,"dvcore:storageIdentifier":"s3://dvn-cloud:184107e7e73-7813b639d25c","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"b78cb3a69cdfd34c74bda2580e7149e1"}},{"schema:name":"Figure8_Flood-Calibrated_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390595","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390595","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":2030228,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a96f08-25c294df1349","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"6b6633bd6159a3e20e907299420ac178"}},{"schema:name":"Figure9_SAR-MNDWI_05312022.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390590","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390590","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":2624106,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a92bc5-040c09d51d69","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"fac84fc4af6d28fab8578cc7fbd383d3"}},{"schema:name":"Supplemental_Fig5-8-Compare.png","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390594","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390594","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":2311842,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a9350b-1bd15bac6a1e","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"8a256f485a71c33ddcb4c2eef61bd387"}},{"schema:name":"Table2_Agreements.PNG","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6390592","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6390592","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":20485,"dvcore:storageIdentifier":"s3://dvn-cloud:18232a93a9c-95cf79766609","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"7a61c88fa83cce8b36f66787eab9e2a7"}},{"schema:name":"Table_I.PNG","dvcore:restricted":false,"schema:version":1,"dvcore:datasetVersionId":340109,"@id":"https://dataverse.harvard.edu/file.xhtml?fileId=6591266","schema:sameAs":"https://dataverse.harvard.edu/api/access/datafile/6591266","@type":"ore:AggregatedResource","schema:fileFormat":"image/png","dvcore:filesize":26554,"dvcore:storageIdentifier":"s3://dvn-cloud:184107e6cb0-746cadb7274b","dvcore:rootDataFileId":-1,"dvcore:checksum":{"@type":"MD5","@value":"9f2ee4e5a401876d22e702bad01e55a1"}}],"schema:hasPart":["https://dataverse.harvard.edu/file.xhtml?fileId=6587500","https://dataverse.harvard.edu/file.xhtml?fileId=6390588","https://dataverse.harvard.edu/file.xhtml?fileId=6589008","https://dataverse.harvard.edu/file.xhtml?fileId=6390593","https://dataverse.harvard.edu/file.xhtml?fileId=6390596","https://dataverse.harvard.edu/file.xhtml?fileId=6390591","https://dataverse.harvard.edu/file.xhtml?fileId=6390589","https://dataverse.harvard.edu/file.xhtml?fileId=6591267","https://dataverse.harvard.edu/file.xhtml?fileId=6390595","https://dataverse.harvard.edu/file.xhtml?fileId=6390590","https://dataverse.harvard.edu/file.xhtml?fileId=6390594","https://dataverse.harvard.edu/file.xhtml?fileId=6390592","https://dataverse.harvard.edu/file.xhtml?fileId=6591266"]},"@context":{"author":"http://purl.org/dc/terms/creator","authorIdentifier":"http://purl.org/spar/datacite/AgentIdentifier","authorIdentifierScheme":"http://purl.org/spar/datacite/AgentIdentifierScheme","citation":"https://dataverse.org/schema/citation/","dateOfDeposit":"http://purl.org/dc/terms/dateSubmitted","dcterms":"http://purl.org/dc/terms/","dvcore":"https://dataverse.org/schema/core#","language":"http://purl.org/dc/terms/language","ore":"http://www.openarchives.org/ore/terms/","publication":"http://purl.org/dc/terms/isReferencedBy","publicationCitation":"http://purl.org/dc/terms/bibliographicCitation","publicationIDNumber":"http://purl.org/spar/datacite/ResourceIdentifier","publicationIDType":"http://purl.org/spar/datacite/ResourceIdentifierScheme","publicationURL":"https://schema.org/distribution","schema":"http://schema.org/","subject":"http://purl.org/dc/terms/subject","title":"http://purl.org/dc/terms/title"}}