nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

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:
Meslint_rules/legacy_files_list.js | 1+
Mpackage.json | 1+
Msrc/lib/leaflet.control.track-list/lib/services/index.js | 2++
Asrc/lib/leaflet.control.track-list/lib/services/wikiloc.js | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/lib/leaflet.control.track-list/track-list.js | 2+-
Myarn.lock | 5+++++
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">&hellip;</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"