Клуб API Карт

Как найти на карте добавленную ранее метку (не группу) ?

Пост в архиве.
KDV
29 ноября 2010, 16:18

Суть задачи:

На карте есть статичные объекты (например ломаные) и десятки движущихся хаотично меток YMaps.Placemark.

В общем надо  перемещать каждый из объектов индивидуально, без полной перерисовки через map.removeAllOverlays и т.п.

Нужет поиск метки по ее ID с последующем изменением ее координат, т.е. аналог document.getElementById().

Вопрос КАК ?

В API ничего подходящего кроме групп не нашел, но 1 метка = 1 группа как то нелогично и неудобно с кучей лишнего кода.

PS Метки создавались динамически в цикле локальными переменными JS,  т.е. набор глобальных в JS меток-переменных отсутствует.

6 комментариев
window.globalMarkerHash={};
....
(function(){
var storefunction=map.addOverlay;
map.addOverlay(point){
 globalMarkerHash[point.__id__]=point;
 return storefunction(point);
}
map.getElementById = function(__id__){
 return globalMarkerHash[__id__]);
}
})();



остается только при создании поинта задаваеть ему этот самый __id__ и все готово.
Не было раньше такой функции, теперь - есть :)
Добавляйте все объекты в группу, у каждого объекта указывайте id (или какие-то другие опознавательные признаки). С помощью метода filter() можно будет найти нужный объект.

var group = new YMaps.GeoObjectCollection();
map.addOverlay(group);

group.add(..);
group.add(..);
group.add(..);
group.add(..);

var myObj = getObjectById(group, 1);

function getObjectById(group, id) {
    return group.filter(function (obj) {
        return obj.id = id;
    })[0];
}
Опечатка (нужно два знака равно поставить):

return obj.id == id;

Спасибо за предложенные варианты - обязательно опробую, если памяти броузера хватит на все эти операции.


Однако хотелось бы без "экзорцизма", например:


var PM = map.getObjectById("id12345");


или


var PM = map.getObjectByName("My Name");


типа 1 строчка кода и все!


PS Разумеется это уже фичреквест. Если уж в HTML/JS давным давно сие предусмотрели, то интуитивно ожидается чтолибо подобное и в API.

Мы подумаем над вашим предложением. Спасибо.
и вам спасибо, будем ждать)