Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import travelling_salesman | |
| import geocoder | |
| import pandas as pd | |
| from st_aggrid import AgGrid, GridOptionsBuilder | |
| import pandas as pd | |
| from enum import Enum | |
| class Language(Enum): | |
| English = 1 | |
| Japanese = 2 | |
| if 'language' not in st.session_state: | |
| st.session_state['language'] = Language.English | |
| _, col2 = st.columns([5,1]) | |
| with col2: | |
| print(st.session_state['language']) | |
| language = st.selectbox("Language" if st.session_state['language'] == Language.English else "言語", ("English", "日本語")) | |
| st.session_state['language'] = Language.English if language == "English" else Language.Japanese | |
| if 'count' not in st.session_state: | |
| st.session_state.count = 2 | |
| def increment_counter(): | |
| st.session_state.count += 1 | |
| def decrement_counter(): | |
| st.session_state.count -= 1 | |
| source = ["鶴舞公園", "中村公園", "荒子川公園", "久屋大通公園", "愛知公園", "大高緑地", "天白公園", "荒越公園", "池田公園" , "大須公園"] | |
| st.title("Path planning" if st.session_state['language'] == Language.English else "経路検索") | |
| st.write(""" | |
| Given target location(s) and vehicle(s), calculates optimum path from depot using OR-tools | |
| """ if st.session_state['language'] == Language.English else """ | |
| ターゲットの場所と車両を指定して、OR ツールを使用してデポからの最適なパスを計算 | |
| """) | |
| col1, col2, col3 = st.columns([1,1,1]) | |
| with col1: | |
| arrival = st.text_input("Depot" if st.session_state['language'] == Language.English else "デポ", value="大須観音駅") | |
| with col2: | |
| numberOfCars = st.number_input("Vehicle(s)" if st.session_state['language'] == Language.English else "台車数", value=1, min_value=1, max_value=5) | |
| with col3: | |
| timeLimit = st.number_input("Calculation Time Limit" if st.session_state['language'] == Language.English else "計算時間", min_value=1, max_value=1000, value=5, step=1) | |
| col3, col4, _ = st.columns([1,1,4]) | |
| with col3: | |
| st.button("Decrement" if st.session_state['language'] == Language.English else "加", on_click=decrement_counter) | |
| with col4: | |
| st.button("Increment" if st.session_state['language'] == Language.English else "減", on_click=increment_counter) | |
| col1, col2 = st.columns([1,2]) | |
| with col1: | |
| destinations = source[:st.session_state.count] | |
| df = pd.DataFrame( | |
| { | |
| "Target": destinations, | |
| } | |
| ) | |
| gb = GridOptionsBuilder.from_dataframe(df) | |
| gb.configure_default_column(editable=True) | |
| aggrid = AgGrid(df, | |
| # height=400, | |
| gridOptions=gb.build(), | |
| fit_columns_on_grid_load=True, | |
| allow_unsafe_jscode=True, | |
| ) | |
| with col2: | |
| with st.spinner(text="Generating map..." if st.session_state['language'] == Language.English else "マップ作成中"): | |
| fig = travelling_salesman.visualize_point(tuple(aggrid.data["Target"].to_list())) | |
| if fig is not None: | |
| st.plotly_chart(fig, use_container_width=True) | |
| else: | |
| st.write("No figure" if st.session_state['language'] == Language.English else "無") | |
| search = st.button('Search Route' if st.session_state['language'] == Language.English else "経路検索") | |
| if search: | |
| if geocoder.osm(arrival, timeout=5.0).latlng is None: | |
| st.warning("Depot invalid" if st.session_state['language'] == Language.English else "デポ不明") | |
| elif any( | |
| [ | |
| geocoder.osm(arr, timeout=5.0).latlng is None | |
| for arr in df["Target"] | |
| ] | |
| ): | |
| st.warning("Destination(s) invalid" if st.session_state['language'] == Language.English else "目的地不明") | |
| elif numberOfCars > len( df["Target"]): | |
| st.warning("Vehicle is less than destination!" if st.session_state['language'] == Language.English else "車台数が目的地より多い!") | |
| else: | |
| with st.spinner('Calculating'): | |
| fig = travelling_salesman.create_route( | |
| arrival, df["Target"], numberOfCars, timeLimit=timeLimit | |
| ) | |
| if fig is not None: | |
| st.plotly_chart(fig, use_container_width=True) | |
| else: | |
| st.write("No figure" if st.session_state['language'] == Language.English else "無") |