From ff56efd935d3c68fb9db1921819bef43020b9212 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 25 Sep 2026 09:38:12 +0200 Subject: code for climb profile rendering --- fietsboek/trackmap.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/fietsboek/trackmap.py b/fietsboek/trackmap.py index 4cb13aa..cb88264 100644 --- a/fietsboek/trackmap.py +++ b/fietsboek/trackmap.py @@ -145,4 +145,54 @@ def render( return TrackMapRenderer(track, requester, size, layer).render() -__all__ = ["to_web_mercator", "TrackMapRenderer", "render"] +def _ascension_to_color(ascension: float) -> str: + if ascension >= 0.20: + return "#99108a" + if ascension >= 0.14: + return "#ad1314" + if ascension >= 0.11: + return "#cb5126" + if ascension >= 0.08: + return "#c9775b" + if ascension >= 0.05: + return "#cbc410" + if ascension >= 0.02: + return "#109874" + return "#57bf93" + + +def height_profile(track: geo.Path, size: tuple[int, int] = (300, 300)) -> str: + out = io.StringIO() + + width, height = size + + path_len = track.movement_data().length + max_elev = max(point.elevation for point in track.points) + min_elev = min(point.elevation for point in track.points) + delta_elev = max_elev - min_elev + + out.write( + '\n' + ) + + cur_x = 0 + for left, right in zip(track.points, track.points[1:]): + right_x = cur_x + (left.distance(right) / path_len) * 1000 + left_y = (left.elevation - min_elev) / delta_elev * 1000 + right_y = (right.elevation - min_elev) / delta_elev * 1000 + ascension = (right.elevation - left.elevation) / max(left.distance(right), 0.001) + color = _ascension_to_color(ascension) + out.write(f'\n') + cur_x = right_x + + out.write("") + + result = out.getvalue() + out.close() + return result + return out + + +__all__ = ["to_web_mercator", "TrackMapRenderer", "render", "height_profile"] -- cgit v1.2.3