Spaces:
Sleeping
Sleeping
File size: 5,088 Bytes
5ff2435 97de2b1 ee77ee9 97de2b1 5ff2435 ee77ee9 fe10d81 ee77ee9 5ff2435 ee77ee9 97de2b1 ee77ee9 5ff2435 ee77ee9 3fbf837 ee77ee9 5ff2435 ee77ee9 5ff2435 9230299 5ff2435 ee77ee9 3fbf837 97de2b1 5ff2435 3fbf837 97de2b1 5ff2435 97de2b1 ee77ee9 5ff2435 ee77ee9 cf2c7b4 97de2b1 cf2c7b4 5ff2435 ee77ee9 9230299 |
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
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()
|