File size: 4,232 Bytes
2e97de3
 
 
 
 
 
8fe8e18
2e97de3
8fe8e18
 
 
 
 
 
 
 
 
 
 
 
 
 
2e97de3
 
 
 
 
 
 
 
 
 
 
 
 
 
8fe8e18
 
 
 
 
 
2e97de3
 
 
8fe8e18
2e97de3
8fe8e18
2e97de3
8fe8e18
2e97de3
 
 
 
8fe8e18
2e97de3
8fe8e18
2e97de3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fe8e18
9413b96
2e97de3
 
 
8fe8e18
2e97de3
8fe8e18
2e97de3
 
 
8fe8e18
2e97de3
 
 
 
 
 
 
8fe8e18
2e97de3
8fe8e18
2e97de3
 
 
 
 
 
 
 
8fe8e18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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 "無")