commit 10a6622b669c52dec6423a70345da3e5d9c9bb59
parent 792ead707fe83429c98221e88a109ead824aa670
Author: Nikolay Korotkiy <sikmir@gmail.com>
Date: Wed, 16 Jun 2021 22:10:16 +0300
tracks: load tracks from wikiloc url
Related to #252
Diffstat:
6 files changed, 78 insertions(+), 1 deletion(-)
diff --git a/eslint_rules/legacy_files_list.js b/eslint_rules/legacy_files_list.js
@@ -78,6 +78,7 @@ module.exports = [
'src/lib/leaflet.control.track-list/lib/services/tracedetrail.js',
'src/lib/leaflet.control.track-list/lib/services/gpslib.js',
'src/lib/leaflet.control.track-list/lib/services/openstreetmapRu.js',
+ 'src/lib/leaflet.control.track-list/lib/services/wikiloc.js',
'src/lib/leaflet.control.track-list/lib/services/etomesto.js',
'src/lib/leaflet.control.track-list/lib/services/yandex.js',
'src/lib/leaflet.control.track-list/lib/services/osm.js',
diff --git a/package.json b/package.json
@@ -88,6 +88,7 @@
"rbush": "^3.0.1",
"regenerator-runtime": "^0.13.7",
"tiny-inflate": "^1.0.2",
+ "twkb": "^0.2.2",
"utf8": "^3.0.0"
}
}
diff --git a/src/lib/leaflet.control.track-list/lib/services/index.js b/src/lib/leaflet.control.track-list/lib/services/index.js
@@ -10,6 +10,7 @@ import {MovescountMove, MovescountRoute} from './movescount';
import {GarminActivity, GarminRoute} from './garmin';
import {SportsTrackerActivity} from './sportstracker';
import OpenStreetMapRu from './openstreetmapRu';
+import Wikiloc from './wikiloc';
const services = [
YandexRuler,
@@ -26,6 +27,7 @@ const services = [
GarminRoute,
SportsTrackerActivity,
OpenStreetMapRu,
+ Wikiloc,
SimpleService
];
diff --git a/src/lib/leaflet.control.track-list/lib/services/wikiloc.js b/src/lib/leaflet.control.track-list/lib/services/wikiloc.js
@@ -0,0 +1,68 @@
+import BaseService from './baseService';
+import urlViaCorsProxy from '~/lib/CORSProxy';
+import {stringToArrayBuffer} from '~/lib/binary-strings';
+import twkb from 'twkb';
+
+class Wikiloc extends BaseService {
+ urlRe = /^https?:\/\/(?:.+\.)?wikiloc\.com\/.*-(\d+)/u;
+ mapDataRe = /mapData=(.*);/u;
+
+ getTrackId() {
+ const m = this.urlRe.exec(this.origUrl);
+ return m[1];
+ }
+
+ isOurUrl() {
+ return this.urlRe.test(this.origUrl);
+ }
+
+ requestOptions() {
+ return [{
+ url: urlViaCorsProxy(this.origUrl),
+ options: {
+ isResponseSuccess: (xhr) => xhr.status === 200 || xhr.status === 404
+ }
+ }];
+ }
+
+ parseResponse(responses) {
+ const trackId = this.getTrackId();
+ const name = `Wikiloc track ${trackId}`;
+ const response = responses[0];
+ const m = this.mapDataRe.exec(response.responseText);
+ if (response.status === 404) {
+ return [{error: 'Wikiloc trail does not exist'}];
+ }
+
+ try {
+ const data = JSON.parse(m[1]);
+
+ let points = [];
+ let tracks = [];
+
+ for (let i = 0; i < data.mapData.length; i++) {
+ const mapData = data.mapData[i];
+ const geom = twkb.toGeoJSON(new Uint8Array(stringToArrayBuffer(atob(mapData.geom))));
+ if (mapData.waypoint) {
+ points.push({
+ name: mapData.nom,
+ lat: geom.features[0].geometry.coordinates[0][1],
+ lng: geom.features[0].geometry.coordinates[0][0]
+ });
+ } else if (mapData.spaId.toString() === trackId) {
+ tracks.push(geom.features[0].geometry.coordinates.map((obj) => ({lat: obj[1], lng: obj[0]})));
+ }
+ }
+
+ return [{
+ name: data.mapData?.[0]?.nom ?? name,
+ points,
+ tracks
+ }];
+ } catch (e) {
+ return [{name: name, error: 'UNSUPPORTED'}];
+ }
+ }
+}
+
+export default Wikiloc;
diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js
@@ -130,7 +130,7 @@ L.Control.TrackList = L.Control.extend({
<div class="leaflet-control-content">
<div class="header">
<div class="hint"
- title="gpx kml Ozi zip YandexMaps Strava GPSLib Etomesto Movescount GarminConnect SportsTracker OSM Tracedetrail OpenStreetMap.ru">
+ title="gpx kml Ozi zip YandexMaps Strava GPSLib Etomesto Movescount GarminConnect SportsTracker OSM Tracedetrail OpenStreetMap.ru Wikiloc">
gpx kml Ozi zip YandexMaps Strava
<span class="formats-hint-more">…</span>
</div>
diff --git a/yarn.lock b/yarn.lock
@@ -9937,6 +9937,11 @@ tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+twkb@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/twkb/-/twkb-0.2.2.tgz#8c9f0c51d35f207bcd2706e40e771083fd786f19"
+ integrity sha512-hDHDEZ0xVGXD/VHuWFF2OzkVqwLW6u8xR2vlMItAKzk2R/nntpEVjchOG8gxH8o+buvFazn35KGAUavz8jTR0w==
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"