aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fietsboek/trackmap.py52
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"]