danielle-losos commited on
Commit
b26ff6e
·
verified ·
1 Parent(s): c0aaf20

Delete historical_fires.py

Browse files
Files changed (1) hide show
  1. 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
- )