Клуб API Карт

Манипуляции с ломаной, не описанные в API

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

Здраствуйте!

Прошу помочь по некоторым вопросам:

1. Как можно добавить точку на ломаную, при условии что есть только расстояние на которое она отстоит от начальной точки?

Есть некая ломаная, общая длина в км просчитана, а так же длина от начальной точки до каждой вершины. Пользователь вводит отрезок в км, к примеру в виде 15-74, т.е. нужно определить две точки 15-й и 74-й километр от начальной точки ломаной.

На данный момент я могу найти отрезок на котором должна быть вершина, но как можно выставить точку на этом отрезке зная только расстояние?

 

2. Можно ли выделить отрезок ломаной другим цветом?

3. Где можно посмотреть как создавать такие формы как в "конструкторе схем проезда", которая отображается при завершении построения маршрута?

 

Буду признателен за вашу помощь и советы.

2 комментария
1. Задача непростая т.к. широта не линейна. Для небольших расстояний могу предложить такой расчет, но погрешность будет.
   И чем больше расстояние тем больше погрешность.
   Расстояние между 2мя точками (в метрах) можно расчитать с помощью функции YMaps.GeoPoint.distance, либо map.coordSystem.rulerDistance (http://api.yandex.ru/maps/jsapi/doc/ref/reference/icoordsystem.xml#rulerDistance).
   Раз найти отрезок вы смогли, то вам остается отложить по нему остаток расстояния. Код примерно такой:

var point1 = new YMaps.GeoPoint(90, 65),
            point2 = new YMaps.GeoPoint(120, 80),
        // находим дистанцию между 2мя точками в километрах
            dist = point1.distance(point2)/1000,
        // нужно отложить 1000км. расчитываем коэффициент масштабирования
            coef = 1000/dist,
        // переводим точки в пиксели
            pixels1 = myMap.converter.coordinatesToLocalPixels(point1),
            pixels2 = myMap.converter.coordinatesToLocalPixels(point2),
        // находим пиксельный вектор из точки 1 в точку 2
            vector = pixels1.diff(pixels2);

        // масштабируем вектор
        vector.scale(coef),
        // откладываем вектор от
        pixels1.moveBy(vector);

        var point = myMap.converter.localPixelsToCoordinates(pixels1);

        myMap.addOverlay(new YMaps.Placemark(point));

на этом примере погрешность большая, т.к. расстояние между точками 1800км.
  
2. Нет. Как вариант наложить поверх отрезка другую линию, либо разбить линию на 3 части: до отрезка, сам отрезок и после отрезка.
3. http://api.yandex.ru/maps/jsapi/examples/ - из совокупности примеров по графике и балуну можно понять как это делается.
Sergey Konstantinov
28 января 2016, 07:17
Обратите внимание, что существует два варианта расчета длины ломаной: кратчайшее расстояние и расстояние "по прямой" (локсодроме). Дело в том, что в проекции Меркатора прямая линия не является кратчайшим путем между двумя точками, что на больших масштабах хорошо заметно. На расстояниях в сотни километров поправки уже довольно существенны.

Соответственно, методика расчета положения точки зависит от того, как Вы считаете длину линии. Если "по нарисованному" (в АПИ для этого существует метод rulerDistance), то предложенный выше вариант точен. Если "по кратчайшему", то нужно пользоваться формулами сферической тригонометрии.