geo-activity-playground 0.44.0__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. geo_activity_playground/core/config.py +1 -0
  2. geo_activity_playground/core/datamodel.py +6 -0
  3. geo_activity_playground/core/export.py +129 -0
  4. geo_activity_playground/core/meta_search.py +2 -2
  5. geo_activity_playground/importers/directory.py +3 -2
  6. geo_activity_playground/importers/strava_checkout.py +2 -1
  7. geo_activity_playground/webui/app.py +3 -1
  8. geo_activity_playground/webui/authenticator.py +4 -2
  9. geo_activity_playground/webui/blueprints/auth_blueprint.py +3 -0
  10. geo_activity_playground/webui/blueprints/eddington_blueprints.py +17 -8
  11. geo_activity_playground/webui/blueprints/entry_views.py +5 -3
  12. geo_activity_playground/webui/blueprints/equipment_blueprint.py +1 -1
  13. geo_activity_playground/webui/blueprints/explorer_blueprint.py +300 -188
  14. geo_activity_playground/webui/blueprints/export_blueprint.py +30 -0
  15. geo_activity_playground/webui/blueprints/settings_blueprint.py +64 -1
  16. geo_activity_playground/webui/blueprints/upload_blueprint.py +16 -3
  17. geo_activity_playground/webui/static/server-side-explorer.js +55 -0
  18. geo_activity_playground/webui/templates/auth/index.html.j2 +1 -0
  19. geo_activity_playground/webui/templates/explorer/server-side.html.j2 +41 -36
  20. geo_activity_playground/webui/templates/export/index.html.j2 +39 -0
  21. geo_activity_playground/webui/templates/home.html.j2 +2 -0
  22. geo_activity_playground/webui/templates/page.html.j2 +3 -6
  23. geo_activity_playground/webui/templates/summary/index.html.j2 +2 -0
  24. {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/METADATA +2 -1
  25. {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/RECORD +28 -25
  26. geo_activity_playground/webui/templates/explorer/index.html.j2 +0 -148
  27. {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/LICENSE +0 -0
  28. {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/WHEEL +0 -0
  29. {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/entry_points.txt +0 -0
@@ -11,6 +11,7 @@ from flask import url_for
11
11
 
12
12
  from ...core.activities import ActivityRepository
13
13
  from ...core.config import Config
14
+ from ...core.datamodel import Activity
14
15
  from ...core.datamodel import DB
15
16
  from ...core.datamodel import Kind
16
17
  from ...core.enrichment import populate_database_from_extracted
@@ -24,6 +25,8 @@ from ...importers.strava_api import import_from_strava_api
24
25
  from ...importers.strava_checkout import import_from_strava_checkout
25
26
  from ..authenticator import Authenticator
26
27
  from ..authenticator import needs_authentication
28
+ from ..flasher import Flasher
29
+ from ..flasher import FlashTypes
27
30
 
28
31
 
29
32
  def make_upload_blueprint(
@@ -31,6 +34,7 @@ def make_upload_blueprint(
31
34
  tile_visit_accessor: TileVisitAccessor,
32
35
  config: Config,
33
36
  authenticator: Authenticator,
37
+ flasher: Flasher,
34
38
  ) -> Blueprint:
35
39
  blueprint = Blueprint("upload", __name__, template_folder="templates")
36
40
 
@@ -71,6 +75,12 @@ def make_upload_blueprint(
71
75
  ".tcx",
72
76
  ]
73
77
  assert target_path.is_relative_to("Activities")
78
+ if target_path.exists():
79
+ flasher.flash_message(
80
+ f"An activity with path '{target_path}' already exists. Rename the file and try again.",
81
+ FlashTypes.DANGER,
82
+ )
83
+ return redirect(url_for(".index"))
74
84
  file.save(target_path)
75
85
  scan_for_activities(
76
86
  repository,
@@ -78,9 +88,12 @@ def make_upload_blueprint(
78
88
  config,
79
89
  skip_strava=True,
80
90
  )
81
- activity_id = get_file_hash(target_path)
82
- flash(f"Activity was saved with ID {activity_id}.", "success")
83
- return redirect(f"/activity/{activity_id}")
91
+ latest_activity = DB.session.scalar(
92
+ sqlalchemy.select(Activity).order_by(Activity.id.desc()).limit(1)
93
+ )
94
+ assert latest_activity is not None
95
+ flash(f"Activity was saved with ID {latest_activity.id}.", "success")
96
+ return redirect(f"/activity/{latest_activity.id}")
84
97
 
85
98
  @blueprint.route("/refresh")
86
99
  @needs_authentication(authenticator)
@@ -0,0 +1,55 @@
1
+
2
+ let tile_layer = null
3
+
4
+ function changeColor(method) {
5
+ if (tile_layer) {
6
+ map.removeLayer(tile_layer)
7
+ }
8
+ tile_layer = L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=${method}`, {
9
+ maxZoom: 19,
10
+ attribution: map_tile_attribution
11
+ }).addTo(map)
12
+ }
13
+
14
+ let map = L.map('explorer-map', {
15
+ fullscreenControl: true,
16
+ center: [center_latitude, center_longitude],
17
+ zoom: 12
18
+ });
19
+
20
+ changeColor('cluster')
21
+
22
+ if (bbox) {
23
+ map.fitBounds(L.geoJSON(bbox).getBounds())
24
+ }
25
+
26
+ map.on('click', e => {
27
+ fetch(`/explorer/${zoom}/info/${e.latlng.lat}/${e.latlng.lng}`)
28
+ .then(response => response.json())
29
+ .then(data => {
30
+ if (!data.tile_xy) {
31
+ return;
32
+ }
33
+ console.debug(data);
34
+
35
+ let lines = [
36
+ `<dt>Tile</dt>`,
37
+ `<dd>${data.tile_xy}</dd>`,
38
+ `<dt>First visit</dt>`,
39
+ `<dd>${data.first_time}</br><a href=/activity/${data.first_activity_id}>${data.first_activity_name}</a></dd>`,
40
+ `<dt>Last visit</dt>`,
41
+ `<dd>${data.last_time}</br><a href=/activity/${data.last_activity_id}>${data.last_activity_name}</a></dd>`,
42
+ `<dt>Number of visits</dt>`,
43
+ `<dd>${data.num_visits}</dd>`,
44
+ ]
45
+ if (data.this_cluster_size) {
46
+ lines.push(`<dt>This cluster size</dt><dd>${data.this_cluster_size}</dd>`)
47
+ }
48
+
49
+ L.popup()
50
+ .setLatLng(e.latlng)
51
+ .setContent('<dl>' + lines.join('') + '</dl>')
52
+ .openOn(map);
53
+ }
54
+ );
55
+ });
@@ -14,6 +14,7 @@
14
14
  <input type="password" class="form-control" id="password" name="password" />
15
15
  </div>
16
16
 
17
+ <input type="hidden" name="redirect" value="{{ redirect }}" />
17
18
  <button type="submit" class="btn btn-primary">Log In</button>
18
19
  </form>
19
20
  {% endif %}
@@ -14,10 +14,23 @@
14
14
 
15
15
  <div class="row mb-3">
16
16
  <div class="col">
17
- <h2>Map with explored tiles</h2>
17
+ <p>You have {{ num_tiles }} explored tiles. There are {{ num_cluster_tiles }} cluster tiles in
18
+ total. Your largest cluster consists of {{ max_cluster_size }} tiles. Your largest square has size
19
+ {{ square_size }}².
20
+ </p>
21
+ <p>Open the <a
22
+ href="{{ url_for('square_planner.index', zoom=zoom, x=square_x, y=square_y, size=square_size) }}">Square
23
+ Planner</a> to plan the next extension.</p>
18
24
  </div>
19
25
  </div>
20
26
 
27
+ <div class="btn-group mb-3" role="group">
28
+ <button type="button" class="btn btn-primary" onclick="changeColor('cluster')">Cluster</button>
29
+ <button type="button" class="btn btn-primary" onclick="changeColor('first')">First Visit</button>
30
+ <button type="button" class="btn btn-primary" onclick="changeColor('last')">Last Visit</button>
31
+ <button type="button" class="btn btn-primary" onclick="changeColor('visits')">Number of Visits</button>
32
+ </div>
33
+
21
34
  <div class="row mb-3">
22
35
  <div class="col">
23
36
  <div id="explorer-map" class="mb-1" style="height: 800px;"></div>
@@ -26,47 +39,39 @@
26
39
  onclick="downloadAs('missing.geojson')">Missing as GeoJSON</a> or <a href="#"
27
40
  onclick="downloadAs('missing.gpx')"">Missing as GPX</a>.</p>
28
41
  <script>
29
- let map = L.map('explorer-map', {
30
- fullscreenControl: true,
31
- center: [{{ center.latitude }}, {{ center.longitude }}],
32
- zoom: 12
33
- });
34
- L.tileLayer('/explorer/{{ zoom }}/tile/{z}/{x}/{y}.png', {
35
- maxZoom: 19,
36
- attribution: '{{ map_tile_attribution|safe }}'
37
- }).addTo(map)
38
-
39
- let bbox = {{ center.bbox| safe }}
40
- if (bbox) {
41
- map.fitBounds(L.geoJSON(bbox).getBounds())
42
- }
42
+ const center_latitude = {{ center.latitude }};
43
+ const center_longitude = {{ center.longitude }};
44
+ const zoom = {{ zoom }};
45
+ const bbox = {{ center.bbox | safe }};
46
+ const map_tile_attribution = '{{ map_tile_attribution|safe }}';
43
47
  </script>
48
+ <script src=" /static/server-side-explorer.js"></script>
44
49
  </div>
45
50
  </div>
46
51
 
47
52
  <div class=" row mb-3">
48
- <div class="col">
49
- <h2>Tile history</h2>
50
- </div>
53
+ <div class="col">
54
+ <h2>Tile history</h2>
51
55
  </div>
56
+ </div>
52
57
 
53
- <div class="row mb-3">
54
- <div class="col-md-4">
55
- {% if plot_tile_evolution|length > 0 %}
56
- {{ vega_direct("plot_tile_evolution", plot_tile_evolution) }}
57
- {% endif %}
58
- </div>
59
- <div class="col-md-4">
60
- {% if plot_cluster_evolution|length > 0 %}
61
- {{ vega_direct("plot_cluster_evolution", plot_cluster_evolution) }}
62
- {% endif %}
63
- </div>
64
- <div class="col-md-4">
65
- {% if plot_square_evolution|length > 0 %}
66
- {{ vega_direct("plot_square_evolution", plot_square_evolution) }}
67
- {% endif %}
68
- </div>
58
+ <div class="row mb-3">
59
+ <div class="col-md-4">
60
+ {% if plot_tile_evolution|length > 0 %}
61
+ {{ vega_direct("plot_tile_evolution", plot_tile_evolution) }}
62
+ {% endif %}
63
+ </div>
64
+ <div class="col-md-4">
65
+ {% if plot_cluster_evolution|length > 0 %}
66
+ {{ vega_direct("plot_cluster_evolution", plot_cluster_evolution) }}
67
+ {% endif %}
69
68
  </div>
69
+ <div class="col-md-4">
70
+ {% if plot_square_evolution|length > 0 %}
71
+ {{ vega_direct("plot_square_evolution", plot_square_evolution) }}
72
+ {% endif %}
73
+ </div>
74
+ </div>
70
75
 
71
- {% endif %}
72
- {% endblock %}
76
+ {% endif %}
77
+ {% endblock %}
@@ -0,0 +1,39 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1>Export metadata and activities</h1>
6
+
7
+ <p>Here you can export all metadata and activities as a ZIP file. Depending on the file format chosen, exporting an
8
+ activity can take around one second. You can observe a progress bar in the terminal.</p>
9
+
10
+ <form method="get" enctype="multipart/form-data" action="{{ url_for('.export') }}">
11
+ <div class="mb-3">
12
+ <label for="meta_format" class="form-label">Metadata format</label>
13
+ <select name="meta_format" id="meta_format" class="form-select" aria-label="Metadata format">
14
+ <option value="parquet">Parquet</option>
15
+ {# <option value="json">JSON</option> #}
16
+ <option value="csv">CSV</option>
17
+ <option value="xlsx">Excel</option>
18
+ <option value="ods">OpenDocument Spreadsheet (LibreOffice)</option>
19
+ </select>
20
+ </div>
21
+
22
+ <div class="mb-3">
23
+ <label for="activity_format" class="form-label">Activity time series format</label>
24
+ <select name="activity_format" id="activity_format" class="form-select"
25
+ aria-label="Activity time series format">
26
+ <option value="">No export of activities</option>
27
+ <option value="parquet">Parquet</option>
28
+ <option value="csv">CSV</option>
29
+ <option value="geojson">GeoJSON</option>
30
+ <option value="gpx">GPX</option>
31
+ <option value="xlsx">Excel</option>
32
+ <option value="ods">OpenDocument Spreadsheet (LibreOffice)</option>
33
+ </select>
34
+ </div>
35
+ <button type="submit" class="btn btn-primary">Export</button>
36
+ </form>
37
+
38
+
39
+ {% endblock %}
@@ -9,7 +9,9 @@
9
9
  <div class="col">
10
10
  <h2>Last 30 days</h2>
11
11
  {{ vega_direct("distance-last-30-days", distance_last_30_days_plot) }}
12
+ {% if elevation_gain_last_30_days_plot %}
12
13
  {{ vega_direct("elevation-gain-last-30-days", elevation_gain_last_30_days_plot) }}
14
+ {% endif %}
13
15
  </div>
14
16
  </div>
15
17
 
@@ -94,14 +94,10 @@
94
94
  Explorer
95
95
  </a>
96
96
  <ul class="dropdown-menu">
97
- <li><a class="dropdown-item" href="{{ url_for('explorer.map', zoom=14) }}">Explorer
98
- Tiles (Zoom 14)</a></li>
99
- <li><a class="dropdown-item" href="{{ url_for('explorer.map', zoom=17) }}">Squadratinhos
100
- (Zoom 17)</a></li>
101
- <li><a class="dropdown-item" href="{{ url_for('explorer.server_side', zoom=14) }}">Fast
97
+ <li><a class="dropdown-item" href="{{ url_for('explorer.server_side', zoom=14) }}">
102
98
  Explorer
103
99
  Tiles (Zoom 14)</a></li>
104
- <li><a class="dropdown-item" href="{{ url_for('explorer.server_side', zoom=17) }}">Fast
100
+ <li><a class="dropdown-item" href="{{ url_for('explorer.server_side', zoom=17) }}">
105
101
  Squadratinhos
106
102
  (Zoom 17)</a></li>
107
103
 
@@ -150,6 +146,7 @@
150
146
  <li><a class="dropdown-item" href="{{ url_for('plot_builder.index') }}">Plot Builder</a>
151
147
  </li>
152
148
  <li><a class="dropdown-item" href="{{ url_for('settings.index') }}">Settings</a></li>
149
+ <li><a class="dropdown-item" href="{{ url_for('export.index') }}">Data Export</a></li>
153
150
  </ul>
154
151
  </li>
155
152
 
@@ -103,10 +103,12 @@
103
103
 
104
104
  <div class="tab-content mb-3" id="myTabContent">
105
105
  {% for year, plot in plot_distance_heatmaps.items() %}
106
+ {% if year %}
106
107
  <div class="tab-pane fade {% if loop.last %} show active {% endif %}" id="heatmap-{{ year }}-pane" role="tabpanel"
107
108
  aria-labelledby="heatmap-{{ year }}" tabindex="0">
108
109
  {{ vega_direct("plot_distance_heatmap_%d"|format(year), plot) }}
109
110
  </div>
111
+ {% endif %}
110
112
  {% endfor %}
111
113
  </div>
112
114
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 0.44.0
3
+ Version: 1.0.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -28,6 +28,7 @@ Requires-Dist: gpxpy (>=1.5.0,<2.0.0)
28
28
  Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
29
29
  Requires-Dist: matplotlib (>=3.10.1,<4.0.0)
30
30
  Requires-Dist: numpy (>=2.2.3,<3.0.0)
31
+ Requires-Dist: openpyxl (>=3.1.5,<4.0.0)
31
32
  Requires-Dist: pandas (>=2.2.3,<3.0.0)
32
33
  Requires-Dist: pyarrow (>=19.0.1,<20.0.0)
33
34
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
@@ -15,12 +15,13 @@ geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmar
15
15
  geo_activity_playground/alembic/versions/script.py.mako,sha256=3qBrHBf7F7ChKDUIdiNItiSXrDpgQdM7sR0YKzpaC50,689
16
16
  geo_activity_playground/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  geo_activity_playground/core/activities.py,sha256=apP_-Rg1ub3lh7RARMGXf2BOmJTiahxqpX_soEnYF3E,4681
18
- geo_activity_playground/core/config.py,sha256=eGWWbNfHa6H64AHCnFYTsAJ7-pWi-PhyxL4hjZ4u03U,5256
18
+ geo_activity_playground/core/config.py,sha256=MhNaVS04rH_1KTUE1IrCTVsKtrSqKgMT7mzgPAri3vk,5305
19
19
  geo_activity_playground/core/coordinates.py,sha256=tDfr9mlXhK6E_MMIJ0vYWVCoH0Lq8uyuaqUgaa8i0jg,966
20
- geo_activity_playground/core/datamodel.py,sha256=9QZAk083Bqsx0p3STHv1fC__e7WuFrXx6hwdBTxgMss,13268
20
+ geo_activity_playground/core/datamodel.py,sha256=8JRviRgjEKwJbC6VSSimOdvIfSy5IJu41_ibQLeg0xk,13514
21
21
  geo_activity_playground/core/enrichment.py,sha256=Tju9sKI-V40CmsS9RiNeGz-Zhp_hx1xjlaWzJMrasXI,7640
22
+ geo_activity_playground/core/export.py,sha256=ayOmhWL72263oP9NLIZRYCg_Db0GLUFhgNIL_MCrV-E,4435
22
23
  geo_activity_playground/core/heart_rate.py,sha256=-S3WAhS7AOywrw_Lk5jfuo_fu6zvZQ1VtjwEKSycWpU,1542
23
- geo_activity_playground/core/meta_search.py,sha256=Ygh2uySZ9_q-oddU_2vXfzGfXV9rfTyeQFBT7sIiXCI,6657
24
+ geo_activity_playground/core/meta_search.py,sha256=nyvCuR7v0pd6KjA8W5Kr71bBafRdE_ol7uSFRJs4eAM,6662
24
25
  geo_activity_playground/core/missing_values.py,sha256=HjonaLV0PFMICnuMrbdUNnK9uy_8PBh_RxI5GuEMQK0,250
25
26
  geo_activity_playground/core/parametric_plot.py,sha256=IefPc6lwthxowvjUDA5wu23oBSw9jq399l04gSaNrOQ,3880
26
27
  geo_activity_playground/core/paths.py,sha256=GGNpqhQL7etn8-NV6hVGLT7yBZYq7AwXnWfX3l_Cj48,2670
@@ -45,33 +46,34 @@ geo_activity_playground/heatmap_video.py,sha256=I8i1uVvbbPUXVtvLAROaLy58nQoUPnuM
45
46
  geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
47
  geo_activity_playground/importers/activity_parsers.py,sha256=yD7L5eDOpiLWf6RHSQf4-Nk2S3vgfVHngc9ZlFSrioM,11090
47
48
  geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
48
- geo_activity_playground/importers/directory.py,sha256=4Q7UAFa7ztkgqf4FvPbH2LlrO-7a8Fu7tkYPHOpHm1g,5210
49
+ geo_activity_playground/importers/directory.py,sha256=eTLfcMdc5mt9iDBinuaXjRIA688i6QZQjXNNhm1PKz4,5282
49
50
  geo_activity_playground/importers/strava_api.py,sha256=J0-VXNrLq22fhTcWkQPE5AVrzy5aegC7SBi-UXFtAy4,7576
50
- geo_activity_playground/importers/strava_checkout.py,sha256=3AEFlNr811MdVz_Ww1zz_alptr_3mDvGr188bM3qU7U,9977
51
+ geo_activity_playground/importers/strava_checkout.py,sha256=NwcOje0XxkccXRY5-3CJorYLFuniaFm8VHg4nHwkji4,10045
51
52
  geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xNyNaIO6Mkeu55hVziVl22QE4,1092
52
53
  geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
53
54
  geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
54
55
  geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- geo_activity_playground/webui/app.py,sha256=SyRztm6P0pQuq3Vn4g7gFwg1pwyZsElVNZOeljN5jEY,8139
56
- geo_activity_playground/webui/authenticator.py,sha256=jtQqvpVHa_eLTAulmvvJgDRoCWOEege49G9zn3MfYk8,1394
56
+ geo_activity_playground/webui/app.py,sha256=BJy34kychEIzWYc1romzZIpw5ZHl_MbQA6_1TX6P6MU,8268
57
+ geo_activity_playground/webui/authenticator.py,sha256=dhREYOu_TCD_nzFNuSlHIbf5K6TmwKdXtr1wxD8fBcc,1491
57
58
  geo_activity_playground/webui/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
59
  geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=EjaTe6VFkRpO9DEkHHurt5GDzAvHHUqgQgfBdiN239Q,26457
59
- geo_activity_playground/webui/blueprints/auth_blueprint.py,sha256=_VZeP3VN626BoOOZUkNVnuw9v-cEOrkHz5lhFPmxqMY,784
60
+ geo_activity_playground/webui/blueprints/auth_blueprint.py,sha256=3DkZAnPFd0s7YN7EUkApB6hgtU46Ll8PyYuZcNSiyHI,940
60
61
  geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py,sha256=xESHzYxlbhz4oNDuxV0A70eVKpFwz84pYC3q_YVZZg8,2812
61
62
  geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=4EIBZ8rdXEu3tbl1faVlRwHb8Qp0JuMc3eyxwMkq6g8,2848
62
- geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=Umb2wtKmAXuQZEXt0d985qMILtvqc3vxj_yXymnzmUs,8702
63
- geo_activity_playground/webui/blueprints/entry_views.py,sha256=9OuaxbA-J5D2Qn2OSSIjIb-eRTxXY8i1LhlfUk1W60Q,2910
64
- geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=juQ5L2BlrECb00LBbiY2yc0b8W_B9Y3fPwtbiaRfgpo,5634
65
- geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=jMjLxmUhy9ip4Jjw9ABfkdD3CfqXqcE2C0VwQUBZ3WY,15598
63
+ geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=8ctEZWIc0hWjVr3ezNTjxwDHO5M-XzUoupA69RrovB0,8896
64
+ geo_activity_playground/webui/blueprints/entry_views.py,sha256=Lzd-hkflmN3GY24qm6dHazIe78wxnQFdFTUsoZOUH-M,2978
65
+ geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=26L2BM7lZo8rDf5Ipara5zA4tfSrvE18POqAZqjzH38,5659
66
+ geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=vsotoSS6G1HMXosVF3Ru6nNtap45OD3nTVQ-5EOZD8Y,21671
67
+ geo_activity_playground/webui/blueprints/export_blueprint.py,sha256=NO3jqRy3tmEdK0Ei5wQ1f6cRdEHJa4VvfVs1kY6AhgI,972
66
68
  geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=iHI5YJYhX7ZOlzTgzl2efIRDzt3UMYCx7X4-LVd0MWk,8702
67
69
  geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=sYGp2XVGodkAifGHbEqpIY-7bBH5R7G7Dwg4HqgxMSY,7269
68
70
  geo_activity_playground/webui/blueprints/plot_builder_blueprint.py,sha256=7HrjpBM-608HSOh0i31Lmt7yDNMfWlEn6G7DlYqlV9w,3031
69
71
  geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=Sv_KL1Cdai26y51qVfI-5jZLhtElREsEar1dbR_VAC4,2275
70
- geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=EFdaV_l-CLwLWC8AvYbGDf-okHowK40u9dW-bUq_1MI,18092
72
+ geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=FLKQ0JTThUlsCBR2TqRvdDGIJpPDycy47iiQof9gbHA,20077
71
73
  geo_activity_playground/webui/blueprints/square_planner_blueprint.py,sha256=xVaxJxmt8Dysl3UL9f2y__LVLtTH2Np1Ust4OSXKRAk,4746
72
74
  geo_activity_playground/webui/blueprints/summary_blueprint.py,sha256=rK4LGR2Rpioy4wSqNYuyRn4WxaWeBLensJ3PmAd-ouY,11469
73
75
  geo_activity_playground/webui/blueprints/tile_blueprint.py,sha256=YzZf9OrNdjhc1_j4MtO1DMcw1uCv29ueNsYd-mWqgbg,837
74
- geo_activity_playground/webui/blueprints/upload_blueprint.py,sha256=9IeaxS7ObqLhe8eju8nVXUt2FfEOw9mMz9qxFdWUJ3k,4607
76
+ geo_activity_playground/webui/blueprints/upload_blueprint.py,sha256=3nJGGNYjB22aFXDlgCFMK8t0RRkqQi_Pr33H3DtVP5M,5177
75
77
  geo_activity_playground/webui/columns.py,sha256=hSW8bFVKRUMBlWZYAN-tZ_tfED3VDQK75e4Zzw7_jZ0,642
76
78
  geo_activity_playground/webui/flasher.py,sha256=Covc1D9cO_jjokRWnvyiXCc2tfp3aZ8XkNqFdA1AXtk,500
77
79
  geo_activity_playground/webui/plot_util.py,sha256=5Uesjj-xcMskQX2z9viDZYHSxLGrH2a5dHA1ogsJW9U,261
@@ -103,6 +105,7 @@ geo_activity_playground/webui/static/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_
103
105
  geo_activity_playground/webui/static/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
104
106
  geo_activity_playground/webui/static/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
105
107
  geo_activity_playground/webui/static/mstile-150x150.png,sha256=j1ANUQJ1Xi1DR2sGqYZztob2ypfGw04eNtGpN9SxExA,11964
108
+ geo_activity_playground/webui/static/server-side-explorer.js,sha256=TV8YIVgWnGt6slzneGcj4rfyst9MEkMpjbuyiIBfQRw,1643
106
109
  geo_activity_playground/webui/static/site.webmanifest,sha256=G5wl5Ahfz6wyDt-Z7ea-ywG1WS1S7ZQ_QX9TM2ox6Lk,450
107
110
  geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
108
111
  geo_activity_playground/webui/static/vega-embed@6,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
@@ -116,7 +119,7 @@ geo_activity_playground/webui/templates/activity/lines.html.j2,sha256=_ZDg1ruW-9
116
119
  geo_activity_playground/webui/templates/activity/name.html.j2,sha256=7Wbh3IrVL5lMRve467H0P10Shn5FzGpaXLhV0H-X4Hk,2725
117
120
  geo_activity_playground/webui/templates/activity/show.html.j2,sha256=obKXSvRJxpeo53k7aCUrrhJSus9msuPGStIQJQQHpes,10975
118
121
  geo_activity_playground/webui/templates/activity/trim.html.j2,sha256=3oAXQab6QqWjGBC9KCvWNOVn8uRmxoDLj3hx_O63TXc,1836
119
- geo_activity_playground/webui/templates/auth/index.html.j2,sha256=ILQ5HvTEYc3OrtOAIFt1VrqWorVD70V9DC342znmP70,579
122
+ geo_activity_playground/webui/templates/auth/index.html.j2,sha256=wzA0uxpiT1ktDadgnjvFXc9iUGMFm9GhjDkavl3S1h4,646
120
123
  geo_activity_playground/webui/templates/bubble_chart/index.html.j2,sha256=yd7lWjtxxVmJZqCiXb0Y1gMEOQ7LQYJXEdpE7JB1OZY,1616
121
124
  geo_activity_playground/webui/templates/calendar/index.html.j2,sha256=8dV9yeDwfv0Mm81mhiPHN5r3hdPUWl1Yye03x0Rqbo8,1601
122
125
  geo_activity_playground/webui/templates/calendar/month.html.j2,sha256=IEhGqknL69okX5brMzTgZdnmrgUQLmGGkDE5zd7RG7s,2008
@@ -124,11 +127,11 @@ geo_activity_playground/webui/templates/eddington/distance.html.j2,sha256=TkMey-
124
127
  geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2,sha256=eE-xrhtwvtAohq5VXKZmeBjab3E0R7EdmCJlNTAvFAg,4803
125
128
  geo_activity_playground/webui/templates/elevation_eddington/index.html.j2,sha256=Pgis0-yH5qtSwRnJ5H_Umjk1nxk-t-LnpHIqklezPS4,4823
126
129
  geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=wwrGmfCCBn-5CzMymi80hg3lNMZ7J1fAWWl_2zHeiMc,1845
127
- geo_activity_playground/webui/templates/explorer/index.html.j2,sha256=3t9ikAF6oMvEaVlS3Kb1tj9ngomIQlatzqPnqVsEDKA,6908
128
- geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=3eYh3mmgPDmxFjH6Ofx1iw-jptcD9ctZixYh59mka3w,2496
130
+ geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=zuYoUpW2IdnAxp3p5dHYQ2fOp-nXJ6e0FrbTCSeeMoc,3081
131
+ geo_activity_playground/webui/templates/export/index.html.j2,sha256=vxqpAm9KnT405Qz7q0_td-HZ4mCjcPR4Lp6EnIEWisg,1652
129
132
  geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=uM-l4gmDKw6307ZH_zb8zroMTKBuOkrR0Bu4fTEJE0s,1231
130
- geo_activity_playground/webui/templates/home.html.j2,sha256=L0wVZ6RA3mel1Wt7ZD7PbaMUEEcdO2XLDy1e1ZdRPUY,2697
131
- geo_activity_playground/webui/templates/page.html.j2,sha256=QJtRcHciEEWUUf6LHll2RUm0NRXSkNGIYn1FHOKSrM4,12534
133
+ geo_activity_playground/webui/templates/home.html.j2,sha256=EBLKVNgLYgTPzdFutoSkdlbu_UCCat5ItDFlYyRqcAg,2767
134
+ geo_activity_playground/webui/templates/page.html.j2,sha256=B4kFT4L3J4PwN0K2UJb1DPPN8P7JPI_HzRvs9y2pusY,12284
132
135
  geo_activity_playground/webui/templates/photo/map.html.j2,sha256=MWhqt5Q8ExiRhgxndcEnwngOj1qw0E0u4hKuiuY24Gg,1437
133
136
  geo_activity_playground/webui/templates/photo/new.html.j2,sha256=GGLejO4ap6ZMe54jZP39ktSLkdw5j67bf5PTlHEK7qc,383
134
137
  geo_activity_playground/webui/templates/plot_builder/edit.html.j2,sha256=x5Ki425me3HY6CcBQ37le9g8rCpbOxFVkdr0N_L84-g,2230
@@ -150,11 +153,11 @@ geo_activity_playground/webui/templates/settings/tags-edit.html.j2,sha256=Lna2QB
150
153
  geo_activity_playground/webui/templates/settings/tags-list.html.j2,sha256=6giFWtVCTLXLC_Ojh56XhB_1Rouit9YzIs_YHIiayLg,369
151
154
  geo_activity_playground/webui/templates/settings/tags-new.html.j2,sha256=xi6KbwydDVrUJM4_ty4KbMa74k3QaoyZhZAn2paERnM,358
152
155
  geo_activity_playground/webui/templates/square_planner/index.html.j2,sha256=-OnY2nQCgZCslOzf28ogZwFykwF8tZm7PgFwOE3eBDk,8176
153
- geo_activity_playground/webui/templates/summary/index.html.j2,sha256=soGpTK-pD81YBlMWNWLnkWeEmVIbI5JwmGZQUN2c3DI,9151
156
+ geo_activity_playground/webui/templates/summary/index.html.j2,sha256=1kTuwWvOM3McEdY8N5rKj-R4CC6uqswl7NsGVF8hsDA,9185
154
157
  geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
155
158
  geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
156
- geo_activity_playground-0.44.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
157
- geo_activity_playground-0.44.0.dist-info/METADATA,sha256=w8_RW19yZpYDP_0AHdlIT3ooh-8UFY5KvYvapT2wPJM,1850
158
- geo_activity_playground-0.44.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
159
- geo_activity_playground-0.44.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
160
- geo_activity_playground-0.44.0.dist-info/RECORD,,
159
+ geo_activity_playground-1.0.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
160
+ geo_activity_playground-1.0.0.dist-info/METADATA,sha256=goJ98tnDHWY17fpoRf_tOfxxdW38OYGKds34c86_R0c,1890
161
+ geo_activity_playground-1.0.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
162
+ geo_activity_playground-1.0.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
163
+ geo_activity_playground-1.0.0.dist-info/RECORD,,
@@ -1,148 +0,0 @@
1
- {% extends "page.html.j2" %}
2
-
3
- {% block container %}
4
-
5
- <h1>Explorer Tiles</h1>
6
-
7
- {% if zoom_level_not_generated %}
8
- <p>You try to access explorer tiles for a level that hasn't been generated before. That is not a problem, we just don't
9
- generate all levels to save a bit of time. If you want to have it, just enable it!</p>
10
-
11
- <a href="{{ url_for('.enable_zoom_level', zoom=zoom_level_not_generated) }}" class="btn btn-primary">Enable Zoom {{
12
- zoom_level_not_generated }}</a>
13
- {% else %}
14
-
15
- <div class="row mb-3">
16
- <div class="col">
17
- <p>You have {{ explored.num_tiles }} explored tiles. There are {{ explored.num_cluster_tiles }} cluster tiles in
18
- total. Your largest cluster consists of {{ explored.max_cluster_size }} tiles. Your largest square has size
19
- {{
20
- explored.square_size }}².
21
- </p>
22
- <p>Open the <a
23
- href="{{ url_for('square_planner.index', zoom=zoom, x=explored.square_x, y=explored.square_y, size=explored.square_size) }}">Square
24
- Planner</a> to plan the next extension.</p>
25
- </div>
26
- </div>
27
-
28
- <div class="row mb-3">
29
- <div class="col">
30
- <h2>Map with explored tiles</h2>
31
- </div>
32
- </div>
33
-
34
- <div class="row mb-3">
35
- <div class="col">
36
- <div class="btn-group mb-3" role="group">
37
- <button type="button" class="btn btn-primary" onclick="changeColor('cluster')">Cluster</button>
38
- <button type="button" class="btn btn-primary" onclick="changeColor('first')">First Visit</button>
39
- <button type="button" class="btn btn-primary" onclick="changeColor('last')">Last Visit</button>
40
- </div>
41
- <div id="explorer-map" class="mb-1" style="height: 800px;"></div>
42
- <p>Download tiles in visible area: <a href="#" onclick="downloadAs('explored.geojson')">Explored as GeoJSON</a>,
43
- <a href="#" onclick="downloadAs('explored.gpx')"">Explored as GPX</a>, <a href=" #"
44
- onclick="downloadAs('missing.geojson')">Missing as GeoJSON</a> or <a href="#"
45
- onclick="downloadAs('missing.gpx')"">Missing as GPX</a>.</p>
46
- <script>
47
- function onEachFeature(feature, layer) {
48
- if (feature.properties && feature.properties.first_visit) {
49
- let lines = [
50
- `<dt>Tile</dt>`,
51
- `<dd>${feature.properties.tile}</dd>`,
52
- `<dt>First visit</dt>`,
53
- `<dd>${feature.properties.first_visit}</br><a href=/activity/${feature.properties.first_activity_id}>${feature.properties.first_activity_name}</a></dd>`,
54
- `<dt>Last visit</dt>`,
55
- `<dd>${feature.properties.last_visit}</br><a href=/activity/${feature.properties.last_activity_id}>${feature.properties.last_activity_name}</a></dd>`,
56
- `<dt>Number of visits</dt>`,
57
- `<dd>${feature.properties.num_visits}</dd>`,
58
- ]
59
- if (feature.properties.this_cluster_size) {
60
- lines.push(`<dt>This cluster size</dt><dd>${feature.properties.this_cluster_size}</dd>`)
61
- }
62
- layer.bindPopup('<dl>' + lines.join('') + '</dl>')
63
- }
64
- }
65
-
66
- let explorer_geojson = {{ explored.explored_geojson| safe}}
67
- let square_geojson = {{ explored.square_geojson | safe }}
68
- let map = L.map('explorer-map', {
69
- fullscreenControl: true,
70
- center: [{{ center.latitude }}, {{ center.longitude }}],
71
- zoom: 10
72
- })
73
- let tile_layer = L.tileLayer('/tile/grayscale/{z}/{x}/{y}.png', {
74
- maxZoom: 19,
75
- attribution: '{{ map_tile_attribution|safe }}'
76
- });
77
- tile_layer.addTo(map)
78
- let explorer_layer_cluster_color = L.geoJSON(explorer_geojson, {
79
- style: function (feature) {
80
- return {
81
- color: feature.properties.color, fillColor: feature.properties.color,
82
- weight: 0.5
83
- }
84
- },
85
- onEachFeature: onEachFeature
86
- }).addTo(map)
87
- let explorer_layer_first_age_color = L.geoJSON(explorer_geojson, {
88
- style: function (feature) {
89
- return {
90
- color: " #440154", fillColor: feature.properties.first_age_color, weight: 0.5
91
- }
92
- },
93
- onEachFeature: onEachFeature
94
- }); let explorer_layer_last_age_color = L.geoJSON(explorer_geojson, {
95
- style:
96
- function (feature) {
97
- return {
98
- color: "#440154", fillColor: feature.properties.last_age_color, weight:
99
- 0.5
100
- }
101
- }, onEachFeature: onEachFeature
102
- }); let bbox = {{ center.bbox| safe }}; if (bbox) {
103
- map.fitBounds(L.geoJSON(bbox).getBounds())
104
- }; let explorer_square_layer = L.geoJSON(square_geojson, {
105
- style: function (feature) { return { color: "blue", fill: false, weight: 2 } }
106
- }).addTo(map)
107
- active_layer = explorer_layer_cluster_color; function changeColor(method) {
108
- map.removeLayer(active_layer)
109
- if (method == "cluster") { active_layer = explorer_layer_cluster_color } else if (method == "first") {
110
- active_layer = explorer_layer_first_age_color
111
- } else if (method == "last") {
112
- active_layer = explorer_layer_last_age_color
113
- } map.addLayer(active_layer)
114
- } function downloadAs(suffix) {
115
- bounds = map.getBounds(); zoom = "{{ zoom }}"
116
- window.location.href = `/explorer/${zoom}/${bounds.getNorth()}/${bounds.getEast()}/${bounds.getSouth()}/${bounds.getWest()}/${suffix}`
117
- } </script>
118
- <p></p><button type="button" class="btn btn-secondary btn-sm"
119
- onclick="map.removeLayer(tile_layer)">Remove map background</button>
120
- </div>
121
- </div>
122
-
123
- <div class="row mb-3">
124
- <div class="col">
125
- <h2>Tile history</h2>
126
- </div>
127
- </div>
128
-
129
- <div class="row mb-3">
130
- <div class="col-md-4">
131
- {% if plot_tile_evolution|length > 0 %}
132
- {{ vega_direct("plot_tile_evolution", plot_tile_evolution) }}
133
- {% endif %}
134
- </div>
135
- <div class="col-md-4">
136
- {% if plot_cluster_evolution|length > 0 %}
137
- {{ vega_direct("plot_cluster_evolution", plot_cluster_evolution) }}
138
- {% endif %}
139
- </div>
140
- <div class="col-md-4">
141
- {% if plot_square_evolution|length > 0 %}
142
- {{ vega_direct("plot_square_evolution", plot_square_evolution) }}
143
- {% endif %}
144
- </div>
145
- </div>
146
-
147
- {% endif %}
148
- {% endblock %}