Клуб API Карт

Метки вдоль маршрута.

Пост в архиве.

Есть задача: пользователь строит маршрут, а мы выводим определённые объекты вдоль этого маршрута. Код сильно упрощён, но:

1. Создаю редактор маршрута(как в примерах) и добавляю на карту:

 

    // Создание экземпляров модели и редактора.
    var routerModel = new YMaps.RouterEditor.RouterModel()
    var editor = new YMaps.RouterEditor.DragAndDropEditor(routerModel, {
        viaPointHintContent: 'Перетащите точку или удалите ёё двойным щелчком',
        cursorHintContent: 'Перетащите метку, чтобы создать промежуточную точку'
    });

    map.addControl(editor);
    editor.startDrawing();

 

2. Слушаю изменения маршрута и по задумке хочу перерисовывать точки

 

// При обновлении маршрута обновляем информацию о точках вдоль него
YMaps.Events.observe(routerModel, routerModel.Events.RouterResultChange, function (rr) {
               
    // Вспомогательный класс для обработки ответа маршрутизатора
    var helper = new YMaps.RouterEditor.RouterResultHelper(rr);

    //Пытаюсь получить ближайшую точку на маршруте к точке вне его               
    helper.getRoute(0).getClosestPoint(new YMaps.GeoPoint(-5, 10));//Вот при вызове этого получаю ошибку в firebug this._map is undefined
});



Есть ли у кого-то предположения о том, что не так? Куда копать? Спасибо.

 

Или пример того, как искать точки вдоль маршрута.

4 комментария

Таже проблемма возникает если обращаюсь к любому методу наследуемуму от YMaps.Polyline

Неужели нет никакаких догадок?

Спаибо

getClosestPoint не работает, потому что требует, чтобы полилайн, для которого она вызывается, был добавлен на карту. Кроме этого, для вашей задачи она не подходит, потому что ищет ближайшую вершину полилинии, а не точку, лежащую на ней, ближайшую к заданной. Вам нужно получить точки маршрута, например, через helper.getRoute(x).getPoints(). Найти на этой ломаной точку, расстояние от которой до вашей минимально, (т.е. проекцию вашей точки на ломанную; в общем случае результат будет отличатся от того, что возвращает getClosestPoint) и показать эту точку плейсмарком самому. 

 

getClosestPoint не работает, потому что требует, чтобы полилайн, для которого она вызывается, был добавлен на карту
Спасибо огромное. Неделю себе ложечкой мозг вынимал. По ночам не спал.:-)

 

Сам себе отвечу :)



Благодоря наводке Дмитрия Коваль получил функцию, которая возвращает рассотяние от точки до отрезка. Думаю, будет полезна.



//Расстояние(кротчайшее) от точки до отрезка
//x, y - наша точка вне отрезка
//x1, y1  x2, y2  - координаты концов отрезка
//
    function pDistance(x, y, x1, y1, x2, y2) {

        var A = x - x1;
        var B = y - y1;
        var C = x2 - x1;
        var D = y2 - y1;

        var dot = A * C + B * D;
        var len_sq = C * C + D * D;
        var param = dot / len_sq;

        var xx, yy;

        if (param < 0 || (x1 == x2 && y1 == y2)) {
            xx = x1;
            yy = y1;
        }
        else if (param > 1) {
            xx = x2;
            yy = y2;
        }
        else {
            xx = x1 + param * C;
            yy = y1 + param * D;
        }

        var dx = x - xx;
        var dy = y - yy;
        return Math.sqrt(dx * dx + dy * dy);
    }