samutin
@samutin
Начинающий WEB-программист

Как узнать, координаты какой точки на мультимаршруте изменились?

Как узнать, какие изменения произошли на маршруте при его редактировании?
Нашёл событие при изменении маршрута, но не могу найти какие именно изменения (с какими точками) произошли.
Как мне найти эти изменения?
Пока реализовал это так:

class Ymap {
    constructor(mapId) {
        this.points = undefined;
        this.map = undefined;
        ymaps.ready(() => {
            this.map = new ymaps.Map(mapId, { center: [58, 40], zoom: 7, controls: []});
        });
        this.AddMultiRoute([]);
    }

     AddMultiRoute(geoPoints) {
        ymaps.ready(() => {
            this.multiRoute = new ymaps.multiRouter.MultiRoute({
                referencePoints: geoPoints
            }, {
                // Тип промежуточных точек, которые могут быть добавлены при редактировании.
                editorMidPointsType: "via",
                // В режиме добавления новых путевых точек запрещаем ставить точки поверх объектов карты.
                editorDrawOver: false
            });
            this.map.geoObjects.add(this.multiRoute);
        });
    }

    MultiRouteUpdate(func) {
        ymaps.ready(() => {
            this.multiRoute.events.add('update',
                function (e) {
                    Func(e.get('target').model.getReferencePoints(), this.points);
                    this.points = e.get('target').model.getReferencePoints();
                });
        });
    }
}

Где Func функция сравнения массивов и поиска разницы, есть ли другой путь?

Одновременно может происходить одно из трёх действий:

1. удаляется одна точка
2. добавляется одна точка
3. изменяется одна точка

Необходимо найти эту точку и узнать что именно с ней случилось.
  • Вопрос задан
  • 261 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Яндекс.Карты
this.points = e.get('target').model.getReferencePoints();

А думали ли вы о том, что при редактировании маршрута массив, которым оперирует карта, может оставаться одним и тем же? - просто элементы добавляются, удаляются, изменяются. Если так (я вот опытным путём установил, что это так для редактирования и удаления точек), тогда в момент сравнения в this.points у вас будет находится текущая версия маршрута, а вовсе не предыдущая. И никаких изменений обнаружить не получится - вы будете сравнивать массив с ним самим. Делайте копию:

this.points = e.get('target').model.getReferencePoints().slice();

Что касается самой функции сравнения, как-то сложно у вас всё выглядит - четыре цикла, зачем? Можно же проще - искать в старом массиве точку, которой нет в новом, искать в новом массиве точку, которой нет в старом. Есть обе точки - значит было выполнено изменение, есть только старая - удаление, есть только новая - добавление. Я бы переписал вашу функцию как-то так, например:

function comparison(newPoints, oldPoints) {
  const
    oldPoint = oldPoints.find(n => !newPoints.includes(n)),
    newPoint = newPoints.find(n => !oldPoints.includes(n));

  if (oldPoint && newPoint) {
    console.log('update', oldPoint, 'to', newPoint);
  } else if (oldPoint) {
    console.log('delete', oldPoint);
  } else if (newPoint) {
    console.log('create', newPoint);
  }
}

UPD. https://codepen.io/anon/pen/EzqVEN?editors=1010
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы