Клуб API Карт

Расчет маршрута за пределами границы

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

Добрый день.

Задача состоит в том, чтобы расчитать расстояние маршрута, который выходит за пределы какой-то границы (например МКАДа или города).

За пример я взял скрипт http://api.yandex.ru/maps/jsbox/route_inside_polygon но никак не получаетя получить расстояние за МКАДом, прошу помочь с этим.

Вот скрин того, что сейчас я сделал, нужно расчитать расстояние вне выделенной области.

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

Алгоритм у вас должен быть такой.

Вы берете все линии, которые у вас раскрашены в синий и зеленый (2 выборки, которые вне полигона и пересекаются с ним).

Перебираете точки этих линий и считаете расстояние между соседними точками. Расстояние между точками считается вот так

map.options.get('projection').getCoordSystem().getDistance(point1, point2);

Пытаюсь так сделать, но появляется ошибка: "Uncaught TypeError: Cannot read property '0' of undefined "

 

Код:

dist = myMap.options.get('projection').getCoordSystem().getDistance(coordinates[i - 1], coordinates[i]);

console.log(dist);

Видимо Вы передаете undefined в этот метод 

Приведите весь код

ymaps.ready(initMap);

 

function initMap() {

    var myMap = new ymaps.Map("map", {

            center:[50.599197, 36.598284],

            zoom: 14

        }),

        moscowPolygon;

    

myMap.controls.add("zoomControl");

 

function onPolygonLoad (json) {

 

   moscowPolygon = new ymaps.Polygon(json.coordinates);

   moscowPolygon.options.set('visible', true);

   myMap.geoObjects.add(moscowPolygon);

   

   ymaps.route([

   'Российская Федерация, Белгородская область, Белгород, Народный бульвар, 92',

   '$toaddr'

   ]).then(

       function (res) {

           // Объединим в выборку все сегменты маршрута.

           var pathsObjects = ymaps.geoQuery(res.getPaths()),

           edges = [];

               

           // Переберем все сегменты и разобьем их на отрезки.

           pathsObjects.each(function (path) {

               var coordinates = path.geometry.getCoordinates();

               //console.log('= '+path.getLength());

 

               for (var i = 1, l = coordinates.length; i < l; i++) {

                   edges.push({

                       type: 'LineString',

                       coordinates: [coordinates[i], coordinates[i - 1]]

                   });

               }

           });

           

           // Создадим новую выборку, содержащую:

           // - отрезки, описываюшие маршрут;

           // - начальную и конечную точки;

           // - промежуточные точки.

           var routeObjects = ymaps.geoQuery(edges)

                   .add(res.getWayPoints())

                   .add(res.getViaPoints())

                   .setOptions('strokeWidth', 3)

                   .addToMap(myMap),

               objectsInMoscow = routeObjects.searchInside(moscowPolygon),

               boundaryObjects = routeObjects.searchIntersect(moscowPolygon);

           boundaryObjects.setOptions({

               strokeColor: '#06ff00',

               preset: 'twirl#greenIcon'

           });

           objectsInMoscow.setOptions({

               strokeColor: '#ff0005',

               preset: 'twirl#redIcon'

           });

           routeObjects.remove(objectsInMoscow).remove(boundaryObjects).setOptions({

               strokeColor: '#0010ff',

               preset: 'twirl#blueIcon'

           }).addToMap(myMap);


var edges_out = [];

var dist = 0;

 

routeObjects.remove(objectsInMoscow).remove(boundaryObjects).each(function (path) {

var coordinates = path.geometry.getCoordinates();

 

for (var i = 1, l = coordinates.length; i < l; i++) {

   edges_out.push([coordinates[i], coordinates[i - 1]]);

}

 

dist = myMap.options.get('projection').getCoordSystem().getDistance(coordinates[i - 1], coordinates[i]);

 

console.log(dist);

           });

       }

   );

}

 

$.ajax({

       url: 'belgorod.json',

       dataType: 'json',

       success: $.proxy(onPolygonLoad)

   });

}

 

debugger;dist = myMap.options.get('projection').getCoordSystem().getDistance(coordinates[i - 1], coordinates[i]);

 

 

Поставьте debugger; перед этой строчкой и посмотрите чему равно coordinates[i - 1] и coordinates[i]

Нашел у себя ошибку, данный код был вне цикла, поэтому значения счетчика i были некорректны.

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

 

http://joxi.ru/t9OeUtg5CbBnTTAbPCM

возможно сегмент начинается не от их пересечения, проверь координаты его концов

Верно, там сегмент пересечения (зеленый) удален из списка координат, но если его добавить, то будет другая проблема - учет растояния внутри периметра. На скрине видно, что там довольно много попадает под этот участок.

Я плохо разбираюсь в API карт, поэтому в том примерно сложно найти тут кусочек кода, который мне нужен.

Если можно, то на примере http://api.yandex.ru/maps/jsbox/route_inside_polygon покажите как расчитывается длина маршрута.