ChristophS's picture
reanming fronent filter
9b34089
import streamlit as st
from streamlit_folium import st_folium
from DataModel import DataModel
from Visualization import Visualization
def app_run(node_id=0):
# page configs
st.set_page_config(page_title='Zeitverluste an Knotenpunkten', layout='wide')
# handle empty query parameter
node = st.experimental_get_query_params()
if 'node_id' in node:
node_id = node['node_id'][0]
else:
st.error('No NodeID given !!')
st.stop()
# load data model and visualization tools
dm = DataModel()
visu = Visualization()
# Top Page Layout with Input controll,node metrics and map
metric_cols = st.columns([1,1,1,1,3])
# select node by node id
st.session_state['node_id'] = node_id
st.session_state['extension_radius'] = 30#[m]
# get data from backend
directs, feature, _, gdf = dm.get_data_of_node(st.session_state['node_id'],st.session_state['extension_radius'])
# create images for direction and
with st.spinner('Grafiken werden erstellt ...'):
folium_map = visu.create_folium_map(gdf)
figures, results, worst_relevant_loss = visu.get_diretion_results(directs, feature)
usable_rides = int(sum([df.tail(1)['Fahrten'] for df in results]))
mean_time_loss = float(sum([df.tail(1)['Fahrten']*df.tail(1)['Zeitverlust'] for df in results])/usable_rides)
mean_waiting_time = float(sum([df.tail(1)['Fahrten']*df.tail(1)['Standzeit'] for df in results])/usable_rides)
# dsipaly time quality plots, time quality dataframes and rush hour data frames for each travel direction in a different tab
input_directions = [f"Richtung {directs[d]['name']}" for d in directs]
#
elem0 = metric_cols[0].container()#border=True
elem0.markdown('Auswertbare Fahrten im Knoten')
elem0.header(visu.int2str(usable_rides))
#
elem1 = metric_cols[1].container()#border=True
elem1.markdown('Gesamter Zeitverlust')
color = visu.get_metric_color(mean_time_loss)
elem1.header(f":{color}[{visu.float2str(mean_time_loss)}s]")
#
elem2 = metric_cols[2].container()#border=True
elem2.markdown('Gesamte Standzeit')
color = visu.get_metric_color(mean_waiting_time)
elem2.header(f":{color}[{visu.float2str(mean_waiting_time)}s]")
#
elem3 = metric_cols[3].container()#border=True
elem3.markdown('Gesamtbewertung')
color = visu.get_metric_color(worst_relevant_loss['Zeitverlust'])
final_class = visu.get_final_result(worst_relevant_loss['Zeitverlust'])
indirection = input_directions[worst_relevant_loss['InDirection']]
elem3.header(f":{color}[{final_class}, {visu.float2str(worst_relevant_loss['Zeitverlust'])}s]")
elem3.text(f" Einfahrtsrichtung: {indirection[9:]} \n Ausfahrtsrichtung: {worst_relevant_loss['Richtung']}")
# define column layout
cols = st.columns([2,4])
# display node geometry on map
with cols[0]:
st_folium(folium_map, returned_objects=[], width=500, height=300, key=f'Map')
selection = cols[1].radio(':compass: Wähle Einfahrtsrichtung:', options=input_directions, horizontal=True)
idx = input_directions.index(selection)
# tooltip
cols[1].text('', help=get_plot_helper_text())
# display time quality plot for travel direction
cols[1].pyplot(figures[idx], use_container_width=True)
# helper text for table
cols[0].text('', help=get_table_helper_text())
# display time quality dataframe of travel direction
cols[0].dataframe(results[idx], hide_index=True, use_container_width=True)
def get_plot_helper_text():
return '''Darstellung der Stand- und Verlustzeiten an den Ein- und Ausfahrtswegen im Knotenpunkt.
Zeitliche Verluste werden entsprechend den Qualitätsklassen farblich visualisiert.
Zusätzlich erfolgt die Darstellung der Anzahl der Fahrten pro Fahrtrichtung durch die Breite der Linien. '''
def get_table_helper_text():
return '''Liste der durchschnittlichen Stand- und Verlustzeiten pro Fahrtrichtung,
wobei die Richtungen den in der Abbildung dargestellten Fahrtrichtungen entsprechen.'''
if __name__ == '__main__':
app_run()