Клуб API Карт

Использовать forEach по GeoObjectCollection карты

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

Здравствуйте, похожий вопрос уже поднимался здесь, но меня интересуют немного другие подробности.

1. Есть карта, с загружеными GeoObjectCollection через YMapsML. Мне требуется обратиться в цикле ко всем группам, которые входят в GeoObjectCollection (не зависимо от уровней вложенности). Наиболее просто это должно реализовываться в методе YMaps.Group.forEach. Однако в справочнике не написано какой синтаксис параметров этого метода и имена переменных, которые передаются в callback функцию. Мне нужно в цикле обратиться к каждой группе и получить её имя и ссылку на группу для дальнейшего отображения или сокрытия. Можно привести реально работающий пример ?


2. Второй вопрос - как можно обратиться к экземпляру уже созданной карты из внешнего скрипта (не из того, в котором создавалась карта). Решится ли вопрос если просто объявить переменную map (тип YMaps) глобальной ?


Заранее благодарен.

 

 

6 комментариев
Пока делаю вот это сразу после инициализации карты в том же скрипте:

            var ml = new YMaps.YMapsML("http://xxxx/charts/best_orgs.xml");
            map.addOverlay(ml);
            
            YMaps.Events.observe(ml, ml.Events.Load, function () {
             ml.get(0).forEach(function (group) {              
              YMaps.jQuery("" + group.name + "")
                .bind("click", function () {
                    var link = YMaps.jQuery(this);
                    if (link.hasClass("active")) {
                        map.removeOverlay(group);
                    } else {
                        map.addOverlay(group);
                    }
                    link.toggleClass("active");
                    return false;
                })
                .appendTo(
                    YMaps.jQuery("
  • ").appendTo("#mapmenu")
                    );
                 });
                });


    Все
    работает, НО только если сначала по три раза кликать мышью на каждой
    ссылке. Дальнейшие исследования привели к выводу что почему-то первый
    раз не срабатывает код map.removeOverlay(group); (у меня все объекты из
    xml файла изначально показываются). Статус ссылки (active) меняется а
    объекты не исчезают с карты. Скажите пожалуйста - это ошибка работы
    карты или нужно что то сделать после подгрузки объектов YMapsML ?
    1. http://api.yandex.ru/maps/ymapsml/examples/menufromymapsml.html
    2. Вынесите map в глобальную область видимости. Самый простой способ: объявить ее без ключевого слова "var". Еще я бы посоветовал почитать про облать видимости переменных в javascript.
    Спасибо за ответ.
    1. Приведенный Вами ответ я уже расковырял полностью. У вас в нём по умолчанию объекты НЕ отображаются - только после клика мышью на ссылке. У меня наоборот - я хочу отобразить все - а затем выключать по одному типу. И именно в этот момент наступает глюк - первое выключение группы НЕ происходит, хотя сама команда  map.removeOverlay(group); отдается на выполнение. Это легко проверить с помощью того же alert после команды.
    2. Я уже пробовал объявить без var сразу перед инициализацией, вот так:
            YMaps.jQuery(function () {
                map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]), geoResult;
    и даже так
    map = '';
            YMaps.jQuery(function () {
                var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]), geoResult;
    как резулььтат - карта не грузится.....

    Спасибо за внимание к моему вопросу

    1. Чтобы объекты сразу добавлялись на карту, то необходимо изменить функцию addMenuItem:
    // Добавление одного пункта в список
    function addMenuItem (group, map, menuContainer) {

        // Показать/скрыть группу на карте
        var item = YMaps.jQuery("" + group.name + "")
            .bind("click", function () {
                var link = YMaps.jQuery(this);

                // Если пункт меню "неактивный", то добавляем группу на карту,
                // иначе - удаляем с карты
                if (link.hasClass("active")) {
                    map.removeOverlay(group);
                } else {
                    map.addOverlay(group);
                }

                // Меняем "активность" пункта меню
                link.toggleClass("active");

                return false;
            })

            // Добавление нового пункта меню в список
            .appendTo(
                YMaps.jQuery("
  • ").appendTo(menuContainer)
            )
        
         item.click();
    };
    2. До обработчика события onLoad объявите переменную с картой:
    var map;
    YMaps.jQuery(function () {
        map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
    });
    Если не сработает, то дайте ссылку на страницу.
    rodlex,
    огромное спасибо. Всё заработало.
    Вот иногда такие не вполне очевидные вещи как принудительный вызов  item.click(); приводит к нескольким часам потерянного времени :)
    С глобальной переменной разобрался, все нормально.

    var map;
    var router2;


     YMaps.jQuery(function ()
    {
      map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
      map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10); 
      
      router = new YMaps.Router(['Арбатская','Кропоткинская','Третьяковская'],[],{ viewAutoApply: true });
      map.addOverlay(router); 

      router2 = new YMaps.Router(['Арбатская','Краснопресненская','Трубная'],[],{ viewAutoApply: true });
      map.addOverlay(router2);


     
      YMaps.Events.observe(router, router.Events.Success, function ()
      {
       router.getWayPoint(0).setIconContent('база');
       var route = router.getRoute(1); 
      });
     


    YMaps.Events.observe(router2, router2.Events.Success, function ()
      {
      var route2 = router2.getRoute(1);
      });
    });
    function s(){
    t=router2.getDistance();
    document.write(router2.getDistance);
    }

    не видит переменную router2, что сделать чтобы вывести в документ?