Клуб API Карт

Поиск по своим объектам .gpx

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

Здравствуйте!

 

Не могу организовать поиск по свои объектам из файла .gpx загруженным  geoXml.load.

Объекты, балуны все отображатся.

 

Пример из  песочницы подзазумевает, что есть Массив с данными => myPoints. Не понятно, можно ли такой массив получить автоматически (возможно в виде файла как  тут) используя API Яндекс или сторонние инструменты. Создание такого массива в ручную представляется мало переспективным занятием т.к. колличевство объектов обещает вырасти до 700 и файл .gpx с объектами будет меняться примерно раз в месяц.

 

Или же как здесь, но я не понял где ошибся автор.

9 комментариев

В вашем случае коллекции вручную создавать не надо.

Они создаются при загрузке GPX. Надо лишь перебирать полученные из вызова geoXml.load коллекции и метки в них.

я запутался, не понимаю в чем ошибка пример перебора с ошибкой

1. Вы создаете поисковый контрол с пустой коллекцией.

Надо бы конечно его создавать когда данные пришли (внутри then)

2. Своя коллекция вам тут не нужна, можно использовать готовый res.geoObjects.


Сейчас вы вкладываете одну коллекцию res.geoObjects в другую myCollection

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

я исправил

 var myCollection = new ymaps.GeoObjectCollection(); ymaps.geoXml.load('http://maps.yandex.ru/export/usermaps/Ecdn5BhFN9pypWoQHcH9jyY1L57Cl1Mq/').then(function (res) { myCollection.add(res.geoObjects); myMap.geoObjects.add(myCollection); });

на

ymaps.geoXml.load('http://maps.yandex.ru/export/usermaps/Ecdn5BhFN9pypWoQHcH9jyY1L57Cl1Mq/').then(function (res) { myMap.geoObjects.add(res.geoObjects); });

 Объекты отображаются; поиска не происходит

 

У вас провайдер поискового контрола должен принимать res.geoObjects чтобы по нему искать.

Где вы его передаете?

                ymaps.geoXml.load('http://maps.yandex.ru/export/usermaps/Ecdn5BhFN9pypWoQHcH9jyY1L57Cl1Mq/').then(function (res) {
             
       myMap.geoObjects.add(res.geoObjects);

       var mySearchControl = new SearchCollectionControl();

         function SearchCollectionProvider(collection) {
            this._collection = collection;           
        }

        SearchCollectionProvider.prototype.geocode = function (request, options) {
            var promise = new ymaps.util.Promise(),
                geoObjects = new ymaps.GeoObjectArray(),
                offset = options.skip || 0,
                limit = options.results || 10;
               
               

            this._collection.each(function (point) {
                var prop = point.properties.get('balloonContentBody');
               
                console.log(prop);

                if(~prop.toLowerCase().indexOf(request.toLowerCase())) {
                    geoObjects.add(new ymaps.GeoObject({
                        geometry: {
                            type: "Point",
                            coordinates: point.geometry.getCoordinates()
                        },
                        properties: {
                            name: prop + ' name',
                            description: prop + ' description',
                            balloonContentBody: '

' + prop + '

'
                        }
                     }));
                }
            });

            var response = {
                // geoObjects: geoObjects.splice(offset, limit), // разкомментировать когда починят splice
                geoObjects: geoObjects, // геообъекты поисковой выдачи
                // метаинформация ответа
                metaData: {
                    geocoder: {
                        request: request, // строка обработанного запроса
                        found: geoObjects.getLength(), // количество найденных результатов
                        results: limit, // количество возвращенных результатов
                        skip: offset // количество пропущенных результатов
                    }
                }
            };

            // выполняем асинхронную обработку
            setTimeout(function () {
                promise.resolve(response);
            }, 0);

            return promise;
        };

        function SearchCollectionControl(collection, options) {
            options = options || {};
            options.provider = new SearchCollectionProvider(collection);
            options.noPlacemark = true;

            return new ymaps.control.SearchControl(options);
        }
            myMap.controls.add(mySearchControl, { right : 10, top : 10 });
                 
                });

Ну в контрол вроде бы надо передать коллекцию

 

var mySearchControl = new SearchCollectionControl();

->

var mySearchControl = new SearchCollectionControl(res.geoObjects);


Добавьте свой код на jsfiddle.net и запостите тут ссылку. Так легче будет помогать.

Помогло, но наполовину; конечная цель не решена

 В этом примере поиск по своим объектам работает, помогли Ваши поправки, спасибо;

Идем к конечной цели => поиск используя файл с навигатора .gpx

 Меняем загрузочный файл объекты отображаются, но поиск не работает

Подскажите пожалуйста,

почему сервер не возвращает ответ при попытке поиска по своим объектам взятых с файла .gpx

 код на jsfiddle.net