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.
- geo_activity_playground/core/config.py +1 -0
- geo_activity_playground/core/datamodel.py +6 -0
- geo_activity_playground/core/export.py +129 -0
- geo_activity_playground/core/meta_search.py +2 -2
- geo_activity_playground/importers/directory.py +3 -2
- geo_activity_playground/importers/strava_checkout.py +2 -1
- geo_activity_playground/webui/app.py +3 -1
- geo_activity_playground/webui/authenticator.py +4 -2
- geo_activity_playground/webui/blueprints/auth_blueprint.py +3 -0
- geo_activity_playground/webui/blueprints/eddington_blueprints.py +17 -8
- geo_activity_playground/webui/blueprints/entry_views.py +5 -3
- geo_activity_playground/webui/blueprints/equipment_blueprint.py +1 -1
- geo_activity_playground/webui/blueprints/explorer_blueprint.py +300 -188
- geo_activity_playground/webui/blueprints/export_blueprint.py +30 -0
- geo_activity_playground/webui/blueprints/settings_blueprint.py +64 -1
- geo_activity_playground/webui/blueprints/upload_blueprint.py +16 -3
- geo_activity_playground/webui/static/server-side-explorer.js +55 -0
- geo_activity_playground/webui/templates/auth/index.html.j2 +1 -0
- geo_activity_playground/webui/templates/explorer/server-side.html.j2 +41 -36
- geo_activity_playground/webui/templates/export/index.html.j2 +39 -0
- geo_activity_playground/webui/templates/home.html.j2 +2 -0
- geo_activity_playground/webui/templates/page.html.j2 +3 -6
- geo_activity_playground/webui/templates/summary/index.html.j2 +2 -0
- {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/METADATA +2 -1
- {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/RECORD +28 -25
- geo_activity_playground/webui/templates/explorer/index.html.j2 +0 -148
- {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/LICENSE +0 -0
- {geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/WHEEL +0 -0
- {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
|
-
|
82
|
-
|
83
|
-
|
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,10 +14,23 @@
|
|
14
14
|
|
15
15
|
<div class="row mb-3">
|
16
16
|
<div class="col">
|
17
|
-
<
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
49
|
-
|
50
|
-
</div>
|
53
|
+
<div class="col">
|
54
|
+
<h2>Tile history</h2>
|
51
55
|
</div>
|
56
|
+
</div>
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
72
|
-
|
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.
|
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) }}">
|
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
|
|
{geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: geo-activity-playground
|
3
|
-
Version: 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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
56
|
-
geo_activity_playground/webui/authenticator.py,sha256=
|
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=
|
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=
|
63
|
-
geo_activity_playground/webui/blueprints/entry_views.py,sha256=
|
64
|
-
geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=
|
65
|
-
geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=
|
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=
|
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=
|
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=
|
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/
|
128
|
-
geo_activity_playground/webui/templates/
|
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=
|
131
|
-
geo_activity_playground/webui/templates/page.html.j2,sha256=
|
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=
|
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.
|
157
|
-
geo_activity_playground-0.
|
158
|
-
geo_activity_playground-0.
|
159
|
-
geo_activity_playground-0.
|
160
|
-
geo_activity_playground-0.
|
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 %}
|
{geo_activity_playground-0.44.0.dist-info → geo_activity_playground-1.0.0.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|
File without changes
|