Клуб API Карт

Поиск по своим объектам загруженным из xml файла при помощи control.SearchControl

ACLenkov
5 января 2015, 01:40

Данная тема уже поднималась, но для себя ответа так и не смог найти. Пытаюсь сделать аналогично с примером ( Пример от Яндекса - поиск по своим объектам ), но проблема в том что объекты загружаются из xml-файла (xml файл). Не могу определиться даже с алгоритмом решения, толи мне из моих данных такой же массив сформировать и использовать функцию как в примере, толи есть какой то еще способ более правильный. Пожалуйста помогите!

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

XML файл при получении будет представлен геоколлекцией. Вы можете также использовать ее как и массив в данном примере.

Изначально в моем примере была коллекция, не знаю зачем документаторы заменили в песочнице на массив

Я правильно понял?

var collection;

ymaps.geoXml.load("http://mapmarker.ivpek.ru/s.xml?v=" + (+new Date) )

   .then(function (res) {

collection = myMap.geoObjects.add(res.geoObjects); // Добавление геообъектов на карту

                    },

                    function (error) {   // Вызывается в случае неудачной загрузки YMapsML-файла

                        alert("При загрузке YMapsML-файла произошла ошибка: " + error);

                    });

......

.....

    myMap.controls.add(

    new ymaps.control.SearchControl({

        options: {

            provider: new SearchCollectionProvider(collection),

            useMapBounds: true

        }

    })

);

 

1. Наверное надо создать ссылку на res.geoObjects, а не на myMap.geoObjects

2. Javascript это не пэхапе

ymaps.geoXml.load работает асинхронно, а вы хотите сразу после него передать collection, которого еще нет, в провайдер.

как сделать чтоб это работало в 2.1, пример из 2,0. Вот в такой конструкции 

var map,

    objectManager,

    layerName = "user#layer";

ymaps.ready(onReady);

 

function onReady () {

    setupLayer();

    setupMap();

    

}

 

function setupLayer () {

    var Layer = function () {

        var layer = new ymaps.Layer("./%z/%x-%y.jpeg", {

            //tileTransparent: true,

            notFoundTile: "./2/0-0.jpeg"

        });

        layer.getZoomRange = function () {

            return ymaps.vow.resolve([1, 4]);

        };

        layer.getCopyrights = function () {

            return ymaps.vow.resolve("wow!");

        };

        return layer;

    };

    ymaps.layer.storage.add(layerName, Layer);

    var mapType = new ymaps.MapType(layerName, [layerName]);

    ymaps.mapType.storage.add(layerName, mapType);

}

 

function setupMap () {

    map = new ymaps.Map('map', {

        center: [0, 0],

        zoom: 2,

        behaviors: ["default", "scrollZoom"]

        type: layerName

    }, {

        projection: new ymaps.projection.Cartesian([[-1, -1], [1, 1]], [false, false])

    });

   // Создаем коллекцию для точек из data.js

                collection = new ymaps.GeoObjectCollection();

            // Добавляем коллекцию на карту.

            map.geoObjects.add(collection);

            // Массив points определен в файле data.js

            // Заполняем коллекцию тестовыми данными.

            for(var i = 0, len = points.length; i < len; i++) {

                collection.add(

                    new ymaps.Placemark(points[i].coords, {

                        balloonContentBody: points[i].label

                    })

                );

            }

            // Создаем экземпляр класса ymaps.control.SearchControl

            // и подменяем ему стандартный провайдер данных - геокодер,

            // на экземпляр класса SearchCollectionProvider (из файла search-collection-provider.js)

            var search = new ymaps.control.SearchControl({

                provider : new SearchCollectionProvider(collection),

                noPlacemark : true

            });

            // Добавляем контрол в верхний правый угол.

            map.controls.add(search, { right : 10, top : 10 });

        

 

 

}