File size: 7,328 Bytes
6f2e207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import streamlit as st
import pandas as pd
import plotly.graph_objects as go

# Load the Excel file
file_path = 'Dhaka Metro Rail Fare 2.XLSX'  # Ensure the correct file path
df = pd.read_excel(file_path)

# Ensure necessary columns are present
required_columns = ['Origin', 'Destination', 'Fare (৳)']
if not all(col in df.columns for col in required_columns):
    st.write("Please ensure the file contains 'Origin', 'Destination', and 'Fare' columns.")
else:
    # Add coordinates for each station (example coordinates for illustration)
    coordinates = {
        "Uttara North": (23.869066, 90.367445),
        "Uttara Center": (23.860118, 90.365106),
        "Uttara South": (23.845934, 90.363175),
        "Pallabi": (23.82619516961383, 90.36481554252525),
        "Mirpur 11": (23.819438208310213, 90.36528532902963),
        "Mirpur 10": (23.808582994847285, 90.36821595330717),
        "Kazipara": (23.800017952100532, 90.37178261495391),
        "Shewrapara": (23.79070140857881, 90.37564622631841),
        "Agargaon": (23.778385546736345, 90.3800557456356),
        "Bijoy Sarani": (23.766638127271825, 90.38307537134754),
        "Farmgate": (23.75923604938459, 90.38694218434738),
        "Kawran Bazar": (23.751392319539104, 90.39275707447003),
        "Shahbagh": (23.740324209546923, 90.39600784811131),
        "Dhaka University": (23.732091083122114, 90.39659408796354),
        "Bangladesh Secretariat": (23.73004754106779, 90.40764881366906),
        "Motijheel": (23.72816566933198, 90.41923497972823),
        "Kamalapur": (23.732367758919807, 90.42547378971085)
    }

    # Add latitude and longitude for origin and destination based on the coordinates dictionary
    df['Origin_Lat'] = df['Origin'].map(lambda x: coordinates.get(x, (None, None))[0])
    df['Origin_Lon'] = df['Origin'].map(lambda x: coordinates.get(x, (None, None))[1])
    df['Destination_Lat'] = df['Destination'].map(lambda x: coordinates.get(x, (None, None))[0])
    df['Destination_Lon'] = df['Destination'].map(lambda x: coordinates.get(x, (None, None))[1])

    # Filter rows with missing coordinates
    df.dropna(subset=['Origin_Lat', 'Origin_Lon', 'Destination_Lat', 'Destination_Lon'], inplace=True)

    # Streamlit UI setup
    st.title("Dhaka Metro Rail Fare Checker 🚇")
    st.write("Below is the fare chart for Dhaka Metro Rail 💶:")

    # Instruction sidebar
    st.sidebar.title("Instructions")
    st.sidebar.write("""

    **Welcome to the Dhaka Metro Rail Fare Checker!**

   

    *How to use:*

    1. Select your **Location station** from the dropdown menu.

    2. Select your **destination(s)** from the list. You can select multiple destinations.

    3. The fare from your location to the selected destination(s) will be displayed below.

    4. You can also see the stations marked on a map.

    

    **Note:** The map highlights your location in green and destinations in blue.

    

    If you face any issues or need further assistance, feel free to [Contact Support on WhatsApp](https://wa.me/+8801719296601).

    """)

    # Define the default "Select Journey from" message
    default_origin = "Select Journey from"

    # Dropdown for selecting origin (with "Select Journey from" as a default placeholder)
    origin = st.selectbox(
        "Select your Location:", 
        [default_origin] + df['Origin'].unique().tolist(),  # Add the "Select Journey from" option at the top
        index=0  # Ensure the first option is selected by default
    )

    # Initialize session state for destination selection if not already set
    if 'destination_select' not in st.session_state:
        st.session_state.destination_select = []

    # Multiselect for destinations (pass the default from session state)
    destinations = st.multiselect(
        "Select your destination(s):", 
        df['Destination'].unique(), 
        default=st.session_state.destination_select
    )

    # Update session state based on the selected destinations
    st.session_state.destination_select = destinations

    # If the user hasn't selected a valid origin yet, don't proceed
    if origin == default_origin:
        st.write("Please select a valid origin station to proceed.")
    elif origin and destinations:
        # Filter the dataframe based on user selection
        fare_data = df[(df['Origin'] == origin) & (df['Destination'].isin(destinations))]

        # Display the fare data
        if not fare_data.empty:
            for index, row in fare_data.iterrows():
                st.write(f"Fare from {origin} to {row['Destination']} is: {row['Fare (৳)']}৳")
        else:
            st.write("No fare data available for the selected origin and destinations.")
    else:
        st.write("Please select both an origin and at least one destination.")

    # Plotting the map using Plotly
    fig = go.Figure()

    # Add markers for each unique station
    unique_stations = pd.concat([df[['Origin', 'Origin_Lat', 'Origin_Lon']].rename(columns={'Origin': 'Station', 'Origin_Lat': 'Lat', 'Origin_Lon': 'Lon'}), 
                                 df[['Destination', 'Destination_Lat', 'Destination_Lon']].rename(columns={'Destination': 'Station', 'Destination_Lat': 'Lat', 'Destination_Lon': 'Lon'})]).drop_duplicates()

    # Add a map marker for each station
    for i, row in unique_stations.iterrows():
        if row['Station'] == origin:
            # Mark the origin as green
            fig.add_trace(go.Scattermapbox(
                mode="markers+text",
                lon=[row['Lon']],
                lat=[row['Lat']],
                marker={'size': 12, 'color': 'green'},
                text=row['Station'],
                textposition="top center",
                name=row['Station'],
                customdata=[row['Station']]  # customdata is now a list
            ))
        elif row['Station'] in destinations:
            # Mark the destination as blue
            fig.add_trace(go.Scattermapbox(
                mode="markers+text",
                lon=[row['Lon']],
                lat=[row['Lat']],
                marker={'size': 12, 'color': 'blue'},
                text=row['Station'],
                textposition="top center",
                name=row['Station'],
                customdata=[row['Station']]  # customdata is now a list
            ))
        else:
            # Mark all other stations as red
            fig.add_trace(go.Scattermapbox(
                mode="markers+text",
                lon=[row['Lon']],
                lat=[row['Lat']],
                marker={'size': 12, 'color': 'red'},
                text=row['Station'],
                textposition="top center",
                name=row['Station'],
                customdata=[row['Station']]  # customdata is now a list
            ))

    # Map layout
    fig.update_layout(
        mapbox=dict(
            style="open-street-map",
            center=go.layout.mapbox.Center(lat=23.780, lon=90.400),  # Center on Dhaka
            zoom=11
        ),
        margin={"r":0,"t":0,"l":0,"b":0},
        showlegend=False,
        title="Dhaka Metro Rail Location Map"
    )

    # Show plot in Streamlit
    st.plotly_chart(fig)