Spaces:
Sleeping
Sleeping
import gradio as gr import folium import networkx as nx from folium import Map, Marker, PolyLine, plugins from math import radians, cos, sin, sqrt, atan2 import json from datetime import datetime, timedelta places = { "Nyarugenge": (-1.9577, 30.0619), "Gasabo": (-1.9400, 30.0861), "Kicukiro": (-1.9781, 30.0597), "Burera": (-1.4800, 29.7300), "Gakenke": (-1.5700, 29.7561), "Rulindo": (-1.8333, 30.0833), "Musanze": (-1.5014, 29.6344), "Gicumbi": (-1.5794, 30.0542), "Nyagatare": (-1.3100, 30.3000), "Gatsibo": (-1.6800, 30.3900), "Kayonza": (-2.0000, 30.5667), "Kirehe": (-2.3553, 30.7767), "Ngoma": (-2.1600, 30.4700), "Rwamagana": (-1.9491, 30.4349), "Bugesera": (-2.2083, 30.2576), "Kamonyi": (-2.0833, 29.9000), "Muhanga": (-2.1200, 29.7561), "Ruhango": (-2.2136, 29.7628), "Nyamagabe": (-2.4978, 29.4897), "Nyaruguru": (-2.5806, 29.4306), "Huye": (-2.5921, 29.7408), "Gisagara": (-2.6283, 29.6820), "Nyanza": (-2.3566, 29.7507), "Rutsiro": (-2.0986, 29.3269), "Karongi": (-2.0667, 29.4677), "Rubavu": (-1.7481, 29.2730), "Rusizi": (-2.5406, 29.3737), "Nyamasheke": (-2.4700, 29.3222), "Ngororero": (-1.8733, 29.5811) } def haversine(coord1, coord2): R = 6371 lat1, lon1 = coord1 lat2, lon2 = coord2 dlat = radians(lat2 - lat1) dlon = radians(lon2 - lon1) a = sin(dlat/2)**2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon/2)**2 c = 2 * atan2(sqrt(a), sqrt(1 - a)) return R * c G = nx.Graph() edges = [ ("Nyarugenge", "Gasabo"), ("Gasabo", "Kicukiro"), ("Burera", "Gakenke"), ("Gakenke", "Rulindo"), ("Musanze", "Gicumbi"), ("Nyagatare", "Gatsibo"), ("Kayonza", "Kirehe"), ("Ngoma", "Rwamagana"), ("Bugesera", "Kamonyi"), ("Muhanga", "Ruhango"), ("Nyamagabe", "Nyaruguru"), ("Huye", "Gisagara"), ("Nyanza", "Ruhango"), ("Rutsiro", "Karongi"), ("Rubavu", "Rusizi"), ("Nyamasheke", "Ngororero"), ("Rulindo", "Gasabo"), ("Gicumbi", "Nyagatare"), ("Kicukiro", "Kamonyi"), ("Kamonyi", "Muhanga"), ("Ruhango", "Nyamagabe"), ("Karongi", "Rubavu"), ("Rusizi", "Nyamasheke"), ("Ngororero", "Rutsiro") ] for edge in edges: coord1 = places[edge[0]] coord2 = places[edge[1]] distance = haversine(coord1, coord2) G.add_edge(edge[0], edge[1], weight=distance) def heuristic(u, v): return haversine(places[u], places[v]) def generate_map(start, end): m = Map(location=[-2.0, 30.0], zoom_start=8) for name, coords in places.items(): Marker(location=coords, popup=name).add_to(m) if start == end: return "Hitamo aho utangiriye n’aho ugiye bitandukanye.", m._repr_html_() if not nx.has_path(G, start, end): return f"Nta nzira ibaho hagati ya {start} na {end}.", m._repr_html_() try: path = nx.astar_path(G, start, end, heuristic=heuristic, weight='weight') # Coordinates for polyline and for animation points coords = [places[p] for p in path] PolyLine(coords, color="blue", weight=5).add_to(m) # Create features for TimestampedGeoJson features = [] start_time = datetime.now() time_increment = timedelta(seconds=2) # 2 seconds between points for i, coord in enumerate(coords): feature = { "type": "Feature", "geometry": { "type": "Point", "coordinates": [coord[1], coord[0]] # GeoJSON uses [lon, lat] }, "properties": { "time": (start_time + i * time_increment).isoformat(), "style": {"color": "red"}, "icon": "circle", "iconstyle": { "fillColor": "red", "fillOpacity": 0.8, "stroke": "true", "radius": 7 } } } features.append(feature) timestamped_geojson = { "type": "FeatureCollection", "features": features } plugins.TimestampedGeoJson( timestamped_geojson, period='PT2S', add_last_point=True, auto_play=True, loop=False, max_speed=1, loop_button=True, date_options='YYYY/MM/DD HH:mm:ss', time_slider_drag_update=True ).add_to(m) return "Inzira ngufi ni: " + " ➔ ".join(path), m._repr_html_() except Exception as e: return f"Ntibishoboka kubona inzira: {str(e)}", m._repr_html_() iface = gr.Interface( fn=generate_map, inputs=[ gr.Dropdown(list(places.keys()), label="Hitamo aho uri"), gr.Dropdown(list(places.keys()), label="Hitamo aho ugiye") ], outputs=[ gr.Textbox(label="Ubutumwa"), gr.HTML(label="Ikarita") ], title="🗺️ Rwanda Smart Route Planner with Animation" ) iface.launch()
Browse files
app.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
import gradio as gr
|
2 |
import folium
|
3 |
import networkx as nx
|
4 |
-
from folium import Map, Marker, PolyLine
|
5 |
from math import radians, cos, sin, sqrt, atan2
|
|
|
|
|
6 |
|
7 |
-
# Uturere two mu Rwanda na coordinates (latitude, longitude)
|
8 |
places = {
|
9 |
"Nyarugenge": (-1.9577, 30.0619),
|
10 |
"Gasabo": (-1.9400, 30.0861),
|
@@ -37,9 +38,8 @@ places = {
|
|
37 |
"Ngororero": (-1.8733, 29.5811)
|
38 |
}
|
39 |
|
40 |
-
# Function yo kubara intera hagati y’ahantu habiri (heuristic)
|
41 |
def haversine(coord1, coord2):
|
42 |
-
R = 6371
|
43 |
lat1, lon1 = coord1
|
44 |
lat2, lon2 = coord2
|
45 |
dlat = radians(lat2 - lat1)
|
@@ -48,10 +48,7 @@ def haversine(coord1, coord2):
|
|
48 |
c = 2 * atan2(sqrt(a), sqrt(1 - a))
|
49 |
return R * c
|
50 |
|
51 |
-
# Kubaka graph y’inzira
|
52 |
G = nx.Graph()
|
53 |
-
|
54 |
-
# Edges hagati y’uturere dushobora guhuza (weight ni intera ya km ukoresheje haversine)
|
55 |
edges = [
|
56 |
("Nyarugenge", "Gasabo"),
|
57 |
("Gasabo", "Kicukiro"),
|
@@ -85,7 +82,6 @@ for edge in edges:
|
|
85 |
distance = haversine(coord1, coord2)
|
86 |
G.add_edge(edge[0], edge[1], weight=distance)
|
87 |
|
88 |
-
# Function yerekana intera hagati y’uturere mu graph nk'heuristic
|
89 |
def heuristic(u, v):
|
90 |
return haversine(places[u], places[v])
|
91 |
|
@@ -103,10 +99,55 @@ def generate_map(start, end):
|
|
103 |
try:
|
104 |
path = nx.astar_path(G, start, end, heuristic=heuristic, weight='weight')
|
105 |
|
|
|
106 |
coords = [places[p] for p in path]
|
107 |
PolyLine(coords, color="blue", weight=5).add_to(m)
|
108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
return "Inzira ngufi ni: " + " ➔ ".join(path), m._repr_html_()
|
|
|
110 |
except Exception as e:
|
111 |
return f"Ntibishoboka kubona inzira: {str(e)}", m._repr_html_()
|
112 |
|
@@ -120,7 +161,7 @@ iface = gr.Interface(
|
|
120 |
gr.Textbox(label="Ubutumwa"),
|
121 |
gr.HTML(label="Ikarita")
|
122 |
],
|
123 |
-
title="🗺️ Rwanda Smart Route Planner"
|
124 |
)
|
125 |
|
126 |
iface.launch()
|
|
|
1 |
import gradio as gr
|
2 |
import folium
|
3 |
import networkx as nx
|
4 |
+
from folium import Map, Marker, PolyLine, plugins
|
5 |
from math import radians, cos, sin, sqrt, atan2
|
6 |
+
import json
|
7 |
+
from datetime import datetime, timedelta
|
8 |
|
|
|
9 |
places = {
|
10 |
"Nyarugenge": (-1.9577, 30.0619),
|
11 |
"Gasabo": (-1.9400, 30.0861),
|
|
|
38 |
"Ngororero": (-1.8733, 29.5811)
|
39 |
}
|
40 |
|
|
|
41 |
def haversine(coord1, coord2):
|
42 |
+
R = 6371
|
43 |
lat1, lon1 = coord1
|
44 |
lat2, lon2 = coord2
|
45 |
dlat = radians(lat2 - lat1)
|
|
|
48 |
c = 2 * atan2(sqrt(a), sqrt(1 - a))
|
49 |
return R * c
|
50 |
|
|
|
51 |
G = nx.Graph()
|
|
|
|
|
52 |
edges = [
|
53 |
("Nyarugenge", "Gasabo"),
|
54 |
("Gasabo", "Kicukiro"),
|
|
|
82 |
distance = haversine(coord1, coord2)
|
83 |
G.add_edge(edge[0], edge[1], weight=distance)
|
84 |
|
|
|
85 |
def heuristic(u, v):
|
86 |
return haversine(places[u], places[v])
|
87 |
|
|
|
99 |
try:
|
100 |
path = nx.astar_path(G, start, end, heuristic=heuristic, weight='weight')
|
101 |
|
102 |
+
# Coordinates for polyline and for animation points
|
103 |
coords = [places[p] for p in path]
|
104 |
PolyLine(coords, color="blue", weight=5).add_to(m)
|
105 |
|
106 |
+
# Create features for TimestampedGeoJson
|
107 |
+
features = []
|
108 |
+
start_time = datetime.now()
|
109 |
+
time_increment = timedelta(seconds=2) # 2 seconds between points
|
110 |
+
|
111 |
+
for i, coord in enumerate(coords):
|
112 |
+
feature = {
|
113 |
+
"type": "Feature",
|
114 |
+
"geometry": {
|
115 |
+
"type": "Point",
|
116 |
+
"coordinates": [coord[1], coord[0]] # GeoJSON uses [lon, lat]
|
117 |
+
},
|
118 |
+
"properties": {
|
119 |
+
"time": (start_time + i * time_increment).isoformat(),
|
120 |
+
"style": {"color": "red"},
|
121 |
+
"icon": "circle",
|
122 |
+
"iconstyle": {
|
123 |
+
"fillColor": "red",
|
124 |
+
"fillOpacity": 0.8,
|
125 |
+
"stroke": "true",
|
126 |
+
"radius": 7
|
127 |
+
}
|
128 |
+
}
|
129 |
+
}
|
130 |
+
features.append(feature)
|
131 |
+
|
132 |
+
timestamped_geojson = {
|
133 |
+
"type": "FeatureCollection",
|
134 |
+
"features": features
|
135 |
+
}
|
136 |
+
|
137 |
+
plugins.TimestampedGeoJson(
|
138 |
+
timestamped_geojson,
|
139 |
+
period='PT2S',
|
140 |
+
add_last_point=True,
|
141 |
+
auto_play=True,
|
142 |
+
loop=False,
|
143 |
+
max_speed=1,
|
144 |
+
loop_button=True,
|
145 |
+
date_options='YYYY/MM/DD HH:mm:ss',
|
146 |
+
time_slider_drag_update=True
|
147 |
+
).add_to(m)
|
148 |
+
|
149 |
return "Inzira ngufi ni: " + " ➔ ".join(path), m._repr_html_()
|
150 |
+
|
151 |
except Exception as e:
|
152 |
return f"Ntibishoboka kubona inzira: {str(e)}", m._repr_html_()
|
153 |
|
|
|
161 |
gr.Textbox(label="Ubutumwa"),
|
162 |
gr.HTML(label="Ikarita")
|
163 |
],
|
164 |
+
title="🗺️ Rwanda Smart Route Planner with Animation"
|
165 |
)
|
166 |
|
167 |
iface.launch()
|