streamlit-h3 / main.py
cboettig's picture
wip
602a774
import streamlit as st
import pandas as pd
import pydeck as pdk
import numpy as np
# import branca.colormap as cm
from matplotlib import cm
from PIL import Image
import ibis
from ibis import _
image = Image.open('./favicon.png')
st.set_page_config(page_title="GBIF Observations in H3", page_icon=image)
st.header("GBIF Observations in H3", divider="rainbow")
# st.set_page_config(page_title="H3 in Streamlit", layout="wide")
h3_parquet = "https://data.source.coop/cboettig/gbif/gbif_ca_h3.parquet"
#h3_parquet = "/home/rstudio/source.coop/cboettig/obis/obis_h3.parquet"
con = ibis.duckdb.connect(extensions=["spatial"])
obis_h3 = con.read_parquet(h3_parquet)
st.subheader("California total observations")
# ------ Visualisation 1 ---------
def viridis_color(x) -> str:
rgb_array = np.round( cm.viridis(x) * 255 ).astype(int).clip(0,255).tolist()
return rgb_array
@st.cache_resource(ttl="2d")
def get_h3point_df(resolution: float) -> pd.DataFrame:
column = "h" + str(resolution)
df = (obis_h3
.rename(cell = column)
.cell.value_counts()
.mutate(v = _.cell_count.log())
.mutate(normalized_values = _.v / _.v.max())
.to_pandas()
)
df['rgb'] = viridis_color(df.normalized_values)
return df
@st.cache_resource(ttl="2d")
def get_coverage_layer(df: pd.DataFrame) -> pdk.Layer:
return pdk.Layer(
"H3HexagonLayer",
df,
get_hexagon="cell",
filled=True,
auto_highlight=True,
get_fill_color="rgb",
get_elevation="normalized_values",
elevation_scale=5000,
elevation_range=[0,1],
pickable=True,
extruded=True,
line_width_min_pixels=1,
)
min_v_1, max_v_1, v_1, z_1, lon_1, lat_1 = ( 1, 9, 4, 4, -120, 40,)
col1, col2 = st.columns([70, 30])
with col1:
h3_resolut_1 = st.slider(
"H3 resolution", min_value=min_v_1, max_value=max_v_1, value=v_1)
with col2:
levels_option = st.selectbox("Add filters", ("One", "Two", "Three"))
df = get_h3point_df(h3_resolut_1)
layer_coverage_1 = get_coverage_layer(df)
visible_layers_coverage_1 = [layer_coverage_1]
st.pydeck_chart(
pdk.Deck(map_provider='carto',
map_style='light',
initial_view_state=pdk.ViewState(
latitude=lat_1, longitude=lon_1, zoom=z_1, height=400
),
tooltip={"html": "<b>ID:</b> {cell_count}", "style": {"color": "white"}},
layers=visible_layers_coverage_1,
)
)
# ------ Visualisation 1 End ---------
st.divider()