Клуб API Карт

Определение километра на маршруте

SubaroMows
22 июня 2016, 21:06

Добрый день, 

Есть маршрут Москва - Нижний Новгород. Маршрут протяжоностью 490 км.

Стоит задача отображать ДТП на этой трассе. Но координат ДТП нет, есть описание инспектора о том, что ДТП произошло на 56 км 800 м трассы.

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

Решение:

ymaps.route(['Москва', 'Нижний Новгород']).then(
                function (route) {
                    myMap.geoObjects.add(route);

                    var way = route.getPaths().get(0);
                    var segments = way.getSegments();
                    var targetDistance = 56800;
                    var currentDistance = 0;
                    var endPoint;
                    for (var j = 0; j < segments.length; j++) {
                        currentDistance += segments[j].getLength();
                        if(currentDistance > targetDistance) {
                            currentDistance -= segments[j].getLength();
                            var coordinates = segments[j].getCoordinates();
                            for(var i = 0; i < coordinates.length - 1; i++) {
                                var currentCoord = coordinates[i];
                                var nextCoord = coordinates[i + 1];
                                currentDistance += ymaps.coordSystem.geo.getDistance(currentCoord, nextCoord);
                                if(currentDistance >= targetDistance) {

                                    var direction = [currentCoord[0] - nextCoord[0], currentCoord[1] - nextCoord[1]];
                                    endPoint = ymaps.coordSystem.geo.solveDirectProblem(currentCoord, direction, currentDistance - targetDistance).endPoint;

                                    var myPlacemark = new ymaps.Placemark(endPoint, { hintContent: 'ДТП'});
                                    myMap.geoObjects.add(myPlacemark);
                                    break;
                                }
                            }
                            if(endPoint) {
                                break;
                            }
                        }
                    }
                },
                function (error) {
                    alert('Возникла ошибка: ' + error.message);
                }
        );

4 комментария
Подписаться на комментарии к посту
https://yandex.ru/blog/mapsapi/poisk-tochki-na-marshrute-po-proydennomu-rasstoyaniyu
dimik,

Благодарю за ссылку,
Сегмент я нашёл, получил массив координат 
var points = segments[j].getCoordinates().


Каким образом мне теперь найти ближайшую? Просто перебором и нахождением расстоянием между соседними координатами? (Но тогда дорога между этими точками должна быть прямой, чтобы не было погрешностей)
SubaroMows,
Для всех сегментов кроме последнего нужно брать длину из данных сегмента, считать только для последнего. Там все отрезки между точками практически прямые. Погрешность небольшая
SubaroMows,
не будет работать как Дима советует. Просто потому что тот километраж, что вы там насчитаете, и реальные отметки на дороге могут отличаться на километры. Методы расчета разные.
Правильным решением будет КАК-ТО (магически) расставить по дорогам вестовые столбы, и опираться на них. Например проехать на машине и в некоторых местах точно совместить реальный знак и его геокоординаты.