Spaces:
Sleeping
Sleeping
Delete historical_fires.py
Browse files- historical_fires.py +0 -429
historical_fires.py
DELETED
|
@@ -1,429 +0,0 @@
|
|
| 1 |
-
import ee
|
| 2 |
-
import geemap
|
| 3 |
-
import solara
|
| 4 |
-
import ipywidgets as widgets
|
| 5 |
-
#from NBR_calculations import GcalcNBR, VcalcNBR, LcalcNBR, ScalcNBR, GcalcCCsingle
|
| 6 |
-
import requests
|
| 7 |
-
|
| 8 |
-
# Bit-masking
|
| 9 |
-
BitMask_0 = 1 << 0
|
| 10 |
-
BitMask_1 = 1 << 1
|
| 11 |
-
BitMask_2 = 1 << 2
|
| 12 |
-
BitMask_3 = 1 << 3
|
| 13 |
-
BitMask_4 = 1 << 4
|
| 14 |
-
BitMask_5 = 1 << 5
|
| 15 |
-
BitMask_6 = 1 << 6
|
| 16 |
-
BitMask_7 = 1 << 7
|
| 17 |
-
BitMask_8 = 1 << 8
|
| 18 |
-
BitMask_9 = 1 << 9
|
| 19 |
-
|
| 20 |
-
def GcalcCCsingle (goesImg):
|
| 21 |
-
|
| 22 |
-
fireDQF = goesImg.select('DQF').int()
|
| 23 |
-
CMI_QF3 = goesImg.select('DQF_C03').int()
|
| 24 |
-
CMI_QF6 = goesImg.select('DQF_C06').int()
|
| 25 |
-
|
| 26 |
-
#Right now, cloud mask is excluding clouds and water; active fire, bad data and fire free are unmasked. NBR mask exlcudes fire
|
| 27 |
-
F_Mask = fireDQF.eq(0)
|
| 28 |
-
C_Mask = (fireDQF.lt(2).Or(fireDQF.gt(2))).rename('C_Mask')
|
| 29 |
-
#.And(CMI_QF3.lt(2)).And(CMI_QF6.lt(2)).rename('C_Mask')
|
| 30 |
-
QF_Mask = (fireDQF.eq(1).Or(fireDQF.gt(3)))\
|
| 31 |
-
.And(CMI_QF3.lt(2)).And(CMI_QF6.lt(2)).rename('QFmask')
|
| 32 |
-
|
| 33 |
-
GOESmasked = goesImg.select(['CMI_C03','CMI_C06']).updateMask(QF_Mask)
|
| 34 |
-
NBRmasked = GOESmasked.normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
|
| 35 |
-
cloudMasked = goesImg.select('CMI_C03').updateMask(C_Mask).toFloat().rename('CC')
|
| 36 |
-
fireMasked = goesImg.select('CMI_C03').updateMask(F_Mask).toFloat().rename('FC')
|
| 37 |
-
|
| 38 |
-
return goesImg.addBands([NBRmasked,cloudMasked, fireMasked,QF_Mask,C_Mask])
|
| 39 |
-
|
| 40 |
-
'''Parameter Array Name Value Bit(s) = Value
|
| 41 |
-
Sun Glint QF1 Surface Reflectance None 6-7 = 00
|
| 42 |
-
Low Sun Mask QF1 Surface Reflectance High 5 = 0
|
| 43 |
-
Day/Night QF1 Surface Reflectance Day 4 =0
|
| 44 |
-
Cloud Detection QF1 Surface Reflectance Confident Clear 2-3 = 00 or Problably Clear 2-3 = 01
|
| 45 |
-
Cloud Mask Quality QF1 Surface Reflectance High or Medium 0-1 = 10 or 11
|
| 46 |
-
Snow/Ice QF2 Surface Reflectance No Snow or Ice 5 = 0
|
| 47 |
-
Cloud Shadow QF2 Surface Reflectance No Cloud Shadow 3 = 0
|
| 48 |
-
LandWater QF2 Surface Reflectance Land, Snow, Arctic, Antarctic or Greenland, Desert 0-2 = 011, 100, 101, 110, 111
|
| 49 |
-
Thin Cirrus Flag QF7 Surface Reflectance No Thin Cirrus 4 = 0
|
| 50 |
-
Aerosol Quantity QF7 Surface Reflectance Climatology, Low or Medium 2-3 = 00, 01 or 10
|
| 51 |
-
Adjacent to Cloud QF7 Surface Reflectance Not Adjacent to Cloud 1 = 0'''
|
| 52 |
-
|
| 53 |
-
def VcalcNBR (VIIRSimg):
|
| 54 |
-
|
| 55 |
-
QF1 = VIIRSimg.select('QF1').int()
|
| 56 |
-
QF2 = VIIRSimg.select('QF2').int()
|
| 57 |
-
QF7 = VIIRSimg.select('QF7').int()
|
| 58 |
-
|
| 59 |
-
QF_Mask = (QF1.bitwiseAnd(BitMask_3).eq(0)).And\
|
| 60 |
-
((QF2.bitwiseAnd(BitMask_2).eq(4)).Or((QF2.bitwiseAnd(BitMask_1).eq(0)))).And\
|
| 61 |
-
(QF2.bitwiseAnd(BitMask_5).eq(0)).rename('QFmask');
|
| 62 |
-
|
| 63 |
-
VIIRSm = VIIRSimg.select(['I2','M11']).updateMask(QF_Mask);
|
| 64 |
-
NBR = VIIRSm.normalizedDifference(['I2','M11']).toFloat().rename('NBR')
|
| 65 |
-
return VIIRSimg.addBands(NBR).addBands(QF_Mask)#.set('avgNBR', avgNBR)
|
| 66 |
-
|
| 67 |
-
''' Bit 1: Dilated Cloud
|
| 68 |
-
Bit 2: Cirrus (high confidence)
|
| 69 |
-
Bit 3: Cloud
|
| 70 |
-
Bit 4: Cloud Shadow
|
| 71 |
-
Bit 5: Snow
|
| 72 |
-
Bit 6: Clear (0: Cloud or Dilated Cloud bits are set, 1: Cloud and Dilated Cloud bits are not set)
|
| 73 |
-
Bit 7: Water
|
| 74 |
-
Bits 8-9: Cloud Confidence (0: None, 1: Low, 2: Medium, 3: High)
|
| 75 |
-
Bits 10-11: Cloud Shadow Confidence (0: None, 1: Low, 2: Medium, 3: High)
|
| 76 |
-
Bits 12-13: Snow/Ice Confidence (0: None, 1: Low, 2: Medium, 3: High)
|
| 77 |
-
Bits 14-15: Cirrus Confidence (0: None, 1: Low, 2: Medium, 3: High)'''
|
| 78 |
-
|
| 79 |
-
def LcalcNBR (LSimg):
|
| 80 |
-
QApixel = LSimg.select('QA_PIXEL').int()
|
| 81 |
-
QF_Mask =(QApixel.bitwiseAnd(BitMask_3).eq(0)).And\
|
| 82 |
-
(QApixel.bitwiseAnd(BitMask_5).eq(0)).And\
|
| 83 |
-
(QApixel.bitwiseAnd(BitMask_7).eq(0)).rename('QFmask');
|
| 84 |
-
|
| 85 |
-
LSmasked = LSimg.select(['SR_B5','SR_B7']).updateMask(QF_Mask);
|
| 86 |
-
NBR = LSmasked.normalizedDifference(['SR_B5','SR_B7']).toFloat().rename('NBR')
|
| 87 |
-
return LSimg.addBands(NBR).addBands(QF_Mask)#.set('avgNBR', avgNBR)
|
| 88 |
-
|
| 89 |
-
''' 1 Saturated or defective
|
| 90 |
-
2 Dark Area Pixels
|
| 91 |
-
3 Cloud Shadows
|
| 92 |
-
4 Vegetation
|
| 93 |
-
5 Bare Soils
|
| 94 |
-
6 Water
|
| 95 |
-
7 Clouds Low Probability / Unclassified
|
| 96 |
-
8 Clouds Medium Probability
|
| 97 |
-
9 Clouds High Probability
|
| 98 |
-
10 Cirrus
|
| 99 |
-
11 Snow / Ice'''
|
| 100 |
-
|
| 101 |
-
def ScalcNBR (sentImg):
|
| 102 |
-
SCL = sentImg.select('SCL');
|
| 103 |
-
QF_Mask =(SCL.neq(6)).And\
|
| 104 |
-
(SCL.neq(8)).And\
|
| 105 |
-
(SCL.neq(9)).And\
|
| 106 |
-
(SCL.neq(11))\
|
| 107 |
-
.rename('QFmask');
|
| 108 |
-
sentMasked = sentImg.select(['B8A','B12']).updateMask(QF_Mask); #B8 is another option- broadband NIR
|
| 109 |
-
NBR = sentMasked.normalizedDifference(['B8A','B12']).toFloat().rename('NBR')
|
| 110 |
-
return sentImg.addBands(NBR).addBands(QF_Mask).addBands(SCL)#.set('avgNBR', avgNBR)
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
fireList = ["North Complex", "Dixie", "Cameron Peak", "August Complex", "South Fork"]
|
| 114 |
-
selected_fire = solara.reactive(fireList[4])
|
| 115 |
-
selected_days = solara.reactive(25) #30
|
| 116 |
-
dNBRvisParams = {'min': 0.0,'max': 0.8, 'palette': ['green', 'yellow','orange','red']}
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
class Map(geemap.Map):
|
| 120 |
-
def __init__(self, **kwargs):
|
| 121 |
-
super().__init__(**kwargs)
|
| 122 |
-
self.add_basemap('OpenStreetMap')
|
| 123 |
-
self.customize_ee_data(selected_fire.value, selected_days.value)
|
| 124 |
-
self.add_selector()
|
| 125 |
-
self.add_intSlider()
|
| 126 |
-
self.add_dwnldButton()
|
| 127 |
-
self.add("layer_manager")
|
| 128 |
-
self.remove("draw_control")
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
def customize_ee_data(self, fire, elapDays):
|
| 132 |
-
elapDayNum = ee.Number(elapDays)
|
| 133 |
-
elapDay_plusOne = elapDayNum.add(ee.Number(1))
|
| 134 |
-
|
| 135 |
-
north_startDate = ee.Date('2020-08-16')
|
| 136 |
-
dixie_startDate = ee.Date('2021-07-13')
|
| 137 |
-
cam_startDate = ee.Date('2020-08-13')
|
| 138 |
-
aug_startDate = ee.Date('2020-08-15')
|
| 139 |
-
sfork_startDate = ee.Date('2024-05-25')
|
| 140 |
-
|
| 141 |
-
north_complex_bb = ee.Geometry.BBox(-121.616097, 39.426723, -120.668526, 40.030845)
|
| 142 |
-
dixie_bb = ee.Geometry.BBox(-121.680467, 39.759303, -120.065477, 40.873387)
|
| 143 |
-
cam_peak_bb = ee.Geometry.BBox(-106.014784, 40.377907, -105.116651, 40.822094)
|
| 144 |
-
aug_complex_bb = ee.Geometry.BBox(-123.668726, 39.337654, -122.355860, 40.498304)
|
| 145 |
-
sfork_bb = ee.Geometry.BBox(-106.192, 33.1, -105.065, 33.782)
|
| 146 |
-
|
| 147 |
-
def calc_nbr(pre_start, pre_stop, post_start, post_stop, bbox, goes):
|
| 148 |
-
def MergeBands (eachImage):
|
| 149 |
-
oneImage = ee.Image.cat(eachImage.get('CMI'), eachImage.get('FDC'))
|
| 150 |
-
return oneImage
|
| 151 |
-
displacementImg18 = ee.Image.load('projects/ee-losos/assets/G18-F-meter-offset_GEE')
|
| 152 |
-
y_dif = displacementImg18.select([1])
|
| 153 |
-
x_dif = displacementImg18.select([0]).multiply(-1)
|
| 154 |
-
displacement18 = ee.Image([x_dif, y_dif])
|
| 155 |
-
|
| 156 |
-
displacementImg16 = ee.Image.load('projects/ee-losos/assets/G16-F-meter-offset_GEE')
|
| 157 |
-
y_dif = displacementImg16.select([1])
|
| 158 |
-
x_dif = displacementImg16.select([0]).multiply(-1)
|
| 159 |
-
displacement16 = ee.Image([x_dif, y_dif]);
|
| 160 |
-
|
| 161 |
-
preCMIcol = ee.ImageCollection(f"NOAA/GOES/{goes}/MCMIPF").filter(ee.Filter.date(pre_start, pre_stop))\
|
| 162 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
|
| 163 |
-
preFDCcol = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(pre_start, pre_stop))\
|
| 164 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
|
| 165 |
-
postCMIcol = ee.ImageCollection(f"NOAA/GOES/{goes}/MCMIPF").filter(ee.Filter.date(post_start, post_stop))\
|
| 166 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
|
| 167 |
-
postFDCcol = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(post_start, post_stop))\
|
| 168 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
|
| 169 |
-
|
| 170 |
-
prejoinedGOES = ee.Join.inner('CMI','FDC').apply(
|
| 171 |
-
primary = preCMIcol,
|
| 172 |
-
secondary = preFDCcol,
|
| 173 |
-
condition = ee.Filter.maxDifference(
|
| 174 |
-
difference = 10, #milliseconds
|
| 175 |
-
leftField = 'system:time_start',
|
| 176 |
-
rightField = 'system:time_start',))
|
| 177 |
-
preMiddayGOEScol = ee.ImageCollection(prejoinedGOES.map(lambda object: MergeBands(object)))
|
| 178 |
-
preMiddayGOEScol = preMiddayGOEScol.map(GcalcCCsingle)
|
| 179 |
-
pre_meanNBR = preMiddayGOEScol.select(['NBR']).mean()
|
| 180 |
-
pre_meanNBR = pre_meanNBR.multiply(1.18).subtract(0.12)
|
| 181 |
-
|
| 182 |
-
postjoinedGOES = ee.Join.inner('CMI','FDC').apply(
|
| 183 |
-
primary = postCMIcol,
|
| 184 |
-
secondary = postFDCcol,
|
| 185 |
-
condition = ee.Filter.maxDifference(
|
| 186 |
-
difference = 10, #milliseconds
|
| 187 |
-
leftField = 'system:time_start',
|
| 188 |
-
rightField = 'system:time_start',))
|
| 189 |
-
postMiddayGOEScol = ee.ImageCollection(postjoinedGOES.map(lambda object: MergeBands(object)))
|
| 190 |
-
postMiddayGOEScol = postMiddayGOEScol.map(GcalcCCsingle)
|
| 191 |
-
post_meanNBR = postMiddayGOEScol.select(['NBR']).mean()
|
| 192 |
-
post_meanNBR = post_meanNBR.multiply(1.18).subtract(0.12)
|
| 193 |
-
|
| 194 |
-
dNBR_goes17 = pre_meanNBR.subtract(post_meanNBR).select('NBR')
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
#GOES-16
|
| 198 |
-
preCMIcol = ee.ImageCollection("NOAA/GOES/16/MCMIPF").filter(ee.Filter.date(pre_start, pre_stop))\
|
| 199 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
|
| 200 |
-
preFDCcol = ee.ImageCollection("NOAA/GOES/16/FDCF").filter(ee.Filter.date(pre_start, pre_stop))\
|
| 201 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
|
| 202 |
-
|
| 203 |
-
prejoinedGOES = ee.Join.inner('CMI','FDC').apply(
|
| 204 |
-
primary = preCMIcol,
|
| 205 |
-
secondary = preFDCcol,
|
| 206 |
-
condition = ee.Filter.maxDifference(
|
| 207 |
-
difference = 10, #milliseconds
|
| 208 |
-
leftField = 'system:time_start',
|
| 209 |
-
rightField = 'system:time_start',))
|
| 210 |
-
preMiddayGOEScol = ee.ImageCollection(prejoinedGOES.map(lambda object: MergeBands(object)))
|
| 211 |
-
preMiddayGOEScol = preMiddayGOEScol.map(GcalcCCsingle)
|
| 212 |
-
pre_meanNBR = preMiddayGOEScol.select(['NBR']).mean()
|
| 213 |
-
pre_meanNBR = pre_meanNBR.multiply(1.18).subtract(0.12)
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
postCMIcol = ee.ImageCollection("NOAA/GOES/16/MCMIPF").filter(ee.Filter.date(post_start, post_stop))\
|
| 217 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
|
| 218 |
-
postFDCcol = ee.ImageCollection("NOAA/GOES/16/FDCF").filter(ee.Filter.date(post_start, post_stop))\
|
| 219 |
-
.filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
|
| 220 |
-
|
| 221 |
-
postjoinedGOES = ee.Join.inner('CMI','FDC').apply(
|
| 222 |
-
primary = postCMIcol,
|
| 223 |
-
secondary = postFDCcol,
|
| 224 |
-
condition = ee.Filter.maxDifference(
|
| 225 |
-
difference = 10, #milliseconds
|
| 226 |
-
leftField = 'system:time_start',
|
| 227 |
-
rightField = 'system:time_start',))
|
| 228 |
-
postMiddayGOEScol = ee.ImageCollection(postjoinedGOES.map(lambda object: MergeBands(object)))
|
| 229 |
-
postMiddayGOEScol = postMiddayGOEScol.map(GcalcCCsingle)
|
| 230 |
-
post_meanNBR = postMiddayGOEScol.select(['NBR']).mean()
|
| 231 |
-
post_meanNBR = post_meanNBR.multiply(1.18).subtract(0.12)
|
| 232 |
-
|
| 233 |
-
dNBR_goes16 = pre_meanNBR.subtract(post_meanNBR).select('NBR')
|
| 234 |
-
|
| 235 |
-
dNBRclip_goes17= dNBR_goes17.clip(bbox)
|
| 236 |
-
dNBRclip_goes16= dNBR_goes16.clip(bbox)
|
| 237 |
-
dNBRdisp_goes17 = dNBRclip_goes17.displace(displacement18, 'bicubic')
|
| 238 |
-
dNBRdisp_goes16 = dNBRclip_goes16.displace(displacement16, 'bicubic')
|
| 239 |
-
dNBRgoes_compos = ee.ImageCollection([dNBRdisp_goes17,dNBRdisp_goes16]).mean()
|
| 240 |
-
|
| 241 |
-
#ACTIVE fire
|
| 242 |
-
activeFire18 = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(pre_stop, post_stop))
|
| 243 |
-
activeFire16 = ee.ImageCollection(f"NOAA/GOES/16/FDCF").filter(ee.Filter.date(pre_stop, post_stop))
|
| 244 |
-
sumFRP18 = activeFire18.select('Power').sum().rename('sumFRP')
|
| 245 |
-
sumFRP16 = activeFire16.select('Power').sum().rename('sumFRP')
|
| 246 |
-
maskNoFire18 = sumFRP18.gt(200).displace(displacement18, 'bicubic')
|
| 247 |
-
maskNoFire16 = sumFRP16.gt(200).displace(displacement16, 'bicubic')
|
| 248 |
-
maskNoFire = ee.ImageCollection([maskNoFire18,maskNoFire16]).sum().gt(0)
|
| 249 |
-
|
| 250 |
-
'''
|
| 251 |
-
activeSNPP = ee.ImageCollection("NASA/LANCE/SNPP_VIIRS/C2").filter(ee.Filter.date(pre_stop, post_stop))
|
| 252 |
-
activeNOAA20 = ee.ImageCollection("NASA/LANCE/NOAA20_VIIRS/C2").filter(ee.Filter.date(pre_stop, post_stop))
|
| 253 |
-
sumFRP_SNPP = activeSNPP.select('confidence').max().rename('sumFRP')
|
| 254 |
-
sumFRP_NOAA20 = activeNOAA20.select('confidence').max().rename('sumFRP')
|
| 255 |
-
#maskNoFire = ee.ImageCollection([sumFRP_SNPP,sumFRP_NOAA20]).sum().gt(0)
|
| 256 |
-
maskNoFire = sumFRP_SNPP.gt(0)
|
| 257 |
-
'''
|
| 258 |
-
|
| 259 |
-
#VIIRS
|
| 260 |
-
preVIIRSimg = ee.ImageCollection("NASA/VIIRS/002/VNP09GA").filter(ee.Filter.date(pre_start, pre_stop)).mean()
|
| 261 |
-
#postVIIRSimgCol = ee.ImageCollection("NASA/VIIRS/002/VNP09GA").filter(ee.Filter.date(post_start, post_stop))
|
| 262 |
-
postVIIRSimgCol = ee.ImageCollection("NASA/VIIRS/002/VNP09GA").filter(ee.Filter.date(post_start, post_stop)) #TO FIX ON JUNE 18 sfork_startDate.advance(24, 'day'), sfork_startDate.advance(25,'day')
|
| 263 |
-
|
| 264 |
-
#Landsat
|
| 265 |
-
prelandsat8col = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
|
| 266 |
-
postlandsat8col = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2").filterDate(post_start, post_stop).filterBounds(bbox)
|
| 267 |
-
prelandsat9col = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
|
| 268 |
-
postlandsat9col = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2").filterDate(post_start, post_stop).filterBounds(bbox)
|
| 269 |
-
prelandsatcol = prelandsat8col.merge(prelandsat9col)
|
| 270 |
-
postlandsatcol = postlandsat8col.merge(postlandsat9col)
|
| 271 |
-
|
| 272 |
-
#Sentinel
|
| 273 |
-
presentCol = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
|
| 274 |
-
postsentCol = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(post_start, post_stop).filterBounds(bbox) #TO FIX on JULY 5: sfork_startDate.advance(32, 'day'), sfork_startDate.advance(33,'day')
|
| 275 |
-
olderPostSentCol = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(sfork_startDate.advance(37, 'day'), sfork_startDate.advance(38,'day')).filterBounds(bbox)
|
| 276 |
-
#SAR
|
| 277 |
-
#SARimg = ee.Image('projects/ovcrge-ssec-burn-scar-map-c116/assets/burned_20200907_20200919_test')
|
| 278 |
-
#SARmask = SARimg.eq(1)
|
| 279 |
-
if postVIIRSimgCol.size().getInfo() > 0:
|
| 280 |
-
postVIIRSimg = postVIIRSimgCol.mean()
|
| 281 |
-
preVIIRSimg = VcalcNBR(preVIIRSimg)
|
| 282 |
-
postVIIRSimg = VcalcNBR(postVIIRSimg)
|
| 283 |
-
dNBR_viirs = preVIIRSimg.subtract(postVIIRSimg).select('NBR')
|
| 284 |
-
dNBRclip_viirs = dNBR_viirs.clip(bbox)
|
| 285 |
-
else:
|
| 286 |
-
dNBR_composite = dNBRgoes_compos
|
| 287 |
-
if postsentCol.size().getInfo() > 0:
|
| 288 |
-
presentMean = presentCol.mean()
|
| 289 |
-
postsentMean = postsentCol.mean()
|
| 290 |
-
postsent2Mean = olderPostSentCol.mean()
|
| 291 |
-
presentImg = ScalcNBR(presentMean)
|
| 292 |
-
postsentImg = ScalcNBR(postsentMean)
|
| 293 |
-
postsentImg2 = ScalcNBR(postsent2Mean)
|
| 294 |
-
postSentCombo = ee.ImageCollection([postsentImg,postsentImg2]).mosaic()
|
| 295 |
-
dnbr_sent = presentImg.subtract(postSentCombo).multiply(1.3).add(0.05).select('NBR')
|
| 296 |
-
dNBRclip_sent = dnbr_sent.clip(bbox)
|
| 297 |
-
dNBR_composite = ee.ImageCollection([dNBRgoes_compos,dNBRclip_viirs,dNBRclip_sent]).mosaic()
|
| 298 |
-
elif postlandsatcol.size().getInfo() > 0:
|
| 299 |
-
print(postlandsatcol.size().getInfo())
|
| 300 |
-
prelandsat = prelandsatcol.mean()
|
| 301 |
-
prelandsatImg = LcalcNBR(prelandsat)
|
| 302 |
-
postlandsat = postlandsatcol.mean()
|
| 303 |
-
postlandsatImg = LcalcNBR(postlandsat)
|
| 304 |
-
dNBR_landsat = prelandsatImg.subtract(postlandsatImg).multiply(3.23).add(0.01).select('NBR')
|
| 305 |
-
dNBRclip_ls = dNBR_landsat.clip(bbox)
|
| 306 |
-
dNBR_composite = ee.ImageCollection([dNBRgoes_compos,dNBRclip_viirs,dNBRclip_ls]).mosaic()
|
| 307 |
-
else:
|
| 308 |
-
dNBR_composite = ee.ImageCollection([dNBRgoes_compos,dNBRclip_viirs]).mosaic()
|
| 309 |
-
|
| 310 |
-
masked_compos = dNBR_composite.updateMask(maskNoFire) #(SARmask)
|
| 311 |
-
#doubleMasked_compos = masked_compos.updateMask(maskNoFire)
|
| 312 |
-
doubleMasked_compos = masked_compos.mask(masked_compos.mask()).float()
|
| 313 |
-
downloadArgs = {'name': 'VIIRS_burnMap',
|
| 314 |
-
'crs': 'EPSG:4326',
|
| 315 |
-
'scale': 60,
|
| 316 |
-
'region': bbox}
|
| 317 |
-
url = doubleMasked_compos.getDownloadURL(downloadArgs)
|
| 318 |
-
|
| 319 |
-
print(url)
|
| 320 |
-
noDataVal = -9999
|
| 321 |
-
unmaskedImage = doubleMasked_compos.unmask(noDataVal, False)
|
| 322 |
-
|
| 323 |
-
task = ee.batch.Export.image.toDrive(**{
|
| 324 |
-
'image': unmaskedImage,
|
| 325 |
-
'description': "Composite_burnMap6",
|
| 326 |
-
'folder': "Earth Engine Outputs",
|
| 327 |
-
'fileNamePrefix': "Composite_burnMap_noData_VIIRS_June18_espg3857_60m",
|
| 328 |
-
'region': bbox,
|
| 329 |
-
'crs': 'EPSG:3857',
|
| 330 |
-
'scale': 60,})
|
| 331 |
-
#task.start()
|
| 332 |
-
return masked_compos
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
self.clear_specific_layers()
|
| 336 |
-
|
| 337 |
-
if fire == "North Complex":
|
| 338 |
-
north_complex = calc_nbr(north_startDate.advance(-7, 'day'), north_startDate, north_startDate.advance(elapDayNum, 'day'), north_startDate.advance(elapDay_plusOne,'day'), north_complex_bb, 17)
|
| 339 |
-
self.addLayer(north_complex, dNBRvisParams, 'North Complex GOES NBR', True)
|
| 340 |
-
self.centerObject(north_complex_bb, 9)
|
| 341 |
-
file = north_complex
|
| 342 |
-
elif fire == "Dixie":
|
| 343 |
-
dixie = calc_nbr(dixie_startDate.advance(-7, 'day'), dixie_startDate, dixie_startDate.advance(elapDayNum, 'day'), dixie_startDate.advance(elapDay_plusOne,'day'), dixie_bb, 17)
|
| 344 |
-
self.addLayer(dixie, dNBRvisParams, 'Dixie Complex GOES NBR', True)
|
| 345 |
-
self.centerObject(dixie_bb, 9)
|
| 346 |
-
file = dixie
|
| 347 |
-
elif fire == "Cameron Peak":
|
| 348 |
-
cam_peak = calc_nbr(cam_startDate.advance(-7, 'day'), cam_startDate, cam_startDate.advance(elapDayNum, 'day'), cam_startDate.advance(elapDay_plusOne,'day'), cam_peak_bb, 17)
|
| 349 |
-
self.addLayer(cam_peak, dNBRvisParams, 'Cameron Peak GOES NBR', True)
|
| 350 |
-
self.centerObject(cam_peak_bb, 9)
|
| 351 |
-
file = cam_peak
|
| 352 |
-
elif fire == "August Complex":
|
| 353 |
-
aug_complex = calc_nbr(aug_startDate.advance(-7, 'day'), aug_startDate, aug_startDate.advance(elapDayNum, 'day'), aug_startDate.advance(elapDay_plusOne,'day'), aug_complex_bb, 17)
|
| 354 |
-
self.addLayer(aug_complex, dNBRvisParams, 'August Complex GOES NBR', True)
|
| 355 |
-
self.centerObject(aug_complex_bb, 9)
|
| 356 |
-
file = aug_complex
|
| 357 |
-
elif fire == "South Fork":
|
| 358 |
-
sfork = calc_nbr(sfork_startDate.advance(-7, 'day'), sfork_startDate, sfork_startDate.advance(elapDayNum, 'day'), sfork_startDate.advance(elapDay_plusOne,'day'), sfork_bb, 18)
|
| 359 |
-
self.addLayer(sfork, dNBRvisParams, 'South Fork GOES NBR', True)
|
| 360 |
-
self.centerObject(sfork_bb, 9)
|
| 361 |
-
file = sfork
|
| 362 |
-
|
| 363 |
-
def clear_specific_layers(self):
|
| 364 |
-
layers_to_keep = ['OpenStreetMap']
|
| 365 |
-
layers = list(self.layers)
|
| 366 |
-
for layer in layers:
|
| 367 |
-
if layer.name not in layers_to_keep:
|
| 368 |
-
self.remove_layer(layer)
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
def add_selector(self):
|
| 372 |
-
selector = widgets.Dropdown(options=fireList, value="South Fork", description='Wildfire Case Study:', style={'description_width': '125px'}, layout=widgets.Layout(width='400px'))
|
| 373 |
-
|
| 374 |
-
def on_selector_change(change):
|
| 375 |
-
if change['name'] == 'value':
|
| 376 |
-
selected_fire.value = change['new']
|
| 377 |
-
self.customize_ee_data(selected_fire.value, selected_days.value)
|
| 378 |
-
|
| 379 |
-
selector.observe(on_selector_change, names='value')
|
| 380 |
-
self.add_widget(selector, position="topleft")
|
| 381 |
-
|
| 382 |
-
def add_intSlider(self):
|
| 383 |
-
slider = widgets.IntSlider(value=selected_days.value,min=1,max=40,step=1,description='Elapsed days:',style={'description_width': '125px'}, layout=widgets.Layout(width='400px'))
|
| 384 |
-
|
| 385 |
-
def on_slider_change(change):
|
| 386 |
-
if change['name'] == 'value':
|
| 387 |
-
selected_days.value = change['new']
|
| 388 |
-
self.customize_ee_data(selected_fire.value, selected_days.value)
|
| 389 |
-
|
| 390 |
-
slider.observe(on_slider_change, names='value')
|
| 391 |
-
self.add_widget(slider, position="topleft")
|
| 392 |
-
|
| 393 |
-
def add_dwnldButton(self):
|
| 394 |
-
button = widgets.Button(description='Download',icon='cloud-arrow-down')
|
| 395 |
-
|
| 396 |
-
#def on_button_click(change, file):
|
| 397 |
-
# if change['name'] == 'value':
|
| 398 |
-
# selected_days.value = change['new']
|
| 399 |
-
# self.download_ee_image(file, "trial_file.tif", scale=30)
|
| 400 |
-
def on_button_click(b):
|
| 401 |
-
# Get the currently selected fire and elapsed days
|
| 402 |
-
fire = selected_fire.value
|
| 403 |
-
elapDays = selected_days.value
|
| 404 |
-
|
| 405 |
-
# Customize the EE data and download the image
|
| 406 |
-
file = self.customize_ee_data(fire, elapDays)
|
| 407 |
-
#self.download_ee_image(file, f"{fire}_NBR_{elapDays}days.tif", scale=30)
|
| 408 |
-
|
| 409 |
-
button.observe(on_button_click)
|
| 410 |
-
self.add_widget(button, position="topleft")
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
@solara.component
|
| 415 |
-
def Page():
|
| 416 |
-
|
| 417 |
-
with solara.Column(align="center"):
|
| 418 |
-
markdown = """
|
| 419 |
-
## Historical Western US wildfires from 2020-2021 """
|
| 420 |
-
solara.Markdown(markdown)
|
| 421 |
-
|
| 422 |
-
# Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
|
| 423 |
-
with solara.Column(style={"isolation": "isolate"}):
|
| 424 |
-
map_widget = Map.element(
|
| 425 |
-
center=[39, -120.5],
|
| 426 |
-
zoom=8,
|
| 427 |
-
height="600px",
|
| 428 |
-
toolbar_ctrl=False
|
| 429 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|