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)