Spaces:
Running
Running
File size: 6,495 Bytes
3a3c7af f38dba6 3a3c7af 34f45f4 3a3c7af a9e3a49 34f45f4 f38dba6 34f45f4 3a3c7af 34f45f4 f38dba6 34f45f4 f38dba6 34f45f4 |
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 |
import streamlit as st
import pandas as pd
import plotly.graph_objects as go
import time
# Load the Excel file
file_path = 'Dhaka Metro Rail Fare 2.XLSX' # Ensure the correct file path
df = pd.read_excel(file_path)
# Coordinates for stations (same as in your original code)
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
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 💶:")
# Dropdown for selecting origin (with "Select Journey from" as a default placeholder)
origin = st.selectbox(
"Select your Location:",
['Select Journey from'] + df['Origin'].unique().tolist()
)
# Display buttons for destinations
if origin != 'Select Journey from':
st.write(f"Select your destination(s) from {origin}:")
destinations = st.multiselect("Choose Destinations", df[df['Origin'] == origin]['Destination'].unique().tolist())
if destinations:
# Filter the dataframe based on user selection
fare_data = df[(df['Origin'] == origin) & (df['Destination'].isin(destinations))]
if not fare_data.empty:
for index, row in fare_data.iterrows():
origin_to_dest_fare = row['Fare (৳)']
destination = row['Destination']
st.write(f"Fare from {origin} to {destination}: {origin_to_dest_fare}৳")
# Map for Dhaka Metro
fig = go.Figure()
# Define train icon
train_icon = "train" # You can use Plotly's built-in train icon or any other icon if available
# 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 markers for stations
for i, row in unique_stations.iterrows():
if row['Station'] == origin:
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']
))
elif row['Station'] in destinations:
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']
))
# Add animated train movement
train_path = [] # Coordinates for the train's path
for destination in destinations:
destination_row = df[(df['Origin'] == origin) & (df['Destination'] == destination)].iloc[0]
path = [coordinates[origin], (destination_row['Destination_Lat'], destination_row['Destination_Lon'])]
train_path.extend(path)
# Animation to move the train along the path
for i in range(len(train_path)):
fig.add_trace(go.Scattermapbox(
mode="markers",
lon=[train_path[i][1]],
lat=[train_path[i][0]],
marker={'size': 20, 'symbol': train_icon, 'color': 'red'},
name="Train",
showlegend=False
))
# Map layout
fig.update_layout(
mapbox=dict(
style="open-street-map",
center=go.layout.mapbox.Center(lat=23.780, lon=90.400),
zoom=11
),
margin={"r":0,"t":0,"l":0,"b":0},
showlegend=False
)
# Set up animation frame and delay to move the train
frames = []
for i in range(1, len(train_path)):
frame = go.Frame(
data=[go.Scattermapbox(
mode="markers",
lon=[train_path[i][1]],
lat=[train_path[i][0]],
marker={'size': 20, 'symbol': train_icon, 'color': 'red'},
name="Train"
)],
name=f"Frame_{i}"
)
frames.append(frame)
fig.frames = frames
# Animate train movement
fig.update_layout(
updatemenus=[dict(
type="buttons",
showactive=False,
buttons=[dict(
label="Play",
method="animate",
args=[None, dict(frame=dict(duration=2000, redraw=True), fromcurrent=True)]
)]
)]
)
# Show plot in Streamlit
st.plotly_chart(fig)
|