Skip to content

plot_line_map

plot_line_map(
    fig: Figure, supports_geo_info: SupportGeoInfo
) -> None

Create a line map from support geo info. Args: fig: The figure to add the line map to. supports_geo_info: Support geo info containing arrays of data for multiple supports.

Source code in src/mechaphlowers/plotting/maps.py
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
def plot_line_map(fig: go.Figure, supports_geo_info: SupportGeoInfo) -> None:
    """
    Create a line map from support geo info.
    Args:
        fig: The figure to add the line map to.
        supports_geo_info: Support geo info containing arrays of data for multiple supports.
    """
    # Extract arrays from the SupportGeoInfo object
    gps_lat = supports_geo_info["latitude"]
    gps_lon = supports_geo_info["longitude"]
    elevations = supports_geo_info["elevation"]
    distances_to_next = supports_geo_info["distance_to_next"]
    bearings_to_next = supports_geo_info["bearing_to_next"]
    directions_to_next = supports_geo_info["direction_to_next"]
    lambert_x, lambert_y = supports_geo_info["lambert_93"]

    if len(gps_lat) == 0:
        return

    # Create hover text for each point
    hover_texts = []
    for i in range(len(gps_lat)):
        # Handle the last support differently since it doesn't have a "next" support
        if i < len(distances_to_next):
            distance_info = (
                f"<br>Distance to next: {distances_to_next[i]:.2f} km"
            )
            bearing_info = f"<br>Bearing to next: {bearings_to_next[i]:.1f}° ({directions_to_next[i]})"
        else:
            distance_info = "<br>Distance to next: N/A (last support)"
            bearing_info = "<br>Bearing to next: N/A (last support)"

        elevation_info = f"<br>Elevation: {elevations[i]:.2f} m"
        lambert_info = f"<br>Lambert X: {lambert_x[i]:.2f}<br>Lambert Y: {lambert_y[i]:.2f}"

        hover_text = (
            f"<b>Support {i}</b><br>"
            f"Lat: {gps_lat[i]:.6f}<br>"
            f"Lon: {gps_lon[i]:.6f}"
            + distance_info
            + bearing_info
            + elevation_info
            + lambert_info
        )
        hover_texts.append(hover_text)

    # Create combined lines+markers trace
    combined_trace = go.Scattermapbox(
        lat=gps_lat.tolist(),
        lon=gps_lon.tolist(),
        mode="lines+markers",
        line={"color": "#666666", "width": 2},
        marker=go.scattermapbox.Marker(size=10, color="#FF0000", opacity=0.8),
        text=hover_texts,
        hoverinfo="text",
        hovertemplate='%{text}<extra></extra>',
        name="Power Line Supports",
        showlegend=True,
    )

    fig.add_trace(combined_trace)

    center_lat = gps_lat.mean()
    center_lon = gps_lon.mean()

    fig.update_layout(
        mapbox={
            "style": "carto-positron",
            "center": {"lat": center_lat, "lon": center_lon},
            "zoom": 11,
        },
        margin={"r": 0, "t": 0, "l": 0, "b": 0},
        height=700,
        width=1200,
        showlegend=True,
    )