|
import googlemaps |
|
import streamlit as st |
|
import json |
|
from datetime import datetime |
|
|
|
key=os.getenv('GOOGLE_KEY') |
|
gmaps = googlemaps.Client(key) |
|
|
|
def get_directions(source, destination): |
|
now = datetime.now() |
|
modes = ['driving', 'walking', 'bicycling', 'transit'] |
|
directions_info = {} |
|
for mode in modes: |
|
directions_result = gmaps.directions(source, destination, mode=mode, departure_time=now) |
|
if directions_result: |
|
directions_info[mode] = directions_result[0]['legs'][0]['steps'] |
|
else: |
|
directions_info[mode] = "No available routes." |
|
return directions_info |
|
|
|
|
|
def generate_map(source, destination): |
|
map_code = f""" |
|
<div id="map" style="height: 400px; width: 100%;"></div> |
|
<script> |
|
function initMap() {{ |
|
var directionsService = new google.maps.DirectionsService(); |
|
var directionsRenderer = new google.maps.DirectionsRenderer(); |
|
var map = new google.maps.Map(document.getElementById('map'), {{ |
|
zoom: 7, |
|
center: {{lat: 41.85, lng: -87.65}} |
|
}}); |
|
directionsRenderer.setMap(map); |
|
|
|
var request = {{ |
|
origin: '{source}', |
|
destination: '{destination}', |
|
travelMode: 'DRIVING' |
|
}}; |
|
directionsService.route(request, function(result, status) {{ |
|
if (status == 'OK') {{ |
|
directionsRenderer.setDirections(result); |
|
}} |
|
}}); |
|
}} |
|
</script> |
|
<script src="https://maps.googleapis.com/maps/api/js?key=Your-Google-Maps-API-Key&callback=initMap" async defer></script> |
|
""" |
|
return map_code |
|
|
|
|
|
st.title("πΊοΈ Google Maps Directions") |
|
st.sidebar.header('User Input Features') |
|
|
|
source_location = st.sidebar.text_input("Source Location", "Mound, MN") |
|
destination_location = st.sidebar.text_input("Destination Location", "Minneapolis, MN") |
|
|
|
if st.sidebar.button('Get Directions'): |
|
directions_info = get_directions(source_location, destination_location) |
|
|
|
|
|
for mode, directions in directions_info.items(): |
|
st.write(f"## Directions by {mode.capitalize()}") |
|
if directions == "No available routes.": |
|
st.write(directions) |
|
else: |
|
for i, step in enumerate(directions): |
|
st.write(f"{i+1}. {step['html_instructions']}") |
|
|
|
|
|
if st.sidebar.button('Show Directions on Map'): |
|
|
|
map_code = generate_map(source_location, destination_location) |
|
st.markdown(map_code, unsafe_allow_html=True) |