wikiloc.js (2439B)
1 import BaseService from './baseService'; 2 import urlViaCorsProxy from '~/lib/CORSProxy'; 3 import {stringToArrayBuffer} from '~/lib/binary-strings'; 4 import twkb from 'twkb'; 5 6 class Wikiloc extends BaseService { 7 urlRe = /^https?:\/\/(?:.+\.)?wikiloc\.com\/.*-(\d+)/u; 8 mapDataRe = /mapData=(.*);/u; 9 10 getTrackId() { 11 const m = this.urlRe.exec(this.origUrl); 12 return m[1]; 13 } 14 15 isOurUrl() { 16 return this.urlRe.test(this.origUrl); 17 } 18 19 requestOptions() { 20 return [{ 21 url: urlViaCorsProxy(this.origUrl), 22 options: { 23 isResponseSuccess: (xhr) => xhr.status === 200 || xhr.status === 404 24 } 25 }]; 26 } 27 28 parseResponse(responses) { 29 const trackId = this.getTrackId(); 30 const name = `Wikiloc track ${trackId}`; 31 const response = responses[0]; 32 const m = this.mapDataRe.exec(response.responseText); 33 if (response.status === 404) { 34 return [{error: 'Wikiloc trail does not exist'}]; 35 } 36 37 try { 38 const data = JSON.parse(m[1]); 39 40 let points = []; 41 let tracks = []; 42 43 for (let i = 0; i < data.mapData.length; i++) { 44 const mapData = data.mapData[i]; 45 const geom = twkb.toGeoJSON(new Uint8Array(stringToArrayBuffer(atob(mapData.geom)))); 46 if (mapData.waypoint) { 47 points.push({ 48 name: mapData.nom, 49 lat: geom.features[0].geometry.coordinates[0][1], 50 lng: geom.features[0].geometry.coordinates[0][0] 51 }); 52 } else if (mapData.spaId.toString() === trackId) { 53 tracks.push(geom.features[0].geometry.coordinates.map((obj) => ({lat: obj[1], lng: obj[0]}))); 54 } 55 } 56 if (data.waypoints) { 57 for (const waypoint of data.waypoints) { 58 points.push({ 59 name: waypoint.name, 60 lat: waypoint.lat, 61 lng: waypoint.lon, 62 }); 63 } 64 } 65 66 return [{ 67 name: data.mapData?.[0]?.nom ?? name, 68 points, 69 tracks 70 }]; 71 } catch (e) { 72 return [{name: name, error: 'UNSUPPORTED'}]; 73 } 74 } 75 } 76 77 export default Wikiloc;