Spaces:
Sleeping
Sleeping
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 | |
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 | |
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() | |