nakarte

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

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;