Есть два поля - откуда, куда. При нажатии на кнопку "карта" геокодируется адрес и передаётся в Яндекс.Картах. Но всё не так. Данные передаются только после второго клика.
Да и вообще не могу разобраться с этими картами, всё как-то сумбурно >_<
"Первую" часть кода взял из песочницы API Яндекс.Карт.
UPD: Вводим "Мск" и "Спб", нажимаем - пустая карта. Затем вводим "Краснодар" - "Великий Новгород", нажимаем - показывает маршрут Мск-Спб. И так далее, т.е. показывает предыдущие координаты.
$(document).ready(function () {
var coordsone,
coordstwo;
ymaps.modules.define('MultiRouteCustomView', [
'util.defineClass'
], function (provide, defineClass) {
// Класс простого текстового отображения модели мультимаршрута.
function CustomView (multiRouteModel) {
this.multiRouteModel = multiRouteModel;
// Объявляем начальное состояние.
this.state = "init";
this.stateChangeEvent = null;
// Элемент, в который будет выводиться текст.
this.outputElement = $('<div></div>').appendTo('#viewContainer');
this.rebuildOutput();
// Подписываемся на события модели, чтобы
// обновлять текстовое описание мультимаршрута.
multiRouteModel.events
.add(["requestsuccess", "requestfail", "requestsend"], this.onModelStateChange, this);
}
// Таблица соответствия идентификатора состояния имени его обработчика.
CustomView.stateProcessors = {
init: "processInit",
requestsend: "processRequestSend",
requestsuccess: "processSuccessRequest",
requestfail: "processFailRequest"
};
// Таблица соответствия типа маршрута имени его обработчика.
CustomView.routeProcessors = {
"driving": "processDrivingRoute",
"masstransit": "processMasstransitRoute"
};
defineClass(CustomView, {
// Обработчик событий модели.
onModelStateChange: function (e) {
// Запоминаем состояние модели и перестраиваем текстовое описание.
this.state = e.get("type");
this.stateChangeEvent = e;
this.rebuildOutput();
},
rebuildOutput: function () {
// Берем из таблицы обработчик для текущего состояния и исполняем его.
var processorName = CustomView.stateProcessors[this.state];
this.outputElement.html(
this[processorName](this.multiRouteModel, this.stateChangeEvent)
);
},
processInit: function () {
return "Инициализация ...";
},
processRequestSend: function () {
return "Запрос данных ...";
},
processSuccessRequest: function (multiRouteModel, e) {
var routes = multiRouteModel.getRoutes(),
result = ["Данные успешно получены."];
if (routes.length) {
result.push("Всего маршрутов: " + routes.length + ".");
for (var i = 0, l = routes.length; i < l; i++) {
result.push(this.processRoute(i, routes[i]));
}
} else {
result.push("Нет маршрутов.");
}
return result.join("<br/>");
},
processFailRequest: function (multiRouteModel, e) {
return e.get("error").message;
},
processRoute: function (index, route) {
// Берем из таблицы обработчик для данного типа маршрута и применяем его.
var processorName = CustomView.routeProcessors[route.properties.get("type")];
return (index + 1) + ". " + this[processorName](route);
},
processDrivingRoute: function (route) {
var result = ["Автомобильный маршрут."];
result.push(this.createCommonRouteOutput(route));
return result.join("<br/>");
},
processMasstransitRoute: function (route) {
var result = ["Маршрут на общественном транспорте."];
result.push(this.createCommonRouteOutput(route));
result.push("Описание маршута: <ul>" + this.createMasstransitRouteOutput(route) + "</ul>");
return result.join("<br/>");
},
// Метод формирующий общую часть описания для обоих типов маршрутов.
createCommonRouteOutput: function (route) {
return "Протяженность маршрута: " + route.properties.get("distance").text + "<br/>" +
"Время в пути: " + route.properties.get("duration").text;
},
// Метод строящий список текстовых описаний для
// всех сегментов маршрута на общественном транспорте.
createMasstransitRouteOutput: function (route) {
var result = [];
for (var i = 0, l = route.getPaths().length; i < l; i++) {
var path = route.getPaths()[i];
for (var j = 0, k = path.getSegments().length; j < k; j++) {
result.push("<li>" + path.getSegments()[j].properties.get("text") + "</li>");
}
}
return result.join("");
},
destroy: function () {
this.outputElement.remove();
this.multiRouteModel.events
.remove(["requestsuccess", "requestfail", "requestsend"], this.onModelStateChange, this);
}
});
provide(CustomView);
});
function init () {
// Создаем модель мультимаршрута.
var multiRouteModel = new ymaps.multiRouter.MultiRouteModel([
coordsone,
coordstwo
], {
// Путевые точки можно перетаскивать.
// Маршрут при этом будет перестраиваться.
wayPointDraggable: true,
boundsAutoApply: true
});
// Создаем кнопку, переключающую модель в режим
// маршрутизации на общественном транспорте.
var masstransitButton = new ymaps.control.Button({
data: { content: "На общественном транспорте"},
options: { selectOnClick: true }
});
// Объявляем обработчики для кнопки.
masstransitButton.events.add('select', function () {
multiRouteModel.setParams({ routingMode: 'masstransit' }, true);
});
masstransitButton.events.add('deselect', function () {
multiRouteModel.setParams({ routingMode: 'auto' }, true);
});
ymaps.modules.require([
'MultiRouteCustomView'
], function (MultiRouteCustomView) {
// Создаем экземпляр текстового отображения модели мультимаршрута.
// см. файл custom_view.js
new MultiRouteCustomView(multiRouteModel);
});
// Создаем карту с добавленной на нее кнопкой.
var myMap = new ymaps.Map('map', {
center: [55.750625, 37.626],
zoom: 7,
controls: [masstransitButton]
}, {
buttonMaxWidth: 300
});
// Создаем на основе существующей модели мультимаршрут.
var multiRoute = new ymaps.multiRouter.MultiRoute(multiRouteModel, {
// Путевые точки можно перетаскивать.
// Маршрут при этом будет перестраиваться.
wayPointDraggable: true,
boundsAutoApply: true
});
// Добавляем мультимаршрут на карту.
myMap.geoObjects.add(multiRoute);
}
/* _______________________________________________________________________________________________________________ */
// Вот здесь обрабатываем клик (и начинается "вторая" часть кода)
$('#show_fmap').on('click', function (e) {
e.preventDefault();
var fromval = $('#dist-from').val(),
fromcoord = ymaps.geocode(fromval),
whereval = $('#dist-where').val(),
wherecoord = ymaps.geocode(whereval);
fromcoord.then(
function (res) {
coordsone = res.geoObjects.get(0).geometry.getCoordinates();
});
wherecoord.then(
function (res) {
coordstwo = res.geoObjects.get(0).geometry.getCoordinates();
});
ymaps.ready(init);
console.log(coordsone + ' : ' + coordstwo);
});
});
Спасибо заранее ^_^