Клуб API Карт

Получить доступ к метке созданной через YMapsML

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

Есть xml-файл http://ovvk-info.narod.ru/lenObl.xml
Он загружается нка карту через массив:

var ml = new Array();
ml[0] = new YMaps.YMapsML('http://ovvk-info.narod.ru/lenObl.xml');
ml[0] = new YMaps.YMapsML('http://ovvk-info.narod.ru/spb.xml'); //Много файлов

Как обработать событие Click'a по любой из меток загруженной из этого файла и отобразить Мета-данные на странице?

Пытаюсь так:

YMaps.Events.observe(ml, ml.Events.Click, function (obj) {
alert(obj.metaDataProperty.AnyMetaData.winter);
});


Или хотя бы так:

YMaps.Events.observe(ml[0], ml[0].Events.Click, function (obj) {
alert(obj.name);
});


Кажется что к меткам, добавленным на карту, нужно через что-то обращаться, а вот через что - не пойму.

 

11 комментариев
Под метаданными вы подразумеваете какую-то дополнительную информацию помимо той, что в загруженном YMapsML-файле?

Навесить обработчики на все загруженные метки можно так:
YMaps.Events.observe(ml, ml.Events.Load, function (ml) {
    // Проходим все объекты
    ml.forEach(function (obj) {
        // Навешиваем обработчики
        YMaps.Events.observe(obj, obj.Events.Click, function (obj) {
            alert(obj.metaDataProperty.AnyMetaData.winter);
        });
    });
});

Если подробнее опишите задачу, то попробую подсказать что-то более конкретное.

Под метаданными подразумевается информация из YMapsML-файла в секции .

Задача в целом стоит следующая.

1. На карту подружаются данные из YMapsML-фалов, в которых каждой координате (городу, метке) сопоставлено много метаданных.

2.1. Пользователь вводит в строке поиска название города/местности и получает данные в табличной форме с ближайшей метки.

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

Не разобрался пока как:

1. Определить ближайшую метку и получить её данные (об этом уже спрашивал чуть раньше).

2. Определить на какой метке был click и опять таки получить информацию с нее (ну в конечном счете с YMapsML-файла получается).

Загружаете YMapsML-файл, после его загрузки разрешаете вывод дополнительной информации об объектах. Пока грузится YMapsML-файл грузится пользователем дается возможность просто пользоваться результатами геокодирования.

Вот небольшой фргамент кода:
    // Карта
var map

    // Результат геокодирования
    geoResult,
   
    // YMapsML-файл
    ml = new YMaps.YMapsML("путь до YMapsML"),
   
    // Отфильтрованные объекты
    myGroup;

    // По окончанию загрузки YMapsML-файла можно сделать дополнительные действия
    // с загруженными объектами
    YMaps.Events.observe(ml, ml.Events.Load, function (ml) {
    });

// Производит поиск заданного адреса
function showAddress (value) {
    var geocoder = new YMaps.Geocoder(value, {results : 1});

    YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
        if (geocoder.length()) {
            if (geoResult) {
                map.removeOverlay(geoResult);
            }
           
            // Добавляем на карту результат геокодирования
            geoResult = this.get(0);
            map.addOverlay(geoResult);
           
            // Если данные из YMapsML-файла загружены
            if (ml.length()) {
                if (myGroup) {
                    map.removeOverlay(myGroup);
                }
               
                myGroup = showObjects(geoResult.getGeoPoint());
                map.addOverlay(myGroup);
            }
        }
    });
}

// Отображает метки, которые находятся рядом с точкой point
function showObjects (point) {
    var filterObjects = ml.get(0).filter(function (obj) {
        // Если расстояние до метки меньше 1км, то берем его в расчет
        return obj.distance(point) < 1000;
    });
   
    // Дальше можно делать что-то с отфильтрованными объектами,
    // например, можно добавить их в группу и возвратить из функции
    var group = new YMaps.GeoObjectCollection();
    group.add(filterObjects);
   
    return group;
}
Надеюсь, что теперь немножко все прояснится. Если что - спрашивайте.
Если я загружаю не один файл а несколько в массив (var ml = new Array();), то как будет выглядить следующий код: 
// По окончанию загрузки YMapsML-файла можно сделать дополнительные действия
// с загруженными объектами
YMaps.Events.observe(ml, ml.Events.Load, function (ml) {
});
Его надо прокрутить в цикле ml[0] ... ml[n] или так можно и оставить?
Если поиск по части объектов вас устроит, то да, можно оставить. Если необходимо, чтобы поиск производился только тогда, когда загружены все xml-файлы, то отлавливайте соответствующий момент.

Огромное вам спасибо.

Во всем разобрался.

Все заработало.

Подскажите пожалуйста как поместить текст в описание балуна, открываещегося при клике на метке?

Хочу подгружать описание аяксом, но не знаю как обращаться к балуну.

Да, не понятно как узнать какому балуну использовать setBalloonContent()
Сделайте обработчик клика для метки и в нем подгружайте нужный контент.
Спасибо, допетрил :)