v8.x: Google maps, поиск оптимального маршрута - 1С-ИнтеГрация

v8.x: Google maps, поиск оптимального маршрута



В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: 
* Географические координаты объектов, которые хранятся в базе;
 
* Координаты начальной и конечной точек маршрута.
 
В процессе решения задачи был использован
 пример API Google maps, так же само описание использование массива точек для построения оптимального маршрута. 

Для построения оптимального маршрута, необходимо сформировать HTML-код, который будет показан в элементе управления вида «Поле HTML документа».
 

Во время формирования HTML-кода в него пишутся координаты объектов, которые надо посетить. В нашем случае это строковая переменная МассивОбъектовПосещения, в которой храниться массив объектов посещения. Каждый объект посещения это элемент, который заполняется по примеру: ['Объект посещения', '49.438022, 32.069693'] (первый элемент – описание объекта, второй – географические координаты объекта). Переменная МассивОбъектовПосещения в коде инициализируется следующим образом:
 
Код 1C v 8.х

 Сч = 0; МассивОбъектовПосещения = "";

Для Каждого ТекСтрока Из ТаблицаОбъектов Цикл

    МассивОбъектовПосещения = МассивОбъектовПосещения + "

    |   ['" + ?(ОтображатьПодчиненных, ТекСтрока.Ответственный, "") + ТекСтрока.Наименование + "', '"

    + СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ", "+ СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") +"'],";

    Сч = Сч + 1;

КонецЦикла;

МассивОбъектовПосещения = Лев(МассивОбъектовПосещения, СтрДлина(МассивОбъектовПосещения)-1);  



Для построения оптимального маршрута используется вызов функции directionsService.route(), в которую необходимо передать параметры поиска. Параметры передаются следующие: 

* origin – точка, с которой будет начинаться маршрут 
* destination – точка, в которой будет заканчиваться маршрут 
* waypoints – массив точек, которые надо обойти 
* optimizeWaypoints – признак возможности оптимизации точек в массиве.
В нашем случае необходимо определить его в true, тогда для алгоритма будет не важен порядок обхода точек.
 
* travelMode – признак того, какой вид транспорта используется. Мы ищем маршрут для автомобиля, поэтому необходимо установить значение google.maps.TravelMode.DRIVING.
 

После вызова функции directionsService.route() необходимо проверить результат построения (status == google.maps.DirectionsStatus.OK). Затем в цикле обходим составляющие маршрута и выводим информацию про маршрут в правую панель. В коде, приведенном ниже, цикл обхода: for (var i = 0; i < route.legs.length; i++) {}. Инициализация строковой переменной СтраницаХТМЛ, которая отображается в элементе управления с видом «Поле HTML документа», происходит следующим образом:
 

Код 1C v 8.х

 СтраницаХТМЛ =

"var directionDisplay;

| var directionsService = new google.maps.DirectionsService();

| var map;

| var myarr = [

| " + МассивОбъектовПосещения + "

| ];

| function initialize() {

| directionsDisplay = new google.maps.DirectionsRenderer();

| var myOptions = {mapTypeId: google.maps.MapTypeId.ROADMAP}

| map = new google.maps.Map(document.getElementById(""map_canvas""), myOptions);

| directionsDisplay.setMap(map);

| calcRoute();

| }

| function calcRoute() {

| var waypts = [];

| for (var i = 0; i < myarr.length; i++) {

| waypts.push({

| location:myarr[i][1],

| stopover:true});

| }

| var request = {

| origin: '" + НачалоМаршрута + "',

| destination: '" + КонецМаршрута + "',

| waypoints: waypts,

| optimizeWaypoints: true,

| travelMode: google.maps.DirectionsTravelMode.DRIVING

| };

| directionsService.route(request, function(response, status) {

| if (status == google.maps.DirectionsStatus.OK) {

| directionsDisplay.setDirections(response);

| var route = response.routes[0];

| var summaryPanel = document.getElementById(""directions_panel"");

| summaryPanel.innerHTML = """";

| var summaryDistance = 0;

| // For each route, display summary information.

| for (var i = 0; i < route.legs.length; i++) {

| var routeSegment = i + 1;

| summaryPanel.innerHTML += ""Маршрут: "" + routeSegment;

| summaryPanel.innerHTML += route.legs[i].start_address + "" to "";

| summaryPanel.innerHTML += route.legs[i].end_address;

| summaryPanel.innerHTML += route.legs[i].distance.text;

| summaryDistance += parseFloat(route.legs[i].distance.value);

| }

| summaryPanel.innerHTML += ""Общая длинна маршрута: "";

| summaryPanel.innerHTML += summaryDistance;

| }

| });

| }

| initialize();  


Андрей Данилюк



Назад в раздел