File size: 5,934 Bytes
b1847cf
 
 
8324d6e
b1847cf
6f7e4ab
f26f5cc
00737c5
8d53210
6638e03
46ec1ae
b1847cf
 
 
9562f93
1b49e66
1f395fb
2e891b4
711290c
16b9f5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc6a63a
 
 
 
16b9f5c
336e6ba
16b9f5c
 
 
1b49e66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e891b4
ccf5a67
 
 
2e891b4
1f91692
 
5b06982
e83c263
 
 
 
 
 
 
 
ccf5a67
1f91692
 
 
 
5fab2b7
ccf5a67
f870c04
b1847cf
711290c
 
1b49e66
 
 
 
 
 
711290c
1b49e66
c1d10d6
b1847cf
 
8a48393
336e6ba
 
 
 
5cdaf94
 
 
 
711290c
7c74f2b
0ed20b8
 
6a4ab4e
7c74f2b
035ea6b
b1847cf
be0641f
711290c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import ee
import geemap
import solara
import ipywidgets as widgets


fireList = ["North Complex", "Dixie", "Cameron Peak", "August Complex"]
selected_fire = solara.reactive([fireList[0]])
dNBRvisParams = {'min': 0.0,'max': 0.8, 'palette': ['green', 'yellow','orange','red']}


class Map(geemap.Map):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_ee_data()
        self.customize_ee_data(10)
        self.add("layer_manager")
        self.add_selector()
        self.add_intSlider()

    def add_ee_data(self):
        def calc_nbr(pre_start, pre_stop, post_start, post_stop, bbox):
                PREgoesCMI = ee.ImageCollection('NOAA/GOES/17/MCMIPF').filter(ee.Filter.date(pre_start, pre_stop)).mean()
                POSTgoesCMI = ee.ImageCollection('NOAA/GOES/17/MCMIPF').filter(ee.Filter.date(post_start, post_stop)).mean()
                preNBR = PREgoesCMI.select(['CMI_C03','CMI_C06']).normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
                postNBR = POSTgoesCMI.select(['CMI_C03','CMI_C06']).normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
                dNBR = preNBR.subtract(postNBR).select('NBR')
                dNBRclipped = dNBR.clip(bbox)
                return dNBRclipped
            
        north_complex_bb = ee.Geometry.BBox(-121.616097, 39.426723, -120.668526, 40.030845)
        dixie_bb = ee.Geometry.BBox(-121.680467, 39.759303, -120.065477, 40.873387)
        cam_peak_bb = ee.Geometry.BBox(-106.014784, 40.377907, -105.116651, 40.822094)
        aug_complex_bb = ee.Geometry.BBox(-123.668726, 39.337654, -122.355860, 40.498304)
    
        north_complex = calc_nbr('2020-08-15', '2020-08-16', '2020-09-15', '2020-09-16', north_complex_bb)
        dixie = calc_nbr('2021-07-12', '2021-07-13', '2021-09-15', '2021-09-16', dixie_bb)
        cam_peak = calc_nbr('2020-08-12', '2020-08-13', '2020-09-12', '2020-09-13', cam_peak_bb)
        aug_complex = calc_nbr('2020-08-15', '2020-08-16', '2020-11-10', '2020-11-11', aug_complex_bb)
            
        self.addLayer(north_complex, dNBRvisParams, 'North Complex GOES NBR', False)
        self.addLayer(dixie, dNBRvisParams, 'Dixie Complex GOES NBR', False)
        self.addLayer(cam_peak, dNBRvisParams, 'Cameron Peak GOES NBR', False)
        self.addLayer(aug_complex, dNBRvisParams, 'August Complex GOES NBR', False)
        
    def customize_ee_data(elapDays):
        def calc_nbr(pre_start, pre_stop, post_start, post_stop, bbox):
                PREgoesCMI = ee.ImageCollection('NOAA/GOES/17/MCMIPF').filter(ee.Filter.date(pre_start, pre_stop)).mean()
                POSTgoesCMI = ee.ImageCollection('NOAA/GOES/17/MCMIPF').filter(ee.Filter.date(post_start, post_stop)).mean()
                preNBR = PREgoesCMI.select(['CMI_C03','CMI_C06']).normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
                postNBR = POSTgoesCMI.select(['CMI_C03','CMI_C06']).normalizedDifference(['CMI_C03', 'CMI_C06']).toFloat().rename('NBR')
                dNBR = preNBR.subtract(postNBR).select('NBR')
                dNBRclipped = dNBR.clip(bbox)
                return dNBRclipped
            
        north_complex_bb = ee.Geometry.BBox(-121.616097, 39.426723, -120.668526, 40.030845)
        startDate = ee.Date('2020-08-16')
        elapDayNum = ee.Number(elapDays)
        postStart = startDate.advance(1, 'day')
        postStop = postStart.advance(1, 'day')
        north_complex = calc_nbr('2020-08-15', '2020-08-16', postStart, postStop, north_complex_bb) 
        self.addLayer(north_complex, dNBRvisParams, 'North Complex GOES NBR', True)


    def add_selector(self):
        selector = widgets.Dropdown(options=fireList, value="North Complex", description='Wildfire Case Study:') 
        output = widgets.Output()

        def on_selector_change(change):
            selected_fire = change['new']
            #self.clear_layers()
            if selected_fire == "North Complex":    
                self.find_layer('North Complex GOES NBR').visible = True
            elif selected_fire == "Dixie":
                self.find_layer('Dixie Complex GOES NBR').visible = True
            elif selected_fire == "Cameron Peak":
                self.find_layer('Cameron Peak GOES NBR').visible = True
            elif selected_fire == "August Complex":
                self.find_layer('August Complex GOES NBR').visible = True
            with output:
                output.clear_output()
                print(f"Selected wildfire case study: {selected_fire}")

        selector.observe(on_selector_change, names='value')
    
        widget = widgets.VBox([selector, output])
        self.add_widget(widget, position="topleft")

    def add_intSlider(self):
        slider = widgets.IntSlider(value=7,min=1,max=30,step=1,description='Elapsed days:',)
        
        def on_slider_change(change):
            selected_days = change['new']
            customize_ee_data(selected_days)
            
        slider.observe(on_slider_change) 
        self.add_widget(slider, position="topleft")
        

@solara.component
def Page():
    
    #with solara.Column(style={"align":"start", "min-width": "200px", "height": "200px"}):
        #solara.Select(label="Wildfire Case Study", value=selected_fire, values=fireList)
        #solara.Markdown(f"**Selected**: {selected_fire.value}")
        #solara.Button(label="Map the burn scar",) #on_click = on_button_clicked)
    
    with solara.Column(align="center"):
        markdown = """
        ## Burn Map Generator Case Studies ## """
        solara.Markdown(markdown)
    
    # Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
    with solara.Column(style={"isolation": "isolate"}):
        map_widget = Map.element(
            center=[39, -120.5],
            zoom=8,
            height="600px",
            toolbar_ctrl=False
        )