saving-willy-dev / src /maps /alps_map.py
vancauwe's picture
feat: refactor and multi image classification
0e8c927
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 = '<a href="https://opentopomap.org/">Open Topo Map</a>'
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