VIATEUR-AI commited on
Commit
97de2b1
·
verified ·
1 Parent(s): 3fbf837

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
Files changed (1) hide show
  1. app.py +50 -9
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 # Radius y'isi muri km
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()