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]
# }