Клуб API Карт

Сортировка точек в маршруте

Пост в архиве.
Всем привет, постараюсь объяснить что хочется.

Точки на карте распологаются путем считывания информации из Таблицы и номеруются по возврастанию т.е (1.2.3.4 и т.д), затем на карту наносится маршрут между точками. Но вот проблема, к примеру растояние между 1 и 3 точкой меньше чем между 1 и 2, но маршрут строиться по точка т.е начинам с 1 далее во 2 и в 3 и т.д. Хотелось бы каким либо образом отсортировать их по длине маршрута к примеру если растояние между 1 и 3 меньше чем между 1 и 2, то 2 точке да цифру 3, а 3 точке цифру 2
13 комментариев

Если координаты точек заранее известны используйте метод distance для сортировки

http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/coordSystem.geo.xml

помогите с правельно сортировочкой пожалуйста, а то не совсем понятно как это жедалть, тут пример. Координаты беем из таблички под картой. Павельнее всего было бы посетить 1 2 4 3, нежели как строится щас 1 2 3 4

http://dmx1988.narod2.ru/

я думал чтото типа такого должно сработать, но на 100% не уверен =)

надо проверять

 

a = [[47.8372412,35.1182257], [47.836661,35.124], [47.8463874,35.1252397], [47.8445338,35.1268512]];

var r = 0;

a.sort(function (a, b) { var t = r; if((r = ymaps.coordSystem.geo.getDistance(a, b)) < t) { return -1; } else { return 1; } return 0; });

Извените не совсем понятно, я самоучка может объясните что тут к чему (как данное применить к моему примеру)?

координаты я храню в markers[]

У любого массива в javascript есть метод sort

который принимает функцию, в которую передаются 2 параметра - элемента массива,

т.е. эта функция вызывается последовательно на всех элементах массива и внутри должна их сравнивать (по какому-то признаку) и вернуть число

- если вернет "-1" (ну или любое отрицательное число) - элементы поменяются местами,

если "1" (или любое положительное число) - порядок следования останется в неизменном виде

почему один и тот же код в Хроме по одному строит маршрут в IE по другому(причем если нажать один раз строит по одному маршруту, если нажать второй раз то по другому)? и помоему данный вид сортировки не очень подходит или я ошибаюсь? подскажите что не так очень нужна эта сортировочка :-(

http://dmx1988.narod2.ru/

 

Использую сортировку перед построеним маршрута

 

            //строим маршрут

            function calcRoute() {

                var len = markers.length;

                myMap.geoObjects.remove(cluster); //удаляем кластера

 

                var r = 0;

                markers.sort(function (a, b) {var t = r;if ((r = ymaps.coordSystem.geo.getDistance(a, b)) < t){ return -1;}else { return 1;}return 0;});

 

                for (var i = 0; i < len; i++) {

                    point[i] = markers[i].geometry.getCoordinates(); //Заносим в point геокординаты из маркеров

                }

                //Создание маршрута через заданые точки, point - Список точек которые необходимо посетить

                ymaps.route(point, {

                    // Опции маршрутизатора

                    mapStateAutoApply: true, // автоматически позиционировать карту

                    avoidTrafficJams: false // маршрут с учетом пробок

                }).then(function (router) {

 

                    route = router;

                    myMap.geoObjects.add(route); // Добавление маршрута на карту

 

                }, function (error) {

                    alert("Возникла ошибка: " + error.message);

                });              

            }

 

есть еще варианты или я просто не то что-то делаю?

IE у меня нет, - везде одни маки,

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

Сделал так

var r = 0;
var arr1 = markers;
arr2 = markers.sort(function (a, b) { var t = r; if ((r = ymaps.coordSystem.geo.getDistance(a, b)) < t) { return -1; } else { return 1; } return 0; });
alert(arr1 === arr2);

 

выводит TRUE, получается что сортировка не отработала

нене 

так и должно быть - sort меняет текущий массив, а не создает новый

вам надо проверить совпадает ли порядок элементов в массиве

var r = 0;


document.getElementById('label1').innerHTML = markers[0].geometry.getCoordinates() + " : " + markers[1].geometry.getCoordinates() + " : " + markers[2].geometry.getCoordinates() + " : " + markers[3].geometry.getCoordinates();


markers.sort(function (a, b) { var t = r; if ((r = ymaps.coordSystem.geo.getDistance(a, b)) < t) { return -1; } else { return 1; } return 0; });


document.getElementById('label2').innerHTML = markers[0].geometry.getCoordinates() + " : " + markers[1].geometry.getCoordinates() + " : " + markers[2].geometry.getCoordinates() + " : " + markers[3].geometry.getCoordinates();

 

Результат, одинаковый:

35.1182257 ,47.8372412 : 35.1252397 ,47.8463874 : 35.124 ,47.836661 : 35.1268512 ,47.8445338


35.1182257 ,47.8372412 : 35.1252397 ,47.8463874 : 35.124 ,47.836661 : 35.1268512 ,47.8445338

 

P.S. тут нигде тегов для кода нет? что бы читабельнее было

 getDistance принимает массив координат, а не геообъект

в markers у тебя должен быть массив массивов типа такого

markers = [

    [55.7, 37.5],

    [55.8, 37.6],

    ...

];

спасибо вроде получилось надо было сортировать не markers а point

for (var i = 0; i < len; i++) {
point[i] = markers[i].geometry.getCoordinates(); //Заносим в point геокординаты из маркеров
}
point.sort(function (a, b) { var t = r; if ((r = ymaps.coordSystem.geo.getDistance(a, b)) < t) { return -1; } else { return 1; } return 0; });