nakarte

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

commit 929451ea531f01fbe2e20195a5e52e60b88c888f
parent bff8e3077b0020074ed2c0787a5afd42c2b6e56d
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Tue, 17 May 2022 21:20:09 +0200

tracks: add loading data from <gx:Track> elements in kml files

Diffstat:
Msrc/lib/leaflet.control.track-list/lib/parsers/kml.js | 27+++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/lib/leaflet.control.track-list/lib/parsers/kml.js b/src/lib/leaflet.control.track-list/lib/parsers/kml.js @@ -6,7 +6,7 @@ import jsInflate from './jsInflate'; function parseKml(txt, name) { var error; - function getSegmentPoints(coordinates_element) { + function getLinestringPoints(coordinates_element) { // convert multiline text value of tag to single line var coordinates_string = xmlGetNodeText(coordinates_element); var points_strings = coordinates_string.split(/\s+/u); @@ -26,13 +26,13 @@ function parseKml(txt, name) { return points; } - function getTrackSegments(xml) { + function getLinestrings(xml) { var segments_elements = xml.getElementsByTagName('LineString'); var segments = []; for (var i = 0; i < segments_elements.length; i++) { var coordinates_element = segments_elements[i].getElementsByTagName('coordinates'); if (coordinates_element.length) { - var segment_points = getSegmentPoints(coordinates_element[0]); + var segment_points = getLinestringPoints(coordinates_element[0]); if (segment_points.length) { segments.push(segment_points); } @@ -86,6 +86,25 @@ function parseKml(txt, name) { return points; } + function getTracks(dom) { + const segments = []; + for (const track of dom.getElementsByTagName('gx_Track')) { + const points = []; + for (const coord of track.getElementsByTagName('gx_coord')) { + const [lng, lat] = (xmlGetNodeText(coord) ?? '').split(/\s+/u).map(Number); + if (isNaN(lat) || isNaN(lng)) { + error = 'CORRUPT'; + break; + } + points.push({lat, lng}); + } + if (points.length > 0) { + segments.push(points); + } + } + return segments; + } + txt = stripBom(txt); txt = txt.replace(/<([^ >]+):([^ >]+)/ug, '<$1_$2'); let dom; @@ -101,7 +120,7 @@ function parseKml(txt, name) { return null; } - return [{name: name, tracks: getTrackSegments(dom), points: getPoints(dom), error: error}]; + return [{name: name, tracks: [...getLinestrings(dom), ...getTracks(dom)], points: getPoints(dom), error: error}]; } function parseKmz(txt, name) {