from __future__ import annotations import html from .models import GeoPoint def build_route_svg(points: list[GeoPoint], route_indices: list[int]) -> str: if not points or not route_indices: return "" width = 760 height = 420 padding = 46 lats = [point.lat for point in points] lons = [point.lon for point in points] min_lat, max_lat = min(lats), max(lats) min_lon, max_lon = min(lons), max(lons) lat_span = max(max_lat - min_lat, 0.001) lon_span = max(max_lon - min_lon, 0.001) def project(point: GeoPoint) -> tuple[float, float]: x = padding + (point.lon - min_lon) / lon_span * (width - 2 * padding) y = height - padding - (point.lat - min_lat) / lat_span * (height - 2 * padding) return x, y projected = [project(point) for point in points] route_points = [projected[idx] for idx in route_indices] polyline = " ".join(f"{x:.1f},{y:.1f}" for x, y in route_points) marker_svg = [] first_visit_number: dict[int, int] = {} for order, idx in enumerate(route_indices, start=1): first_visit_number.setdefault(idx, order) for idx, point in enumerate(points): x, y = projected[idx] order = first_visit_number.get(idx, idx + 1) is_start = idx == 0 fill = "#0f766e" if is_start else "#2563eb" marker_svg.append( f""" {order} {html.escape(point.name)} """ ) return f"""
{''.join(marker_svg)}
"""