В примере показано, как сравнить между собой два маршрута: найти их общие участки и отклонения.
Первый маршрут будем считать эталонным, второй - пройденным по факту. Маршруты загружаются в формате KML или GPX.
Для каждой точки пройденного маршрута вычисляется расстояние до ближайшей точки эталонного маршрута(берутся точки, с помощью которых описан маршрут). Расстояние вычисляется с помощью getClosest().
Если полученное расстояние больше заданной точности (точность задается в переменной diff), то считаем, что маршруты в этой точке не совпадают. В балуне будем выводить протяженность отклонения от эталонного маршрута.
Отклонения от эталонного маршрута отображаются на карте красным цветом.
Для загрузки данных используется функция geoXml.load.
\n","tracks_compare.js":"ymaps.ready(init);\n\nfunction init() {\n var myMap = new ymaps.Map('map', {\n center: [59.9567962610097, 30.264981955459618],\n zoom: 9\n });\n // Ссылка на запланированный путь в формате kml/gpx.\n var originalTrackUrl = \"original.gpx\",\n // Ссылка на путь в формате kml/gpx, который будем сравнивать с запланированным путем.\n comparableTrackUrl = \"comparable.gpx\",\n // Допустимая разница в метрах.\n diff = 1;\n // Сравним два пути.\n compare(originalTrackUrl, comparableTrackUrl);\n\n // Метод, который добавляет два пути на карту и сравнивает их.\n function compare(originalTrackUrl, comparableTrackUrl) {\n // Создадим коллекцию участков пути, которые не совпадают с запланированным путем.\n var collection = new ymaps.GeoObjectCollection({}, {\n strokeColor: '#FF0000',\n strokeWidth: 3\n });\n // Дожидаемся загрузки файлов.\n ymaps.vow.all([ymaps.geoXml.load(originalTrackUrl), ymaps.geoXml.load(comparableTrackUrl)]).then(function (res) {\n // Получаем запланированный путь.\n var originalTrack = res[0].geoObjects.get(0),\n // Получаем сравниваемый путь.\n comparableTrack = res[1].geoObjects.get(0);\n // Для kml есть ещё один уровень вложенности.\n if (!originalTrack.geometry) {\n originalTrack = originalTrack.get(0);\n comparableTrack = comparableTrack.get(0);\n }\n // Получаем геометрию запланированного пути.\n var originalGeometry = originalTrack.geometry,\n // Получаем геометрию для сравниваемого пути.\n comparableGeometry = comparableTrack.geometry,\n // Счётчик количества точек, которые не совпали с запланированным маршрутом.\n diffPoints = 0;\n // Изменим толщину и цвет путей, после чего добавим их на карту.\n originalTrack.options.set({strokeWidth: 3, strokeColor: '#4585E6'});\n comparableTrack.options.set({strokeWidth: 3, strokeColor: '#4585E6'});\n myMap.geoObjects.add(originalTrack).add(comparableTrack);\n // Выставим границы карты так, чтобы отобразились сравниваемые пути.\n myMap.setBounds(myMap.geoObjects.getBounds());\n\n for (var i = 0, isNotEqual, isPreviousNotEqual = false; i < comparableGeometry.getLength(); i++) {\n // Проверим, что от каждой точки сравниваемого пути расстояние до запланированного пути меньше допустимого.\n isNotEqual = originalGeometry.getClosest(comparableGeometry.get(i)).distance > diff;\n\n if (isNotEqual) {\n // Инкрементируем счетчик количества точек, которые не совпали с запланированным маршрутом.\n diffPoints++;\n // Сохраняем состояние для следующей итерации.\n isPreviousNotEqual = true;\n // Пропускаем одну итерацию в случае несовпадения начальных точек.\n if (i === 0) continue;\n // Добавим в коллекцию участок пути от предыдущей точки до текущей точки, которая не лежит\n // на запланированном маршруте.\n collection.add(new ymaps.Polyline([\n comparableGeometry.get(i - 1),\n comparableGeometry.get(i)\n ]));\n } else if (isPreviousNotEqual) {\n // Добавим в коллекцию участок пути от предыдущей точки, которая не лежит на запланированном маршруте,\n // до текущей точки.\n collection.add(new ymaps.Polyline([\n comparableGeometry.get(i - 1),\n comparableGeometry.get(i)\n ]));\n // Сохраняем состояние для следующей итерации.\n isPreviousNotEqual = false;\n }\n }\n // Добавим коллекцию на карту.\n myMap.geoObjects.add(collection);\n // Получим протяженность отличающихся участков.\n var diffDistance = 0;\n collection.each(function (obj) {\n diffDistance += obj.geometry.getDistance();\n });\n diffDistance = Math.round(diffDistance);\n // Получим протяженность сравниваемого пути.\n var comparableDistance = comparableGeometry.getDistance(),\n // Получим сколько процентов пройдено вне запланированного пути.\n diffDistanceRatio = Math.abs(100 * diffDistance / comparableDistance).toFixed(1),\n // Сформируем текст для балуна.\n content = \"Красные участки - отклонения от запланированного пути. Вне запланированного пути пройдено %k м (%m %).\";\n content = content.replace('%k', diffDistance)\n .replace('%m', diffDistanceRatio);\n // Добавим новый текст для балунов всех путей.\n originalTrack.properties.set('balloonContent', content);\n comparableTrack.properties.set('balloonContent', content);\n collection.each(function (obj) {\n obj.properties.set('balloonContent', content);\n });\n // Откроем балун на запланированном пути.\n originalTrack.balloon.open();\n }, function (error) {\n console.log('Ошибка: ' + error);\n })\n }\n}\n"},"resources":["comparable.gpx","original.gpx"],"directory":"https://sandbox.api.maps.yandex.net/examples/ru/2.1/tracks_compare/"}
В примере показано, как сравнить между собой два маршрута: найти их общие участки и отклонения.
Первый маршрут будем считать эталонным, второй - пройденным по факту. Маршруты загружаются в формате KML или GPX.
Для каждой точки пройденного маршрута вычисляется расстояние до ближайшей точки эталонного маршрута(берутся точки, с помощью которых описан маршрут). Расстояние вычисляется с помощью getClosest().
Если полученное расстояние больше заданной точности (точность задается в переменной diff), то считаем, что маршруты в этой точке не совпадают. В балуне будем выводить протяженность отклонения от эталонного маршрута.
Отклонения от эталонного маршрута отображаются на карте красным цветом.
Для загрузки данных используется функция geoXml.load.