Клуб API Карт

Маршрутизатор живет своей жизнью, API 2.0

Пост в архиве.
wir2al
3 июля 2012, 22:54

Привет.

Не могу справиться с проблемой: маршрут через одни и теже координаты строится почти всегда по-разному.

Т.е. я перезагружаю страницу и в половине случаев маршрут по тем же координатам построится совершенно по-другому. К тому же, route.getLength() и route.getJamsTime() при перезагрузки страницы очень часто выдают разные значения, даже если маршрут не поменялся.

Иначе говоря следующие ситуации:

1) Например строю маршрут через 3 адреса: Измайловский бульвар, 15; метро Бауманская и Осенний бульвар, 4. Время показывает то 55 минут, то 1 час 8 минут, то ещё что-нибудь. Расстояние тоже гуляет, при чем не зависимо от того, как маршрутизатор проложит маршрут в этот раз (по каким улицам и шоссе ехать). При всем при этом маршрут прокладывается в разной очередности, то конечной остановкой становится Осенний бульвар, то метро Бауманская. Если использовать конструкцию вида {type: 'viaPoint', point: 'Москва, метро Бауманская'}, то маршрут попросту не прокладывается. С wayPoint все впорядке.

Пробовал прокладывать маршрут и с avoidTrafficJams и без.

Весь мой код: avangardtaxi.ru/js/order.js, сайт http://avangardtaxi.ru/test.php

Это API 2.0 такой сырой или я где-то напортачил?

17 комментариев

1. Если вы строите маршрут через пробки, то он может гулять, т.к. информация по пробкам меняется постоянно. Если хотите чтобы маршрут был постоянным, уберите параметр avoidTrafficJams.

2. Конструкцию вида {type: 'viaPoint', point: 'Москва, метро Бауманская'} можно использовать только для точек посередине маршрута (промежуточных), например

['метро Белорусская', {type: 'viaPoint', point: 'Москва, метро Бауманская'}, 'метро Проспект Мира']

3. Зачем вы дополнительно геокодируете точки, если точки геокодируются уже при построении маршрута; вытащить нужное свойство можно просмотрев хэш route.getWayPoints().get(0).properties.getAll()

1. Я вроде бы и так и так тестил. Сейчас ещё раз попробую.

2. Я в курсе, именно так и делал: coords[0], {type: 'viaPoint', point: coords[2]}, coords[1]

Маршрут тупо не стоится. Если поменять на wayPoint, то все ок.

3. Спасибо, не знал, сейчас уберу геокодер.

Стили для графики лучше указывайте путям, тогда останется подсветка выделенного сегмента.
route.getPaths().options.set({
    color: '0000ff'
});

Не уверен, что понял, о чем вы, но, спасибо, поменял)

Не подскажите поподробнее, как выдрать название местности?

var points = route.getWayPoints();
var fromname = points.get(0).properties.getAll('name');

Так не работает, а по-другому я не умею :D

Лучше всего вам либо подставлять в иконку тоже, то же что и в балуне

var props = points.get(0).properties;

props.set('iconContent', props.get('balloonContentBody'))

Либо вот это значение

props.set('iconContent', props.get('GeocoderMetaData').AddressDetails.Country.AddressLine)

"Москва, Арбатско-Покровская линия, метро Бауманская" слишком громоздко на карте выглядит. А уж "Россия, Москва, Арбатско-Покровская линия, метро Бауманская" тем более. Других способов нет?

Хм, а можно же просто это все безобразие обрезать, правильно? Сейчас погуглю, как это в js делается.

 

 

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

Функцию набросал:

function pruning(string) {
                if(string.indexOf('Москва, ') != -1) {
                    string = string.replace('Москва, ', '');
                }
                if(string.indexOf('Московская область, ') != -1) {
                    string = string.replace('Московская область, ', '');
                }
                if(string.indexOf('линия, ') != -1) {
                    string = string.split('линия, ')[1];
                }
                return string;
            }

даже так:

 

function pruning(string) {
                if(string.indexOf('Москва, ') != -1) {
                    string = string.replace('Москва, ', '');
                }
                if(string.indexOf('Московская область, ') != -1) {
                    string = string.replace('Московская область, ', '');
                }
                if(string.indexOf('линия, ') != -1) {
                    string = string.split('линия, ')[1];
                }
                if(string.indexOf('район, ') != -1) {
                    string = string.split('район, ')[1];
                }
                return string;
            }

Не подскажете, из-за чего может быть проблема?

С {type: 'viaPoint', point: coords[2]} маршрут не стоится. Если поменять на wayPoint, то все ок.

Можете показать конкретный набор точек, на котором не строится маршрут

Да со всеми.

Вот так:

['Измайловский бульвар, 15', {type: 'wayPoint', point: 'метро Бауманская'}, 'Осенний бульвар, 4']

строится, а вот так:

['Измайловский бульвар, 15', {type: 'viaPoint', point: 'метро Бауманская'}, 'Осенний бульвар, 4']

нет

Странно, только что проверил, у меня строится в обоих случаях

И, пока вы не лягли спать, очередной нубский вопрос: у меня есть карта, инпуты с адресами и кнопка «обновить маршрут». Поменяв адрес в инпуте я нажимаю кнопку, чтобы на карте отобразился новый маршрут с новыми адресами. Сейчас, при нажатии на кнопку прошлая карта стирается полностью и тупо строится новая ($('#map').empty();). Это правильно? Может, проще и правильнее каким-то образом удалять и перестраивать маршрут, а не всю карту? Если да, то как это осуществить?

Можете удалять маршрут через map.geoObjects.remove(route)

Вот сейчас у меня на кнопке Обновить маршрут висит функция map(), внутри которой вся вся карта. А как мне повесить на эту кнопку функцию, удаляющуу маршрут и прокладывающуу заново?