diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2026-09-25 09:38:12 +0200 |
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2026-09-25 09:38:12 +0200 |
| commit | ff56efd935d3c68fb9db1921819bef43020b9212 (patch) | |
| tree | c6c05dd62777a9cff6d513997f11479bba0e776a | |
| parent | 9a0a4fbfbd005c64c2db2c1606cc7dccbff22053 (diff) | |
| download | fietsboek-ff56efd935d3c68fb9db1921819bef43020b9212.tar.gz fietsboek-ff56efd935d3c68fb9db1921819bef43020b9212.tar.bz2 fietsboek-ff56efd935d3c68fb9db1921819bef43020b9212.zip | |
code for climb profile rendering
| -rw-r--r-- | fietsboek/trackmap.py | 52 |
1 files changed, 51 insertions, 1 deletions
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( + '<svg viewBox="0 -1000 1000 1000" ' + f'width="{width}" height="{height}" preserveAspectRatio="none" ' + 'xmlns="http://www.w3.org/2000/svg">\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'<polygon points="{cur_x},0 {cur_x},{-left_y} {right_x},{-right_y} {right_x},0" fill="{color}" stroke="{color}" />\n') + cur_x = right_x + + out.write("</svg>") + + result = out.getvalue() + out.close() + return result + return out + + +__all__ = ["to_web_mercator", "TrackMapRenderer", "render", "height_profile"] |
