Spaces:
Sleeping
Sleeping
File size: 2,830 Bytes
cac513c | 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 | import re
import folium
from bs4 import BeautifulSoup
from folium.features import DivIcon
def get_color(point_type):
return {
"start": "#28a745", # green
"end": "#dc3545", # red
"service": "#007bff" # blue
}.get(point_type, "#6c757d") # fallback: gray
def generate_route_map(route_data, output_path="optimized_route_map.html"):
"""
Generates an interactive HTML map with a route visualization.
Parameters:
route_data (dict): Contains 'point_type', 'location_id', 'lat', and 'lon' lists.
output_path (str): Path to save the resulting HTML file.
"""
# Combine route into a list of tuples
full_route = [
(lat, lon, loc_id, p_type)
for lat, lon, loc_id, p_type in zip(
route_data["lat"],
route_data["lon"],
route_data["location_id"],
route_data["point_type"]
)
]
# Detect circular route (start and end are identical)
start = full_route[0]
end = full_route[-1]
is_circular = (
start[2] == end[2] and
start[0] == end[0] and
start[1] == end[1]
)
# For markers: exclude duplicate end point if circular
display_route = full_route[:-1] if is_circular else full_route
# Create map centered on start
route_map = folium.Map(location=[start[0], start[1]], zoom_start=10)
# Add numbered markers
for idx, (lat, lon, loc_id, p_type) in enumerate(display_route, start=1):
folium.map.Marker(
location=(lat, lon),
icon=DivIcon(
icon_size=(30, 30),
icon_anchor=(15, 15),
html=f"""
<div style="
background-color: {get_color(p_type)};
color: white;
border-radius: 50%;
text-align: center;
font-size: 14px;
width: 30px;
height: 30px;
line-height: 30px;
border: 2px solid white;">
{idx}
</div>
"""
),
popup=f"{idx}. {loc_id} ({p_type})"
).add_to(route_map)
# Add polyline (always use full route to preserve loop)
polyline_points = [(lat, lon) for lat, lon, *_ in full_route]
folium.PolyLine(polyline_points, color='black', weight=3, opacity=0.7).add_to(route_map)
# Save map
route_map.save(output_path)
# route_data = {
# "point_type": ["start", "service", "service", "service", "end"],
# "location_id": ["v1", "s3", "s1", "s2", "v1"],
# "lat": [32.814268, 32.802768, 32.460452, 32.008725, 32.814268],
# "lon": [35.488181, 35.006878, 35.047826, 35.127033, 35.488181]
# }
|