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()