import ee
import geemap
import plotly.express as px
import pandas as pd
import solara
import dataclasses
from typing import Callable, cast
df = pd.read_csv('esa_stats_ucs_rj.csv')
columns = list(df.columns)
#df = px.data.iris()
@dataclasses.dataclass
class ClickPoint:
row_index: int
x_column: str
y_column: str
def find_row_index(fig, click_data):
# goes from trace index and point index to row index in a dataframe
# requires passing df.index as to custom_data
trace_index = click_data["points"]["trace_indexes"][0]
point_index = click_data["points"]["point_indexes"][0]
trace = fig.data[trace_index]
return trace.customdata[point_index][0]
class Map(geemap.Map):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.add_ee_data()
self.add("layer_manager")
self.add("inspector")
def add_ee_data(self):
# Add Earth Engine dataset
esa = ee.ImageCollection('ESA/WorldCover/v200').first()
ucs = ee.FeatureCollection("projects/ee-curso-gee-rhamon/assets/ucs_estaduais_rj")
esa = esa.clipToCollection(ucs)
# Set visualization parameters.
visualization = {
"bands": ['Map'],
}
fc_vis_params = {
"color": "000000",
"width": 1,
"Opacity": 0.8,
}
# Add Earth Engine layers to Map
self.centerObject(ucs, zoom=8)
self.addLayer(ucs, fc_vis_params, "UCs Estaduais RJ")
self.addLayer(esa, visualization, "Landcover")
self.add_legend(title="Land Cover Type", builtin_legend='ESA_WorldCover', position="bottomright")
@solara.component
def Page():
with solara.Column(style={"min-width": "500px"}):
Map.element(
center=[40, -100],
zoom=4,
height="600px",
)
fig = px.pie(df,values='Class_10', names="nome", title='Cobertura Florestal UCs Estaduais RJ')
#fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
#solara.FigurePlotly(fig)
@solara.component
def ClickScatter(df, x, click_row, on_click: Callable[[ClickPoint], None]):
x, set_x = solara.use_state(x)
#y, set_y = solara.use_state(y)
#fig = px.scatter(df, x, y, color=color, custom_data=[df.index])
fig = px.pie(df,values= x, names='nome', title='Cobertura Florestal UCs Estaduais RJ')
def on_click_trace(click_data):
# sanity checks
assert click_data["event_type"] == "plotly_click"
row_index = find_row_index(fig, click_data)
on_click(ClickPoint(row_index, x))
if click_row:
click_x = df[x].values[click_row]
#fig.add_trace(px.scatter(x=, y=[click_y], text=["⭐️"]).data[0])
fig.add_trace(px.pie(values= [click_x], names='nome', title='Cobertura Florestal UCs Estaduais RJ').data[0])
# make the figure a bit smaller
fig.update_layout(width=1340,height=800)
with solara.Column(style={"width": "1540px"}) as main:
solara.FigurePlotly(fig, on_click=on_click_trace)
solara.Select(label="X-axis", value=x, values=columns, on_value=set_x)
return main
@solara.component
def Page():
with solara.Column(style={"min-width": "500px"}):
Map.element(
center=[-22, -43],
zoom=8,
height="600px",
)
click_point, set_click_point = solara.use_state(cast(ClickPoint, None))
if click_point:
clicked_row = click_point.row_index
else:
clicked_row = None
with solara.Row(justify="center", style={"flex-wrap": "wrap"}):
ClickScatter(df, 'nome', clicked_row, on_click=set_click_point)
if click_point is not None:
clicked_row = click_point.row_index
solara.Success(f"Clicked on row {clicked_row}. Which is highlighted in the both plots.")
solara.Markdown(
f"""
```python
row_data = {df.iloc[clicked_row].to_dict()}
```"""
)
else:
solara.Info("Click to select a point")