TRAFFIC / app.py
VIATEUR-AI's picture
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()
97de2b1 verified
raw
history blame
5.09 kB
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()