RouteNBite / app.py
shaheerawan3's picture
Create app.py
bb85e38 verified
# main.py
import streamlit as st
import folium
from streamlit_folium import folium_static
import osmnx as ox
import pandas as pd
from datetime import datetime
import networkx as nx
def get_location_coords(location_name):
try:
location = ox.geocode(location_name)
return location[0], location[1]
except:
return None
def find_restaurants(center_point, distance=1000):
tags = {'amenity': 'restaurant'}
restaurants = ox.geometries_from_point(
center_point, tags=tags, dist=distance
)
return restaurants
def create_app():
st.title("🗺️ RouteNBite")
st.subheader("Find restaurants along your route!")
col1, col2 = st.columns(2)
with col1:
start = st.text_input("Starting Point (e.g., 'Times Square, New York')")
cuisine = st.multiselect("Cuisine Preferences",
["Italian", "Asian", "Mexican", "Indian"])
with col2:
end = st.text_input("Destination")
max_detour = st.slider("Maximum Detour (minutes)", 5, 30, 15)
if st.button("Plan Route"):
if start and end:
# Get coordinates
start_coords = get_location_coords(start)
end_coords = get_location_coords(end)
if start_coords and end_coords:
# Create map centered between start and end
center_lat = (start_coords[0] + end_coords[0]) / 2
center_lon = (start_coords[1] + end_coords[1]) / 2
m = folium.Map(location=[center_lat, center_lon], zoom_start=12)
# Add markers for start and end
folium.Marker(
start_coords,
popup='Start',
icon=folium.Icon(color='green')
).add_to(m)
folium.Marker(
end_coords,
popup='End',
icon=folium.Icon(color='red')
).add_to(m)
# Get route using OSM
try:
G = ox.graph_from_point(
start_coords,
dist=max(ox.distance.great_circle_vec(
start_coords[0], start_coords[1],
end_coords[0], end_coords[1]
) * 1.1, 5000)
)
# Find shortest path
orig_node = ox.distance.nearest_nodes(G, start_coords[1], start_coords[0])
dest_node = ox.distance.nearest_nodes(G, end_coords[1], end_coords[0])
route = nx.shortest_path(G, orig_node, dest_node, weight='length')
# Get route coordinates
route_coords = []
for node in route:
route_coords.append([G.nodes[node]['y'], G.nodes[node]['x']])
# Draw route
folium.PolyLine(
route_coords,
weight=2,
color='blue',
opacity=0.8
).add_to(m)
# Find restaurants near route
midpoint = route_coords[len(route_coords)//2]
restaurants = find_restaurants(midpoint)
# Add restaurant markers
for idx, rest in restaurants.iterrows():
if 'name' in rest:
folium.Marker(
[rest.geometry.y, rest.geometry.x],
popup=rest.get('name', 'Restaurant'),
icon=folium.Icon(color='orange', icon='info-sign')
).add_to(m)
# Display map
folium_static(m)
# Show restaurant list
st.subheader("Nearby Restaurants")
rest_df = pd.DataFrame({
'Name': restaurants.get('name', 'Restaurant'),
'Cuisine': restaurants.get('cuisine', 'Various')
})
st.dataframe(rest_df)
except Exception as e:
st.error(f"Error planning route: {str(e)}")
else:
st.error("Couldn't find locations. Please check the addresses.")
if __name__ == "__main__":
create_app()