Клуб API Карт

Осуществить поиск на карте, добавить результат поиска в кластер

Пост в архиве.
kondratenko.igo1987
6 декабря 2013, 15:14

   Добрый день!

 

      Вчера начал изучение API, есть несколько вопрос, я создал кластер объектов - проблем нет.

     Добавил строку поиска на карте, и хочу, чтобы результаты поиска (геокодирования) были указаны на карте, но все предыдущие метки не надо перезатерать - как это сделать?

Использую код для геокодирования как в примере:
Вот


  function showAddress (value) {
            //myMap.removeOverlay(geoResult);
            //var geocoder = new ymaps.Geocoder(value, {results: 1, boundedBy: myMap.getBounds()});
            var myGeocoder = new ymaps.Geocoder(value);
            ymaps.Events.observe(myGeocoder , myGeocoder .Events.Load, function () {
                if (this.length()) {
                    myGeocoder = this.get(0);
                    myMap.addOverlay(myGeocoder);
                    myMap.setBounds(myGeocoder.getBounds());
                }else {
                    alert("Ничего не найдено")
                }
            });


 ошибка Команда не поддерживается объектом  здесь:         var myGeocoder = new ymaps.Geocoder(value);

   

//***********************Вот пример кластера********************//

 

 
function init() {
    var center = [49.571110,34.505939],
        myMap = new ymaps.Map('map', {
            center: center,
            zoom: 10
        }),
        MainContentLayout = ymaps.templateLayoutFactory.createClass('', {
            build: function () {
                MainContentLayout.superclass.build.call(this);
                this.stateListener = this.getData().state.events.group()
                    .add('change', this.onStateChange, this);
                this.activeObject = this.getData().state.get('activeObject');
                this.applyContent();
            },
           
            clear: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                    this.activeObjectLayout = null;
                }
                this.stateListener.removeAll();
                MainContentLayout.superclass.clear.call(this);
            },
           
            onStateChange: function () {
                var newActiveObject = this.getData().state.get('activeObject');
                if (newActiveObject != this.activeObject) {
                    this.activeObject = newActiveObject;
                    this.applyContent();
                }
            },
           
            applyContent: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                }
   
                this.activeObjectLayout = new MainContentSubLayout({
                        options: this.options,
                        properties: this.activeObject.properties
                    });
               
                this.activeObjectLayout.setParentElement(this.getParentElement());
            }
        }),
       
        MainContentSubLayout = ymaps.templateLayoutFactory.createClass(
            '<h3>$[properties.name]</h3>' +
            '<div width="100">' +
                '$[properties.balloonContentHeader]<br>' +
                '$[properties.balloonContentBody]' +
            '</div>'
        ),
       
        ItemLayout = ymaps.templateLayoutFactory.createClass(
            '<div class="cluster-balloon-item" [if data.isSelected]style="font-weight: bold;"[endif]>$[properties.name]</div>'
        ),
       
          clusterer = new ymaps.Clusterer({
            clusterDisableClickZoom: true,
   
            clusterBalloonMainContentLayout: MainContentLayout,
            clusterBalloonSidebarItemLayout: ItemLayout,
            clusterBalloonSidebarWidth: 100,
            clusterBalloonWidth: 300
        }),
        geoObjects = [];
   
    // Мой код
    var centers = [0, 0];
    for (var i = 0; i < jSonArray[0].results.length; i++) {
 var url  = "http://192.168.2.152:5555/ERPC/main.aspx?etn=contact&pagetype=entityrecord&id=" + jSonArray[0].results[i].ContactId ;
 centerslat = parseFloat(jSonArray[0].results[i].erpc_gps_lat);
 centerslong  = parseFloat(jSonArray[0].results[i].erpc_gps_long);
        var coordinates = [
    centers[0] + centerslat,
            centers[1] + centerslong
   ];
        geoObjects[i] = new ymaps.Placemark(coordinates, {
            name: 'Агент № ' + i,
            clusterCaption: 'Агент № ' + i,
            balloonContentBody: '<br><br>' +
                    '<a href='+ url + '>Перейти на карточку агента</a> <br>',
            balloonContentHeader: jSonArray[0].results[i].FullName,
            balloonContentFooter: 'Агент'
        });

   }
    clusterer.add(geoObjects);
    myMap.geoObjects.add(clusterer);
 }

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

Уберите, пожалуйста, ваш код под кат (кнопка врезка)

Код геокодирования, что Вы нашли, он от версии АПИ 1.0

С версией 2.0 работать не будет

В документации можно посмотреть код для 2.0

kondratenko.igo1987
9 декабря 2013, 12:10

 Все равно не могу добавить поиск на карту. Пишет: "Не удалось получить свойство "geoObjects" ссылки, значение которой не определено или является NULL".

