Spaces:
Sleeping
Sleeping
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)** by clicking the destination buttons. | |
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 = [] | |
# Display buttons for each destination in 3 columns | |
if origin != default_origin: | |
st.write(f"Select your destination(s) from {origin}:") | |
# Create 3 columns | |
cols = st.columns(3) | |
# Loop through all possible destinations and create a button for each in the columns | |
dest_buttons = df['Destination'].unique() | |
for i, dest in enumerate(dest_buttons): | |
col_idx = i % 3 # Determine column index based on button position | |
with cols[col_idx]: | |
if st.button(f"Select {dest}", key=f"btn_{dest}"): | |
if dest not in st.session_state.destination_select: | |
st.session_state.destination_select.append(dest) | |
else: | |
st.session_state.destination_select.remove(dest) | |
# Clear all selected destinations button | |
if st.button("Clear All Destinations"): | |
st.session_state.destination_select = [] | |
# Display selected destinations and calculate fares | |
destinations = st.session_state.destination_select | |
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 | |
# Display the fare data in a creative and aesthetic format | |
if not fare_data.empty: | |
for index, row in fare_data.iterrows(): | |
origin_to_dest_fare = row['Fare (à§³)'] | |
destination = row['Destination'] | |
# Creative output with icons, emojis, and styled text | |
fare_message = f""" | |
<div style="background-color: #f0f8ff; padding: 10px; margin-bottom: 12px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);"> | |
<h4 style="font-family: 'Arial', sans-serif; color: #003366;"> | |
🚇 <strong>{origin}</strong> to <strong>{destination}</strong> Fare | |
</h4> | |
<p style="font-family: 'Arial', sans-serif; font-size: 18px; color: #009688;"> | |
💵 Fare: <strong style="font-size: 20px; color: #e91e63;">{origin_to_dest_fare}৳</strong> | |
</p> | |
<p style="font-family: 'Arial', sans-serif; font-size: 14px; color: #555555;"> | |
✨ Enjoy your journey on the Dhaka Metro! 🚉 | |
</p> | |
</div> | |
""" | |
st.markdown(fare_message, unsafe_allow_html=True) | |
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.") | |
st.write("Below is the Map for Dhaka Metro Rail 💶:") | |
# 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) | |