import _googlePolyline from 'google-polyline'; import distance from 'gps-distance'; const {decode} = _googlePolyline; // todo: what is p.delta? // todo: what is p.type? // todo: what is p.crdEncS? // todo: what is p.crdEncF? const parsePolyline = (ctx, p) => { // p = raw polyline const points = decode(p.crdEncYX); if (points.length === 0) { return null; } const res = points.map(([lat, lon]) => ({ type: 'Feature', properties: {}, geometry: { type: 'Point', coordinates: [lon, lat], }, })); if (Array.isArray(p.ppLocRefL)) { for (let ref of p.ppLocRefL) { const p = res[ref.ppIdx]; if (p && ref.location) { p.properties = ref.location; } } // Often there is one more point right next to each point at a station. // We filter them here if they are < 5m from each other. for (let i = 1; i < res.length; i++) { const p1 = res[i - 1].geometry.coordinates; const p2 = res[i].geometry.coordinates; const d = distance(p1[1], p1[0], p2[1], p2[0]); if (d >= 0.005) { continue; } const l1 = Object.keys(res[i - 1].properties).length; const l2 = Object.keys(res[i].properties).length; if (l1 === 0 && l2 > 0) { res.splice(i - 1, 1); } else if (l2 === 0 && l1 > 0) { res.splice(i, 1); } } } return { type: 'FeatureCollection', features: res, }; }; export { parsePolyline, };