Это и так ясно, т.к. geoObjects у меня объявляется и инициализируется в функции init(). Вынести ее как глобальную переменную не могу, весь код начинает валится.

 function showAddress (value) {

var myGeocoder = ymaps.geocode(value);
myGeocoder.then(
    function (res) {
        myMap.geoObjects.add(res.geoObjects);
    },
    function (err) {
        // обработка ошибки
    }
);

 

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

вот пример, у меня там код с кластерами + геокодирование.

 

function init() {
    var center = [49.571110,34.505939],
        myMap = new ymaps.Map('map', {
            center: center,
            zoom: 10
        }),
 
        MainContentLayout = ymaps.templateLayoutFactory.createClass('', {
            build: function () {
                MainContentLayout.superclass.build.call(this);
                this.stateListener = this.getData().state.events.group()
                    .add('change', this.onStateChange, this);
                this.activeObject = this.getData().state.get('activeObject');
                this.applyContent();
            },
           
            clear: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                    this.activeObjectLayout = null;
                }
                this.stateListener.removeAll();
                MainContentLayout.superclass.clear.call(this);
            },
           
            onStateChange: function () {
                    var newActiveObject = this.getData().state.get('activeObject');
                if (newActiveObject != this.activeObject) {
                       this.activeObject = newActiveObject;
                    this.applyContent();
                }
            },
           
            applyContent: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                }
               
                this.activeObjectLayout = new MainContentSubLayout({
                        options: this.options,
                        properties: this.activeObject.properties
                    });
               
                this.activeObjectLayout.setParentElement(this.getParentElement());
            }
        }),
        MainContentSubLayout = ymaps.templateLayoutFactory.createClass(
            '

$[properties.name]

' +
            '' +
                '$[properties.balloonContentHeader]
' +
                '$[properties.balloonContentBody]' +
            ''
        ),
       
        ItemLayout = ymaps.templateLayoutFactory.createClass(
            '$[properties.name]'
        ),
       
        clusterer = new ymaps.Clusterer({
            clusterDisableClickZoom: true,
   
            clusterBalloonMainContentLayout: MainContentLayout,
            clusterBalloonSidebarItemLayout: ItemLayout,
            clusterBalloonSidebarWidth: 100,
            clusterBalloonWidth: 300
        }),
   
    //********************Инициализация кластера моими данными
    var centers = [0, 0];
    for (var i = 0; i < jSonArray[0].results.length; i++) {
 var url  = "http://192.168.2.152:5555/ERPC/main.aspx?etn=contact&pagetype=entityrecord&id=" + jSonArray[0].results[i].ContactId ;
 centerslat = parseFloat(jSonArray[0].results[i].erpc_gps_lat);
 centerslong  = parseFloat(jSonArray[0].results[i].erpc_gps_long);
        var coordinates = [
    centers[0] + centerslat,
            centers[1] + centerslong
   ];
        geoObjects[i] = new ymaps.Placemark(coordinates, {
            name: 'Агент № ' + i,
            clusterCaption: 'Агент № ' + i,
            balloonContentBody: '

' +
                    'Перейти на карточку агента
',
            balloonContentHeader: jSonArray[0].results[i].FullName,
            balloonContentFooter: 'Агент'
        });

   }
  
   
    clusterer.add(geoObjects);
    myMap.geoObjects.add(clusterer); 
 

 var myGeocoder = ymaps.geocode("Киев, улица Героев Днепра 20");
myGeocoder.then(
    function (res) {
 //var coords = res.geoObjects.get(0).geometry.getCoordinates();
        myMap.geoObjects.add(res.geoObjects);
    },
    function (err) {
        // обработка ошибки
    }
);
 
}

 

 

 

 

нужна ссылка

kondratenko.igo1987
9 декабря 2013, 13:29

я начинающий разработчик. В функцию init() я добавил такую ссылку

 

        geoObjects = [];

//создание ссылки на объекты

Refer = geoObjects;


    //создание ссылки 

 geoRefer =  myMap.geoObjects; 

 

Сейчас ошибок нет, но результат не выводит на карту.

Абсолютно ничего не происходит.

 Функция выглядит так

 

  function showAddress (value) {
 var myGeocoder = ymaps.geocode(value);
myGeocoder.then(
    function (res) {
//Мои ссылки здесь
        geoRefer.add(res.Refer);
    },
    function (err) {
        // обработка ошибки
    }
);

 

 

 

 

 

 

geoRefer.add(res.Refer);

откуда у объекта res должно появиться поле "Refer" ?

kondratenko.igo1987
9 декабря 2013, 13:53

Все отрабатывает. Спасибо, но как мне переместить фокус карты на эту метку?

 

 

kondratenko.igo1987
9 декабря 2013, 14:08

Извините, все это можно было бы сделать добавив лишь один контрол))))

 

    searchControl = new ymaps.control.SearchControl({ provider: 'yandex#publicMap' });

myMap.controls.add(searchControl, { left: '40px', top: '10px' });

 

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

 

   var myGeocoder = ymaps.geocode(fulladress);
     myGeocoder.then(
    function (res) {
 //coords = res.geoObjects.get(0).geometry.getCoordinates();
        geoRefer.add(res.geoObjects);
    },
    function (err) {
        // обработка ошибки
    }
); 

 

kondratenko.igo1987
9 декабря 2013, 14:58

Спасибо. Полюбил яндекс карты))