import branca import folium import geopandas as gpd import streamlit as st from folium.plugins import Draw def get_map_crop(): m = folium.Map( location=[50, 32], zoom_start=4, tiles="Esri.WorldImagery", attributionControl=False, prefer_canvas=True, ) Draw( export=False, show_geometry_on_click=False, draw_options={ "polyline": False, "polygon": False, "circle": False, "circlemarker": False, "marker": False, }, ).add_to(m) legend_html = """ {% macro html(this, kwargs) %}

 Grassland

 Cereals

 Other

 Flowers

 Vegetables

 Fruit trees

{% endmacro %} """ legend = branca.element.MacroElement() legend._template = branca.element.Template(legend_html) m.get_root().add_child(legend) return m def get_parquet(tile_path, id_classes): data = gpd.read_parquet(tile_path).to_crs(epsg="4326") data["class_name"] = [id_classes[i] for i in data["class"]] data["geometry"] = data["geometry"].simplify(0.0001) return data def draw_gdf( _map, tile_path, name, _style_call, id_classes, ): if tile_path not in st.session_state.keys(): tile_gdf = get_parquet(tile_path, id_classes) else: tile_gdf = st.session_state[tile_path] feature_group = folium.FeatureGroup(f"{name} layer") tooltip = folium.GeoJsonTooltip( fields=["class_name", "area"], aliases=["Crop type: \t", "Area (m²): \t"], localize=True, sticky=False, labels=True, style=""" background-color: #F0EFEF; border: 2px solid black; border-radius: 3px; box-shadow: 3px; """, max_width=800, ) folium.GeoJson(tile_gdf, style_function=_style_call, tooltip=tooltip).add_to( feature_group ) feature_group.add_to(_map) bound = feature_group.get_bounds() _map.fit_bounds(bound) def get_clean_rendering_container(app_state: str): """Makes sure we can render from a clean slate on state changes.""" slot_in_use = st.session_state.slot_in_use = st.session_state.get( "slot_in_use", "a" ) if app_state != st.session_state.get("previous_state", app_state): if slot_in_use == "a": slot_in_use = st.session_state.slot_in_use = "b" else: slot_in_use = st.session_state.slot_in_use = "a" st.session_state.previous_state = app_state slot = { "a": st.empty(), "b": st.empty(), }[slot_in_use] return slot.container()