File size: 6,261 Bytes
799fb70
94b3422
799fb70
0bbb49e
164d1c0
94b3422
164d1c0
b36c6ed
94b3422
164d1c0
 
 
 
 
 
 
 
94b3422
 
164d1c0
1189f83
d3b1063
9fa7194
 
 
 
 
 
 
 
 
 
0bbb49e
1189f83
164d1c0
94b3422
164d1c0
d3b1063
 
 
1189f83
 
d3b1063
1189f83
d3b1063
 
 
 
 
b36c6ed
d3b1063
b36c6ed
 
 
 
 
 
164d1c0
 
 
 
1189f83
164d1c0
1189f83
164d1c0
b36c6ed
164d1c0
 
 
1189f83
b36c6ed
 
164d1c0
94b3422
164d1c0
 
 
d3b1063
 
731c0dd
 
1189f83
0498f42
731c0dd
 
 
77a04d8
 
 
164d1c0
d3b1063
acc69a1
1189f83
164d1c0
 
 
 
94b3422
 
164d1c0
 
b36c6ed
d3b1063
 
77a04d8
 
 
 
 
d6117cb
1189f83
164d1c0
 
b36c6ed
 
 
 
 
731c0dd
 
1189f83
0498f42
731c0dd
 
 
b36c6ed
 
 
0498f42
b36c6ed
1189f83
 
b36c6ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
acc69a1
1189f83
b36c6ed
 
0bbb49e
 
1189f83
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
# 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 = "cleaned_dataframe.csv"
training_file = "training_dataframe.csv"
original_df, df, X, Y, T = prepare_data(og_file, training_file)


app_ui = ui.page_fluid(
    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.output_ui("page_ui"),
    ui.download_button("download_csv", "Descargar simulaci贸n (CSV)")
)

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 get_gdf_trees():
        value_trees = input.tree_pct()
        print(f"value inputed is {value_trees}")
        return process_data_trees_to_temp(value_trees, original_df, df, X, Y, T)

    @reactive.Calc
    def get_gdf_temp():
        value_temp = input.temp_goal()
        print(f"value inputed is {value_temp}")
        return process_data_temp_to_trees(value_temp, 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 = f'%total_trees_treatment_{value_trees}%'
        else:
            split = False

        min_temp = 15
        max_temp = 35

        try:
            fig = show_two_plots(gdf_trees, f'simulated_temp_{value_trees}%', 'LST', 
             min_temp, max_temp, 'coolwarm',f"Temperatura estimada despu茅s del aumento de cobertura arb贸rea (+{value_trees}% )",
             "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
        
        fig = show_one_plot(gdf_trees, f'treatment_effect_{value_trees}%', most_temp_change, no_temp_change, 
        'PuBu_r', f"Disminuci贸n de la temperatura por el tratamiento (+{value_trees}% cobertura arb贸rea)", 
        "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 = f'%total_trees_needed_for_{value_temp}C'
        else:
            split = False

        min_cobertura_veg = 5
        max_cobertura = 100
        try:
            fig = show_two_plots(gdf_temp, f'%total_trees_needed_for_{value_temp}C', '%CoberturaVeg', 
             min_cobertura_veg, max_cobertura, 'YlGn', 
             f"Estimaci贸n de cobertura arb贸rea necesaria para una disminuci贸n de {value_temp}掳C","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
        fig = show_one_plot(gdf_temp, f'pp_trees_increase_for_{value_temp}C', min_tree_increase, 
                  max_tree_increase, 'Greens', 
                  f"Aumento de cobertura arb贸rea por disminuci贸n de {value_temp}掳C",
                  "Cambio en cobertura arb贸rea (%pt)")
        return fig

    @output
    @render.download(filename=lambda: (
        f"gdf_trees_{input.tree_pct()}pct.csv" if input.tab_choice() == "Efecto de los 谩rboles en la temperatura"
        else f"gdf_temp_{input.temp_goal()}C.csv"
    ))
    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)