File size: 4,115 Bytes
0ed3848
4cfb561
 
 
 
65d5924
4cfb561
d72524f
65d5924
4cfb561
 
 
 
 
 
 
 
65d5924
4cfb561
65d5924
4cfb561
 
 
 
 
65d5924
4cfb561
 
 
 
 
 
0ed3848
34d2572
 
 
 
0ed3848
34d2572
0ed3848
4cfb561
0ed3848
 
1852538
0ed3848
 
 
 
34d2572
 
 
0ed3848
 
 
 
34d2572
 
0ed3848
 
 
 
 
 
 
 
 
34d2572
0ed3848
34d2572
0ed3848
 
28bdba9
65d5924
28bdba9
34d2572
27bf8af
34d2572
65d5924
28bdba9
 
34d2572
4cfb561
0ed3848
 
 
34d2572
0ed3848
 
 
 
 
 
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
import gradio as gr
import folium
import googlemaps
from datetime import datetime
import os

# Initialize Google Maps API client securely
gmaps = googlemaps.Client(key=os.getenv('GOOGLE_API_KEY'))  # Fetch API key from Hugging Face secrets

# Function to fetch directions
def get_directions_and_coords(source, destination):
    now = datetime.now()
    directions_info = gmaps.directions(source, destination, mode='driving', departure_time=now)
    if directions_info:
        steps = directions_info[0]['legs'][0]['steps']
        coords = [(step['start_location']['lat'], step['start_location']['lng']) for step in steps]
        return steps, coords
    else:
        return None, None

# Function to render map with directions
def render_folium_map(coords):
    m = folium.Map(location=[coords[0][0], coords[0][1]], zoom_start=13)
    folium.PolyLine(coords, color="blue", weight=2.5, opacity=1).add_to(m)
    return m

# Function to search nearby medical centers using Google Places API
def search_medical_centers(query, location, radius=10000):
    # Search for places like hospitals or medical centers nearby
    places_result = gmaps.places_nearby(location, radius=radius, type='hospital', keyword=query)
    return places_result.get('results', [])

# Function to get directions and display on Gradio UI
def get_route_and_medical_centers(current_location, destination_location, health_professional_query):
    route_info = ""
    m = None  # Default to None
    
    # Fetch the directions for the route
    steps, coords = get_directions_and_coords(current_location, destination_location)
    
    if steps and coords:
        route_info = [f"{i+1}. {step['html_instructions']}" for i, step in enumerate(steps)]
        m = render_folium_map(coords)
    else:
        route_info = "No available routes."
        m = folium.Map(location=[20, 0], zoom_start=2)  # Default map if no route
    
    # Fetch nearby medical centers if the location input is provided
    if current_location and health_professional_query:
        # Fetch the coordinates of the current location using Google Geocoding
        geocode_result = gmaps.geocode(current_location)
        if geocode_result:
            location_coords = geocode_result[0]['geometry']['location']
            lat, lon = location_coords['lat'], location_coords['lng']
            
            # Fetch nearby medical centers based on the query
            medical_centers = search_medical_centers(health_professional_query, (lat, lon))
            
            if medical_centers:
                for center in medical_centers:
                    name = center['name']
                    vicinity = center.get('vicinity', 'N/A')
                    rating = center.get('rating', 'N/A')
                    folium.Marker([center['geometry']['location']['lat'], center['geometry']['location']['lng']], 
                                  popup=f"{name}\n{vicinity}\nRating: {rating}").add_to(m)
            else:
                route_info += "\nNo medical centers found matching your query."
        else:
            route_info += "\nCould not retrieve location coordinates."
    
    # Return both the route info and the map
    return "\n".join(route_info), m._repr_html_()

# Gradio UI components (Updated for Gradio v3.x)
current_location_input = gr.Textbox(value="Honolulu, HI", label="Current Location")
destination_location_input = gr.Textbox(value="Maui, HI", label="Destination Location")
health_professional_query_input = gr.Textbox(value="Hawaii Medical Center", label="Health Professional Query")

# Output components (Updated for Gradio v3.x)
route_info_output = gr.Textbox(label="Driving Directions")
map_output = gr.HTML(label="Map with Route and Health Professionals")

# Create Gradio interface
iface = gr.Interface(
    fn=get_route_and_medical_centers,  # Function to call
    inputs=[current_location_input, destination_location_input, health_professional_query_input],  # Inputs
    outputs=[route_info_output, map_output],  # Outputs
    live=True  # Update outputs live as inputs change
)

# Launch Gradio interface
iface.launch()