File size: 8,961 Bytes
799fb70
94b3422
799fb70
0bbb49e
164d1c0
94b3422
164d1c0
b36c6ed
94b3422
164d1c0
 
 
 
 
e301a24
 
94b3422
 
164d1c0
e301a24
 
 
af925e5
e301a24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9fa7194
e301a24
164d1c0
e301a24
 
 
 
94b3422
164d1c0
d3b1063
 
 
1189f83
 
d3b1063
1189f83
d3b1063
e301a24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3b1063
 
 
e301a24
b36c6ed
e301a24
 
b36c6ed
 
 
 
e301a24
b36c6ed
e301a24
 
164d1c0
 
 
 
1189f83
164d1c0
1189f83
164d1c0
b36c6ed
164d1c0
 
 
1189f83
b36c6ed
 
164d1c0
94b3422
164d1c0
 
 
d3b1063
 
731c0dd
 
1189f83
aa615b0
731c0dd
 
 
77a04d8
 
e301a24
 
 
 
164d1c0
e301a24
 
1189f83
164d1c0
 
 
 
94b3422
 
164d1c0
 
b36c6ed
d3b1063
 
77a04d8
 
 
e301a24
 
 
 
 
77a04d8
e301a24
 
1189f83
164d1c0
 
b36c6ed
 
 
 
 
731c0dd
 
1189f83
aa615b0
731c0dd
 
 
b36c6ed
 
e301a24
 
 
 
 
b36c6ed
aa615b0
b36c6ed
e301a24
1189f83
b36c6ed
 
 
 
 
 
 
 
 
 
 
 
 
e301a24
 
 
 
 
 
b36c6ed
e301a24
1189f83
b36c6ed
 
e301a24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0bbb49e
e301a24
0bbb49e
1189f83
0bbb49e
 
 
 
 
 
 
 
 
 
 
 
 
 
b36c6ed
94b3422
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# Example taken from here - https://shinylive.io/py/examples/#map

import os
import io
from shiny import reactive, render, ui, App

from plot_utils import show_one_plot, show_two_plots
from data_utils import prepare_data, process_data_trees_to_temp, process_data_temp_to_trees

import pandas as pd
import geopandas as gpd

import numpy as np

og_file = "example.csv"
# original_df, df, X, Y, T = prepare_data(og_file)


app_ui = ui.page_fluid(
    ui.row(
        ui.column(8,
            ui.input_radio_buttons("tab_choice", "Seleccionar p谩gina:", ["Efecto de los 谩rboles en la temperatura", "Efecto de la temperatura en los 谩rboles"]),
            ui.output_ui("tab_slider"),
            ui.tooltip(
                ui.input_radio_buttons(
                    "split_filter",
                    "驴Aplicar filtro?",
                    choices=["Sin filtro", "Filtro"],
                    selected="Sin filtro"
                ),
                "Indica exceso de cobertura: marr贸n = l铆mite por construcci贸n, rojo = m谩s del 100%.",
                placement="right"
            )
),
        ui.column(4,
            ui.input_file("csv_upload", "Subir archivo CSV", accept=[".csv"]),
            ui.input_radio_buttons(
            "simulation_mode", "Modo de simulaci贸n:",
            choices=["Usar control deslizante", "Usar simulaci贸n personalizada del CSV"],
            selected="Usar control deslizante"
        ),
            ui.download_button("download_csv", "Descargar simulaci贸n (CSV)")
)
        ),
        ui.row(ui.column(12,
        ui.output_ui("page_ui")))
        )

