Клуб API Карт

Получить список всех балунов отсортированный по отдалённости от местаположения пользователя

ya.dem909
17 января 2015, 02:50

Здравствуйте! Начал разбираться с Яндекс.Картами и столкнулся с такой проблемой: когда пользователь делает определённое действие (кликает на кнопку) на карту выводятся метки и список этих меток (под картой) отсортированный по отдалённости от местоположения пользователя (и что бы параметр метки "id" тоже отображался). Первое получилось сделать, а вот второе - не знаю как реализовать(

Буду очень благодарен за помощь!

 

PS. вот мой код, может как-то поможет

 


function init () {

var geolocation = ymaps.geolocation;
var myMap = new ymaps.Map('map', {
center: [53.9214, 27.5695],
zoom: 16,

controls: ['zoomControl','geolocationControl']
});

var myCollection = new ymaps.GeoObjectCollection();
var UserCollection = new ymaps.GeoObjectCollection();
// Сравним положение, вычисленное по ip пользователя и
// положение, вычисленное средствами браузера.
geolocation.get({
provider: 'yandex',
mapStateAutoApply: true
}).then(function (result) {
// Красным цветом пометим положение, вычисленное через ip.
result.geoObjects.options.set('preset', 'islands#redCircleIcon');
result.geoObjects.get(0).properties.set({
balloonContentBody: 'Ваше предположительное местоположение'
});
UserCollection.removeAll();
UserCollection.add(result.geoObjects);
});

geolocation.get({
provider: 'browser',
mapStateAutoApply: true
}).then(function (result) {
// Синим цветом пометим положение, полученное через браузер.
// Если браузер не поддерживает эту функциональность, метка не будет добавлена на карту.
result.geoObjects.options.set('preset', 'islands#blueCircleIcon');
UserCollection.removeAll();
UserCollection.add(result.geoObjects);

});

myMap.geoObjects.add(UserCollection);

$(document).on("click", ".button", function(){

myCollection.removeAll();
var t = $(this).text();

$.ajax({
type: "GET",
url: "q.php",
data: {name: t},
success: function(msg){
var d = JSON.parse(msg);
console.info(d);
for(var i=0;i< d.length;i++){
var myPlacemark = new ymaps.Placemark([d[i].lng, d[i].lat], {

balloonContentHeader: d[i].name,
balloonContentBody: d[i].descriptions,
hintContent: d[i].name,
id: d[i].id
});

myCollection.add(myPlacemark);
}
myCollection.events
.add('mouseenter', function (e) {
// Ссылку на объект, вызвавший событие,
// можно получить из поля 'target'.
e.get('target').options.set('preset', 'islands#greenIcon');
})
.add('mouseleave', function (e) {
e.get('target').options.unset('preset');
});

myMap.geoObjects.add(myCollection);
}
});
});

}

ymaps.ready(init);

 

Заранее спасибо за любую помощь!

2 комментария
Подписаться на комментарии к посту

Там где вы создаете метки создавайте и добавляйте в DOM элементы списка

А как их потом отсортировать, не подскажете? И как тогда сделать нахождение расстояния между точкой пользователя и всеми остальными?

Я добавил в for (в конец) такой код:

 

ymaps.route([

    [userPosition.geoObjects.position[0], userPosition.geoObjects.position[1]]
    ,
    [parseFloat(d[i].lng), parseFloat(d[i].lat)]

]).then(
    function(router){
        $("#info").append("Название: "+d[i].name+"
" +
        "Описание: "+d[i].descriptions+"
" +
        "Расстояние: "+router.getLength()+"
" +
        "id: "+d[i].id+"");

},
    function (error) {
        console.log("Возникла ошибка: " + error.message);
    }
);

Но мне кажется это не совсем правильное решение + в then у нас не обновляется переменная i