import pandas as pd import streamlit as st import folium from streamlit_folium import st_folium _map_data = { 'name': { 0: 'matterhorn', 1: 'zinalrothorn', 2: 'alphubel', 3: 'allalinhorn', 4: 'weissmies', 5: 'lagginhorn', 6: 'lenzspitze', 10: 'strahlhorn', 11: 'parrotspitze'}, 'lat': { 0: 45.9764263, 1: 46.0648271, 2: 46.0628767, 3: 46.0460858, 4: 46.127633, 5: 46.1570635, 6: 46.1045505, 10: 46.0131498, 11: 45.9197881}, 'lon': { 0: 7.6586024, 1: 7.6901238, 2: 7.8638549, 3: 7.8945842, 4: 8.0120569, 5: 8.0031044, 6: 7.8686568, 10: 7.9021703, 11: 7.8710552}, 'height': { 0: 4181.0, 1: 3944.0, 2: 4174.0, 3: 3940.0, 4: 3983.0, 5: 3916.0, 6: 4255.0, 10: 4072.0, 11: 4419.0}, 'color': { 0: '#aa0000', 1: '#aa0000', 2: '#aa0000', 3: '#aa0000', 4: '#aa0000', 5: '#aa0000', 6: '#aa0000', 10: '#00aa00', 11: '#aa0000'}, 'size': {0: 30, 1: 30, 2: 30, 3: 30, 4: 30, 5: 30, 6: 30, 10: 500, 11: 30} } tile_sets = [ 'Open Street Map', #'Stamen Terrain', #'Stamen Toner', 'Esri Ocean', 'Esri Images', 'Stamen Watercolor', 'CartoDB Positron', #'CartoDB Dark_Matter' ] def create_map(tile_name, location, zoom_start: int = 7): # https://xyzservices.readthedocs.io/en/stable/gallery.html # get teh attribtuions from here once we pick the 2-3-4 options # make esri ocean the default m = folium.Map(location=location, zoom_start=zoom_start, tiles='Esri.OceanBasemap', attr="Esri") #m = folium.Map(location=location, zoom_start=zoom_start) attr = "" if tile_name == 'Open Street Map': folium.TileLayer('openstreetmap').add_to(m) pass #Esri.OceanBasemap elif tile_name == 'Esri Ocean': pass # made this one default () #attr = "Esri" #folium.TileLayer('Esri.OceanBasemap', attr=attr).add_to(m) elif tile_name == 'Esri Images': attr = "Esri — Source: Esri, i-cubed, USDA" #folium.TileLayer('stamenterrain', attr=attr).add_to(m) folium.TileLayer('Esri.WorldImagery', attr=attr).add_to(m) elif tile_name == 'Stamen Toner': attr = "Stamen" folium.TileLayer('stamentoner', attr=attr).add_to(m) elif tile_name == 'Stamen Watercolor': attr = "Stamen" folium.TileLayer('Stadia.StamenWatercolor', attr=attr).add_to(m) elif tile_name == 'CartoDB Positron': folium.TileLayer('cartodb positron').add_to(m) elif tile_name == 'CartoDB Dark_Matter': folium.TileLayer('cartodb dark_matter').add_to(m) #folium.LayerControl().add_to(m) return m def present_alps_map(): '''show a map of the alps with peaks (from the event's teamnames) marked there are two rendering modes: a) basic - this uses a streamlit map, which doesn't offer much flexibility on the tiles, but if you supply a dataframe then you just tell it the columns to use for lat, lon, color, size of points b) advanced - this uses folium, which allows for more control over the tiles, but sadly it seems much less flexible for the point markers. ''' st.markdown("# :whale: :whale: Cetaceans :red[& friends] :balloon:") show_points = st.toggle("Show Points", False) basic_map = st.toggle("Use Basic Map", False) visp_loc = 46.295833, 7.883333 # position of town nearby to the peaks # (maybe zermatt or Taesch better? all the mountains seem on valais gauche) _df = pd.DataFrame(_map_data) if basic_map: # render using streamlit map element st.map(_df, latitude='lat', longitude='lon', color='color', size='size', zoom=7) else: # setup a dropdown to pick tiles, and render with folium selected_tile = st.selectbox("Choose a tile set", tile_sets) #st.info(f"Selected tile: {selected_tile}") # don't get why the default selection doesn't get renderd. # generate a layer map_ = create_map(selected_tile, visp_loc) # and render it #tile_xyz = 'https://tile.opentopomap.org/{z}/{x}/{y}.png' #tile_attr = 'Open Topo Map' if show_points: folium.Marker( location=visp_loc, popup="Visp", tooltip="Visp", icon=folium.Icon(color='blue', icon='info-sign') ).add_to(map_) for i, row in _df.iterrows(): c = 'red' if row['name'] == 'strahlhorn': c = 'green' kw = {"prefix": "fa", "color": c, "icon": "mountain-sun"} folium.Marker( location=[row['lat'], row['lon']], popup=f"{row['name']} ({row['height']} m)", tooltip=row['name'], icon=folium.Icon(**kw) ).add_to(map_) #st.info(f"Added marker for {row['name']} {row['lat']} {row['lon']}") #folium_static(map_) st_data = st_folium(map_, width=725) # maybe solution for click => new marker # https://discuss.streamlit.io/t/add-marker-after-clicking-on-map/69472 return st_data