def server(input, output, session):
    @output
    @render.ui
    def tab_slider():
        if input.tab_choice() == "Efecto de los 谩rboles en la temperatura":
            return ui.input_slider("tree_pct", "Aumento de cobertura arb贸rea (%)", min=0, max=100, value=40, step=5)
        else:  # "Effect of temperature on trees"
            return ui.input_slider("temp_goal", "Disminuci贸n de la temperatura (掳C)", min=0, max=2, value=0.5, step=0.1)
            
    @reactive.Calc
    def user_data():
        file_info = input.csv_upload()
        if file_info is None:
            return prepare_data(og_file)
        else:
            with open(file_info[0]["datapath"], "r", encoding="utf-8") as f:
                return prepare_data(f)
    
    @reactive.Calc
    def uploaded_filename():
        file_info = input.csv_upload()
        if file_info is None:
            return "example_provided.csv"
        return file_info[0]["name"]

    @reactive.Calc
    def get_gdf_trees():
        value_trees = input.tree_pct()
        simulation_mode = input.simulation_mode()
        print(f"value inputed is {value_trees}")
        original_df, df, X, Y, T = user_data()
        return process_data_trees_to_temp(value_trees, simulation_mode, original_df, df, X, Y, T)

    @reactive.Calc
    def get_gdf_temp():
        value_temp = input.temp_goal()
        simulation_mode = input.simulation_mode()
        print(f"value inputed is {value_temp}")
        original_df, df, X, Y, T = user_data()
        return process_data_temp_to_trees(value_temp, simulation_mode, original_df, df, X, Y, T)
    
    @output
    @render.ui
    def page_ui():
        if input.tab_choice() == "Efecto de los 谩rboles en la temperatura":
            return ui.div(
                ui.h2("Visualizador de simulaci贸n: Aumento de la cobertura arb贸rea", class_="text-center"),
                ui.div(ui.output_plot("temp_after_treatment"), style="display: flex; justify-content: center;"),
                ui.div(ui.output_plot("temp_change"), style="display: flex; justify-content: center;"),
            )
        else: #Effect of temperature on trees
            return ui.div(
                ui.h2("Visualizador de simulaci贸n: disminuir la temperatura", class_="text-center"),
                ui.div(ui.output_plot("trees_after_decrease"), style="display: flex; justify-content: center;"),
                ui.div(ui.output_plot("tree_coverage_change"), style="display: flex; justify-content: center;"),
            )

    @output
    @render.plot()
    def temp_after_treatment():
        gdf_trees = get_gdf_trees()
        value_trees = input.tree_pct()
        apply_filter = input.split_filter()

        if apply_filter == "Filtro":
            split = 'pct_total_trees'
        else:
            split = False

        min_temp = 15
        max_temp = 35
        simulation_mode = input.simulation_mode()
        title = "Temperatura estimada despu茅s del aumento de cobertura arb贸rea\n(simulaci贸n personalizada del CSV)"
        if simulation_mode == "Usar control deslizante":
            title = f"Temperatura estimada despu茅s del aumento de cobertura arb贸rea (+{value_trees}%)"
        try:
            fig = show_two_plots(gdf_trees, 'new_temp', 'LST', 
             min_temp, max_temp, 'coolwarm',title,
             "Temperatura antes",'Temperatura (掳C)',split=split)
            return fig
        except Exception as e:
            print("Plotting error:", e)
            raise e


    @output
    @render.plot()
    def temp_change():
        gdf_trees = get_gdf_trees()
        value_trees = input.tree_pct()

        most_temp_change = -2
        no_temp_change = 0

        simulation_mode = input.simulation_mode()
        title = "Disminuci贸n de la temperatura despu茅s del aumento de cobertura arb贸rea\n(simulaci贸n personalizada del CSV)"
        if simulation_mode == "Usar control deslizante":
            title = f"Disminuci贸n de la temperatura despu茅s del aumento de cobertura arb贸rea (+{value_trees}%) "
        
        fig = show_one_plot(gdf_trees, 'temp_decrease', most_temp_change, no_temp_change, 
        'PuBu_r', title, 
        "Cambio de temperatura (掳C)")
        return fig
    
    @output
    @render.plot()
    def trees_after_decrease():
        gdf_temp = get_gdf_temp()
        value_temp = input.temp_goal()
        apply_filter = input.split_filter()

        if apply_filter == "Filtro":
            split = 'pct_total_trees'
        else:
            split = False

        min_cobertura_veg = 5
        max_cobertura = 100

        simulation_mode = input.simulation_mode()
        title = "Estimaci贸n de cobertura arb贸rea necesaria para la disminuci贸n de temperatura\n(simulaci贸n personalizada del CSV)"
        if simulation_mode == "Usar control deslizante":
            title = f"Estimaci贸n de cobertura arb贸rea necesaria para una disminuci贸n de {value_temp}掳C"
        try:
            fig = show_two_plots(gdf_temp, 'pct_total_trees', 'Pct_CoberturaVeg', 
             min_cobertura_veg, max_cobertura, 'YlGn', 
             title,"Cobertura arb贸rea antes",
             "Cobertura arb贸rea (%)", split=split)
            return fig
        except Exception as e:
            print("Plotting error:", e)
            raise e


    @output
    @render.plot()
    def tree_coverage_change():
        gdf_temp = get_gdf_temp()
        value_temp = input.temp_goal()
        min_tree_increase = 0
        max_tree_increase = 90

        simulation_mode = input.simulation_mode()
        title = "Aumento de cobertura arb贸rea necesario para la disminuci贸n de temperatura\n(simulaci贸n personalizada del CSV)"
        if simulation_mode == "Usar control deslizante":
            title = f"Aumento de cobertura arb贸rea necesario para disminuci贸n de {value_temp}掳C"
        fig = show_one_plot(gdf_temp, 'pp_trees_increase', min_tree_increase, 
                  max_tree_increase, 'Greens', 
                  title,
                  "Cambio en cobertura arb贸rea (%pt)")
        return fig

    def get_filename():
        simulation_mode = input.simulation_mode() 
        uploaded_name = uploaded_filename()    
        print(uploaded_name)   
        if simulation_mode == "Usar control deslizante":
            if input.tab_choice() == "Efecto de los 谩rboles en la temperatura":
                filename = f"simulacion_arboles_{input.tree_pct()}pct.csv"
            else:
                filename = f"simulacion_temp_{input.temp_goal()}C.csv"
        else:
            if input.tab_choice() == "Efecto de los 谩rboles en la temperatura":
                filename = f"simulacion_arboles_desde_{uploaded_name}"
            else:
                filename = f"simulacion_temp_desde_{uploaded_name}"
        
        return filename

    @output
    @render.download(filename=lambda: get_filename())
    def download_csv():
        if input.tab_choice() == "Efecto de los 谩rboles en la temperatura":
            df = get_gdf_trees()
        else:
            df = get_gdf_temp()

        if not hasattr(df, "to_csv"):
            raise ValueError("Expected a DataFrame or GeoDataFrame")

        df = df.drop(columns="geometry", errors="ignore")

        buffer = io.StringIO()
        df.to_csv(buffer, index=False)
        buffer.seek(0)
        return buffer 

app = App(app_ui, server)