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

Delete current_fires.py

Browse files
Files changed (1) hide show
  1. current_fires.py +0 -399
current_fires.py DELETED
@@ -1,399 +0,0 @@
1
- import ee
2
- import geemap
3
- import solara
4
- import ipywidgets as widgets
5
- import datetime
6
-
7
- #from NBR_calculations import GcalcNBR, VcalcNBR, LcalcNBR, ScalcNBR, GcalcCCsingle
8
- import requests
9
-
10
- # Bit-masking
11
- BitMask_0 = 1 << 0
12
- BitMask_1 = 1 << 1
13
- BitMask_2 = 1 << 2
14
- BitMask_3 = 1 << 3
15
- BitMask_4 = 1 << 4
16
- BitMask_5 = 1 << 5
17
- BitMask_6 = 1 << 6
18
- BitMask_7 = 1 << 7
19
- BitMask_8 = 1 << 8
20
- BitMask_9 = 1 << 9
21
-
22
- def GcalcCCsingle (goesImg):
23
-
24
- fireDQF = goesImg.select('DQF').int()
25
- CMI_QF3 = goesImg.select('DQF_C03').int()
26
- CMI_QF6 = goesImg.select('DQF_C06').int()
27
-
28
- #Right now, cloud mask is excluding clouds and water; active fire, bad data and fire free are unmasked. NBR mask exlcudes fire
29
- F_Mask = fireDQF.eq(0)
30
- C_Mask = (fireDQF.lt(2).Or(fireDQF.gt(2))).rename('C_Mask')
31
- #.And(CMI_QF3.lt(2)).And(CMI_QF6.lt(2)).rename('C_Mask')
32
- QF_Mask = (fireDQF.eq(1).Or(fireDQF.gt(3)))\
33
- .And(CMI_QF3.lt(2)).And(CMI_QF6.lt(2)).rename('QFmask')
34
-
35
- GOESmasked = goesImg.select(['CMI_C03','CMI_C06']).updateMask(QF_Mask)
36
- NBRmasked = GOESmasked.normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
37
- cloudMasked = goesImg.select('CMI_C03').updateMask(C_Mask).toFloat().rename('CC')
38
- fireMasked = goesImg.select('CMI_C03').updateMask(F_Mask).toFloat().rename('FC')
39
-
40
- return goesImg.addBands([NBRmasked,cloudMasked, fireMasked,QF_Mask,C_Mask])
41
-
42
- '''Parameter Array Name Value Bit(s) = Value
43
- Sun Glint QF1 Surface Reflectance None 6-7 = 00
44
- Low Sun Mask QF1 Surface Reflectance High 5 = 0
45
- Day/Night QF1 Surface Reflectance Day 4 =0
46
- Cloud Detection QF1 Surface Reflectance Confident Clear 2-3 = 00 or Problably Clear 2-3 = 01
47
- Cloud Mask Quality QF1 Surface Reflectance High or Medium 0-1 = 10 or 11
48
- Snow/Ice QF2 Surface Reflectance No Snow or Ice 5 = 0
49
- Cloud Shadow QF2 Surface Reflectance No Cloud Shadow 3 = 0
50
- LandWater QF2 Surface Reflectance Land, Snow, Arctic, Antarctic or Greenland, Desert 0-2 = 011, 100, 101, 110, 111
51
- Thin Cirrus Flag QF7 Surface Reflectance No Thin Cirrus 4 = 0
52
- Aerosol Quantity QF7 Surface Reflectance Climatology, Low or Medium 2-3 = 00, 01 or 10
53
- Adjacent to Cloud QF7 Surface Reflectance Not Adjacent to Cloud 1 = 0'''
54
-
55
- def VcalcNBR (VIIRSimg):
56
-
57
- QF1 = VIIRSimg.select('QF1').int()
58
- QF2 = VIIRSimg.select('QF2').int()
59
- QF7 = VIIRSimg.select('QF7').int()
60
-
61
- QF_Mask = (QF1.bitwiseAnd(BitMask_3).eq(0)).And\
62
- ((QF2.bitwiseAnd(BitMask_2).eq(4)).Or((QF2.bitwiseAnd(BitMask_1).eq(0)))).And\
63
- (QF2.bitwiseAnd(BitMask_5).eq(0)).rename('QFmask');
64
-
65
- VIIRSm = VIIRSimg.select(['I2','M11']).updateMask(QF_Mask);
66
- NBR = VIIRSm.normalizedDifference(['I2','M11']).toFloat().rename('NBR')
67
- return VIIRSimg.addBands(NBR).addBands(QF_Mask)#.set('avgNBR', avgNBR)
68
-
69
- ''' Bit 1: Dilated Cloud
70
- Bit 2: Cirrus (high confidence)
71
- Bit 3: Cloud
72
- Bit 4: Cloud Shadow
73
- Bit 5: Snow
74
- Bit 6: Clear (0: Cloud or Dilated Cloud bits are set, 1: Cloud and Dilated Cloud bits are not set)
75
- Bit 7: Water
76
- Bits 8-9: Cloud Confidence (0: None, 1: Low, 2: Medium, 3: High)
77
- Bits 10-11: Cloud Shadow Confidence (0: None, 1: Low, 2: Medium, 3: High)
78
- Bits 12-13: Snow/Ice Confidence (0: None, 1: Low, 2: Medium, 3: High)
79
- Bits 14-15: Cirrus Confidence (0: None, 1: Low, 2: Medium, 3: High)'''
80
-
81
- def LcalcNBR (LSimg):
82
- QApixel = LSimg.select('QA_PIXEL').int()
83
- QF_Mask =(QApixel.bitwiseAnd(BitMask_3).eq(0)).And\
84
- (QApixel.bitwiseAnd(BitMask_5).eq(0)).And\
85
- (QApixel.bitwiseAnd(BitMask_7).eq(0)).rename('QFmask');
86
-
87
- LSmasked = LSimg.select(['SR_B5','SR_B7']).updateMask(QF_Mask);
88
- NBR = LSmasked.normalizedDifference(['SR_B5','SR_B7']).toFloat().rename('NBR')
89
- return LSimg.addBands(NBR).addBands(QF_Mask)#.set('avgNBR', avgNBR)
90
-
91
- ''' 1 Saturated or defective
92
- 2 Dark Area Pixels
93
- 3 Cloud Shadows
94
- 4 Vegetation
95
- 5 Bare Soils
96
- 6 Water
97
- 7 Clouds Low Probability / Unclassified
98
- 8 Clouds Medium Probability
99
- 9 Clouds High Probability
100
- 10 Cirrus
101
- 11 Snow / Ice'''
102
-
103
- def ScalcNBR (sentImg):
104
- SCL = sentImg.select('SCL');
105
- QF_Mask =(SCL.neq(6)).And\
106
- (SCL.neq(8)).And\
107
- (SCL.neq(9)).And\
108
- (SCL.neq(11))\
109
- .rename('QFmask');
110
- sentMasked = sentImg.select(['B8A','B12']).updateMask(QF_Mask); #B8 is another option- broadband NIR
111
- NBR = sentMasked.normalizedDifference(['B8A','B12']).toFloat().rename('NBR')
112
- return sentImg.addBands(NBR).addBands(QF_Mask).addBands(SCL)#.set('avgNBR', avgNBR)
113
-
114
- #createDates = NIFC_perims_716.aggregate_array('attr_Cre_1')
115
- #incidentIDs = NIFC_perims_716.aggregate_array('poly_Incid')
116
- #fireList = incidentIDs.getInfo()
117
- fireList = wildfire_names = [ "FRESNO JUNE LIGHTNING COMPLEX", "Larch Creek","Deadman","Cow Valley","0404 RV LONE ROCK",
118
- "PIONEER","South Fork", "Deer Springs","Basin","Lake","Horse Gulch","Falls","Silver King","Indios"]
119
- selected_fire = solara.reactive(fireList[6])
120
- dNBRvisParams = {'min': 0.0,'max': 0.8, 'palette': ['green', 'yellow','orange','red']}
121
- today = datetime.datetime.today().strftime('%Y-%m-%d')
122
-
123
- class Map(geemap.Map):
124
- def __init__(self, **kwargs):
125
- super().__init__(**kwargs)
126
- self.add_basemap('OpenStreetMap')
127
-
128
- self.customize_ee_data(selected_fire.value, today)
129
- self.add_selector()
130
- self.add_dwnldButton()
131
- self.add("layer_manager")
132
- self.remove("draw_control")
133
-
134
-
135
- def customize_ee_data(self, fireID, elapDays):
136
- NIFC_perims_716 = ee.FeatureCollection('projects/ovcrge-ssec-burn-scar-map-c116/assets/NIFC_perimeters_7-16')
137
- fire = NIFC_perims_716.filter(ee.Filter.eq('poly_Incid',fireID)).first()
138
- timestamp = fire.get('attr_Cre_1')
139
- geom = fire.geometry()
140
-
141
- startDate = ee.Date(timestamp)#.format('YYYY-MM-dd')
142
- endDate = ee.Date.parse('YYYY-MM-dd', str(today))
143
-
144
- boundingBox = ee.Geometry(geom.buffer(5000).bounds())
145
-
146
- elapDayNum = ee.Number(10)
147
- elapDay_plusOne = elapDayNum.add(ee.Number(1))
148
-
149
- def calc_nbr(pre_start, pre_stop, post_start, post_stop, bbox, goes):
150
-
151
- def MergeBands (eachImage):
152
- oneImage = ee.Image.cat(eachImage.get('CMI'), eachImage.get('FDC'))
153
- return oneImage
154
- displacementImg18 = ee.Image.load('projects/ee-losos/assets/G18-F-meter-offset_GEE')
155
- y_dif = displacementImg18.select([1])
156
- x_dif = displacementImg18.select([0]).multiply(-1)
157
- displacement18 = ee.Image([x_dif, y_dif])
158
-
159
- displacementImg16 = ee.Image.load('projects/ee-losos/assets/G16-F-meter-offset_GEE')
160
- y_dif = displacementImg16.select([1])
161
- x_dif = displacementImg16.select([0]).multiply(-1)
162
- displacement16 = ee.Image([x_dif, y_dif]);
163
-
164
- preCMIcol = ee.ImageCollection(f"NOAA/GOES/{goes}/MCMIPF").filter(ee.Filter.date(pre_start, pre_stop))\
165
- .filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
166
- preFDCcol = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(pre_start, pre_stop))\
167
- .filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
168
- postCMIcol = ee.ImageCollection(f"NOAA/GOES/{goes}/MCMIPF").filter(ee.Filter.date(post_start, post_stop))\
169
- .filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
170
- postFDCcol = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(post_start, post_stop))\
171
- .filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
172
-
173
- prejoinedGOES = ee.Join.inner('CMI','FDC').apply(
174
- primary = preCMIcol,
175
- secondary = preFDCcol,
176
- condition = ee.Filter.maxDifference(
177
- difference = 10, #milliseconds
178
- leftField = 'system:time_start',
179
- rightField = 'system:time_start',))
180
- preMiddayGOEScol = ee.ImageCollection(prejoinedGOES.map(lambda object: MergeBands(object)))
181
- preMiddayGOEScol = preMiddayGOEScol.map(GcalcCCsingle)
182
- pre_meanNBR = preMiddayGOEScol.select(['NBR']).mean()
183
- pre_meanNBR = pre_meanNBR.multiply(1.18).subtract(0.12)
184
-
185
- postjoinedGOES = ee.Join.inner('CMI','FDC').apply(
186
- primary = postCMIcol,
187
- secondary = postFDCcol,
188
- condition = ee.Filter.maxDifference(
189
- difference = 10, #milliseconds
190
- leftField = 'system:time_start',
191
- rightField = 'system:time_start',))
192
- postMiddayGOEScol = ee.ImageCollection(postjoinedGOES.map(lambda object: MergeBands(object)))
193
- postMiddayGOEScol = postMiddayGOEScol.map(GcalcCCsingle)
194
- post_meanNBR = postMiddayGOEScol.select(['NBR']).mean()
195
- post_meanNBR = post_meanNBR.multiply(1.18).subtract(0.12)
196
-
197
- dNBR_goes17 = pre_meanNBR.subtract(post_meanNBR).select('NBR')
198
-
199
-
200
- #GOES-16
201
- preCMIcol = ee.ImageCollection("NOAA/GOES/16/MCMIPF").filter(ee.Filter.date(pre_start, pre_stop))\
202
- .filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
203
- preFDCcol = ee.ImageCollection("NOAA/GOES/16/FDCF").filter(ee.Filter.date(pre_start, pre_stop))\
204
- .filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
205
-
206
- prejoinedGOES = ee.Join.inner('CMI','FDC').apply(
207
- primary = preCMIcol,
208
- secondary = preFDCcol,
209
- condition = ee.Filter.maxDifference(
210
- difference = 10, #milliseconds
211
- leftField = 'system:time_start',
212
- rightField = 'system:time_start',))
213
- preMiddayGOEScol = ee.ImageCollection(prejoinedGOES.map(lambda object: MergeBands(object)))
214
- preMiddayGOEScol = preMiddayGOEScol.map(GcalcCCsingle)
215
- pre_meanNBR = preMiddayGOEScol.select(['NBR']).mean()
216
- pre_meanNBR = pre_meanNBR.multiply(1.18).subtract(0.12)
217
-
218
-
219
- postCMIcol = ee.ImageCollection("NOAA/GOES/16/MCMIPF").filter(ee.Filter.date(post_start, post_stop))\
220
- .filter(ee.Filter.calendarRange(17, 21, 'hour'))#10-2pm PCT, 11am-3pm MST
221
- postFDCcol = ee.ImageCollection("NOAA/GOES/16/FDCF").filter(ee.Filter.date(post_start, post_stop))\
222
- .filter(ee.Filter.calendarRange(17, 21, 'hour')) #10-2pm PCT, 11am-3pm MST
223
-
224
- postjoinedGOES = ee.Join.inner('CMI','FDC').apply(
225
- primary = postCMIcol,
226
- secondary = postFDCcol,
227
- condition = ee.Filter.maxDifference(
228
- difference = 10, #milliseconds
229
- leftField = 'system:time_start',
230
- rightField = 'system:time_start',))
231
- postMiddayGOEScol = ee.ImageCollection(postjoinedGOES.map(lambda object: MergeBands(object)))
232
- postMiddayGOEScol = postMiddayGOEScol.map(GcalcCCsingle)
233
- post_meanNBR = postMiddayGOEScol.select(['NBR']).mean()
234
- post_meanNBR = post_meanNBR.multiply(1.18).subtract(0.12)
235
-
236
- dNBR_goes16 = pre_meanNBR.subtract(post_meanNBR).select('NBR')
237
-
238
- dNBRclip_goes17= dNBR_goes17.clip(bbox)
239
- dNBRclip_goes16= dNBR_goes16.clip(bbox)
240
- dNBRdisp_goes17 = dNBRclip_goes17.displace(displacement18, 'bicubic')
241
- dNBRdisp_goes16 = dNBRclip_goes16.displace(displacement16, 'bicubic')
242
- dNBRgoes_compos = ee.ImageCollection([dNBRdisp_goes17,dNBRdisp_goes16]).mean()
243
-
244
- #ACTIVE fire
245
- activeFire18 = ee.ImageCollection(f"NOAA/GOES/{goes}/FDCF").filter(ee.Filter.date(pre_stop, post_stop))
246
- activeFire16 = ee.ImageCollection(f"NOAA/GOES/16/FDCF").filter(ee.Filter.date(pre_stop, post_stop))
247
- sumFRP18 = activeFire18.select('Power').sum().rename('sumFRP')
248
- sumFRP16 = activeFire16.select('Power').sum().rename('sumFRP')
249
- maskNoFire18 = sumFRP18.gt(200).displace(displacement18, 'bicubic')
250
- maskNoFire16 = sumFRP16.gt(200).displace(displacement16, 'bicubic')
251
- maskNoFire = ee.ImageCollection([maskNoFire18,maskNoFire16]).sum().gt(0)
252
-
253
- '''
254
- activeSNPP = ee.ImageCollection("NASA/LANCE/SNPP_VIIRS/C2").filter(ee.Filter.date(pre_stop, post_stop))
255
- activeNOAA20 = ee.ImageCollection("NASA/LANCE/NOAA20_VIIRS/C2").filter(ee.Filter.date(pre_stop, post_stop))
256
- sumFRP_SNPP = activeSNPP.select('confidence').max().rename('sumFRP')
257
- sumFRP_NOAA20 = activeNOAA20.select('confidence').max().rename('sumFRP')
258
- #maskNoFire = ee.ImageCollection([sumFRP_SNPP,sumFRP_NOAA20]).sum().gt(0)
259
- maskNoFire = sumFRP_SNPP.gt(0)
260
- '''
261
-
262
- #VIIRS
263
- preVIIRSimg = ee.ImageCollection("NASA/VIIRS/002/VNP09GA").filter(ee.Filter.date(pre_start, pre_stop)).mean()
264
- 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')
265
-
266
- #Landsat
267
- prelandsat8col = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
268
- postlandsat8col = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2").filterDate(post_start, post_stop).filterBounds(bbox)
269
- prelandsat9col = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
270
- postlandsat9col = ee.ImageCollection("LANDSAT/LC09/C02/T1_L2").filterDate(post_start, post_stop).filterBounds(bbox)
271
- prelandsatcol = prelandsat8col.merge(prelandsat9col)
272
- postlandsatcol = postlandsat8col.merge(postlandsat9col)
273
-
274
- #Sentinel
275
- presentCol = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(pre_start.advance(-10, 'day'), pre_stop).filterBounds(bbox)
276
- 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')
277
- #olderPostSentCol = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED").filterDate(sfork_startDate.advance(37, 'day'), sfork_startDate.advance(38,'day')).filterBounds(bbox)
278
-
279
- #SAR
280
- #SARimg = ee.Image('projects/ovcrge-ssec-burn-scar-map-c116/assets/burned_20200907_20200919_test')
281
- #SARmask = SARimg.eq(1)
282
-
283
- if postVIIRSimgCol.size().getInfo() > 0:
284
- postVIIRSimg = postVIIRSimgCol.mean()
285
- preVIIRSimg = VcalcNBR(preVIIRSimg)
286
- postVIIRSimg = VcalcNBR(postVIIRSimg)
287
- dNBR_viirs = preVIIRSimg.subtract(postVIIRSimg).select('NBR')
288
- dNBRclip_viirs = dNBR_viirs.clip(bbox)
289
- else:
290
- dNBR_composite = dNBRgoes_compos
291
- if postsentCol.size().getInfo() > 0:
292
- presentMean = presentCol.mean()
293
- postsentMean = postsentCol.mean()
294
- presentImg = ScalcNBR(presentMean)
295
- postsentImg = ScalcNBR(postsentMean)
296
- dnbr_sent = presentImg.subtract(postsentImg).multiply(1.3).add(0.05).select('NBR')
297
- dNBRclip_sent = dnbr_sent.clip(bbox)
298
- dNBR_composite = ee.ImageCollection([dNBRgoes_compos,dNBRclip_sent]).mosaic() #dNBRclip_viirs SHOULD GO IN IF UP TO DATE
299
- elif postlandsatcol.size().getInfo() > 0:
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_ls]).mosaic() #dNBRclip_viirs SHOULD GO IN IF UP TO DATE
307
- else:
308
- dNBR_composite = ee.ImageCollection([dNBRgoes_compos]).mosaic() #dNBRclip_viirs SHOULD GO IN IF UP TO DATE
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
- fireImg = calc_nbr(startDate.advance(-7, 'day'), startDate, endDate.advance(-3, 'day'), endDate, boundingBox, 18)
338
- self.addLayer(fireImg, dNBRvisParams, fireID, True)
339
- self.centerObject(boundingBox, 10)
340
- file = fireImg
341
-
342
-
343
- def clear_specific_layers(self):
344
- layers_to_keep = ['OpenStreetMap']
345
- layers = list(self.layers)
346
- for layer in layers:
347
- if layer.name not in layers_to_keep:
348
- self.remove_layer(layer)
349
-
350
-
351
- def add_selector(self):
352
- selector = widgets.Dropdown(options=fireList, value=fireList[6], description='Current wildfire :', style={'description_width': '125px'}, layout=widgets.Layout(width='400px'))
353
-
354
- def on_selector_change(change):
355
- if change['name'] == 'value':
356
- selected_fire.value = change['new']
357
- self.customize_ee_data(selected_fire.value, today)
358
-
359
- selector.observe(on_selector_change, names='value')
360
- self.add_widget(selector, position="topleft")
361
-
362
-
363
- def add_dwnldButton(self):
364
- button = widgets.Button(description='Export to Drive',icon='cloud-arrow-down')
365
-
366
- #def on_button_click(change, file):
367
- # if change['name'] == 'value':
368
- # selected_days.value = change['new']
369
- # self.download_ee_image(file, "trial_file.tif", scale=30)
370
- def on_button_click(b):
371
- # Get the currently selected fire and elapsed days
372
- fire = selected_fire.value
373
- elapDays = today
374
-
375
- # Customize the EE data and download the image
376
- file = self.customize_ee_data(fire, elapDays)
377
- #self.download_ee_image(file, f"{fire}_NBR_{elapDays}days.tif", scale=30)
378
-
379
- button.observe(on_button_click)
380
- self.add_widget(button, position="topleft")
381
-
382
-
383
-
384
- @solara.component
385
- def Page():
386
-
387
- with solara.Column(align="center"):
388
- markdown = """
389
- ## Current 2024 wildfires over 10,000 acres"""
390
- solara.Markdown(markdown)
391
-
392
- # Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
393
- with solara.Column(style={"isolation": "isolate"}):
394
- map_widget = Map.element(
395
- center=[39, -120.5],
396
- zoom=8,
397
- height="600px",
398
- toolbar_ctrl=False
399
- )