Клуб API Карт

Множественное геокодирование (оформление балуна)

capone.mx
17 апреля 2010, 14:16

Мне необходимо вывести на карту ряд объектов по списку. При этом у каждого объекта должен быть балун с названием, а при щелчке на нем выводилось бы описание. Я вывожу объекты (из 1С) при помощи кода ниже. Вопрос следующий: как передать в геокодер вместе с адресами и название/описание для метки?

// Создание обработчика для события window.onLoad
|        YMaps.jQuery(function () {
|            // Создание экземпляра карты и его привязка к созданному контейнеру
|            var map = new YMaps.Map(YMaps.jQuery(""#YMapsID"")[0]);
|
|            // Установка для карты ее центра и масштаба
|           map.setCenter(new YMaps.GeoPoint(135.094069,48.4767176), 13);
|                map.addControl(new YMaps.TypeControl());
|                map.addControl(new YMaps.ToolBar());
|                map.addControl(new YMaps.Zoom());
|                map.addControl(new YMaps.MiniMap());
|                map.addControl(new YMaps.ScaleLine());
|
|            // Координаты или адреса географических объектов
|            var data = ["+СтрокаАдресов+"];
|
|            var geocoder = new MultiplyGeocoder(data);
|            map.addOverlay(geocoder);
|
//|            YMaps.Events.observe(geocoder, ""Load"", function (geocoder) {
//|                alert(""Геокодирование завершено"");
//|            });
|        });
|
|        // Реализует наследование прототипа без исполнения конструктора родителя
|        function extend (child, parent) {
|            var c = function () {};
|            c.prototype = parent.prototype;
|            c.prototype.constructor = parent;
|            return child.prototype = new c;
|        };
|
|        // Множественный геокодер
|        // requests - массив адресов
|        function MultiplyGeocoder (requests) {
|
|            // Вызов родительского конструктора
|            YMaps.GeoObjectCollection.call(this);
|
|            var _this = this,
|
|                // Количество вызовов геокодера
|                geocodeCallCount = 0,
|
|                // Обработчики событий
|                listeners = [];
|
|            // Последовательно геокодируем все переданные адреса
|            for (var i = 0, l = requests.length; i < l; i++) {
|                geocode(requests[i]);
|            }
|
|            // Функция, отвечающая за геокодировании одного адреса
|            function geocode (request) {
|                // Геокодируем
|                var geocoder = new YMaps.Geocoder(request);
|           
|                // Счетчик вызовов геокодирования увеличиваем
|                geocodeCallCount++;
|
|                // Сохраняем ссылки на обработчики событий
|                listeners = listeners.concat(
|
|                    // Обработка событий Load и Fault
|                    YMaps.Events.observe(geocoder, [geocoder.Events.Load, geocoder.Events.Fault], function (geocoder) {
|                        if (geocoder.length()) {
|                            _this.add(geocoder.get(0));
|                        }
|                        geocodeCallCount--;
|                        isFinish();
|                    })
|                );
|            }
|
|            // Функция для проверки окончания процесса геокодирования
|            function isFinish () {
|                // Если все объекты сгеокодированы, то генерируем событие завершения
|                if (!geocodeCallCount) {
|
|                    // Событие о завершении геокодирования
|                    YMaps.Events.notify(_this, ""Load"", _this);
|
|                    // Удаление обработчиков событий
|                    for (var i = 0, l = listeners.length; i < l; i++) {
|                        listeners[i].cleanup();
|                    }
|                }
|            }
|        }
|
|        var ptp = extend(MultiplyGeocoder, YMaps.GeoObjectCollection);



1 комментарий
Подписаться на комментарии к посту
Я советую вначале прогеокодировать все ваши адреса, а потом уже, оперируя координатами, отображать объект на карте.

Можно в массиве requests передавать не массив координат, а массив объектов с необходимыми данными.
Например, вот так:
[
    {
        geopoint : new YMaps.GeoPoint(35, 55),
        name : "Имя",
        description : "Описание объекта"
    },
    {
        geopoint : new YMaps.GeoPoint(36, 56),
        name : "Имя 2",
        description : "Описание объекта 2"
    }
]
Ну а дальше эти данные использовать.