Клуб API Карт

Кластеризация меток + YMapsML кластеризация меток и ломаных

eugenepr
25 августа 2013, 12:05

Добрый день, уважаемые представители клуба! Я новичок в данном вопросе.

 

Вопрос 1

Столкнулся с неожиданной проблемой: не могу кластеризировать метки. Перебробовал многие скрипты из песочницы и т.д. Как я понял добавить нужно 3 строчки стандартного кода, ан нет, что-то не так. Ниже привожу код из отдельного файла, где лежит скрипт. На старнице сайта, куда подгружается скрипт, подключены следующие скрипты:

<script src="http://api-maps.yandex.ru/2.0/?load=package.full,package.clusters&lang=ru-RU" type="text/javascript"></script>

<script src="<?=base_url();?>files/admin/js/ya_maps_selection.js"></script>

<script type="text/javascript" src="http://yandex.st/jquery/1.6.4/jquery.min.js"></script>

 

ymaps.ready(init);

function init() {

    // Создание экземпляра карты.

    var myMap = new ymaps.Map('YMapsID', {

            center: [paramCenter],

            zoom: 12

        });

     myGeoObjects = [];

    // Перебираем все группы.

    groups.forEach(function (group) {

        // Кластер для меток.

        clusterer = new ymaps.Clusterer();      

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

        myMap.geoObjects.add(clusterer);

        

        // Перебираем элементы группы.

        group.items.forEach(function (item) {

             // Создаем метку.

             placemark = new ymaps.Placemark(item.center, { balloonContent: item.name });

             // Добавляем метку в массив.

             myGeoObjects.push(placemark);              

        });

    });

    //добавляем массив в кластер

    clusterer.add(myGeoObjects);

    

    myMap.controls

    // Кнопка изменения масштаба.

    .add('zoomControl', { left: 5, top: 5 })

    // Список типов карты

    .add('typeSelector')

    // Стандартный набор кнопок

    .add('mapTools', { left: 35, top: 5 });

       

    // Выставляем масштаб карты чтобы были видны все группы.

    myMap.setBounds(myMap.geoObjects.getBounds());

}

Ошибок в консоли не нахожу, карта не отображается (только подложка). Если вместо кластера использовать коллекцию то все работает.

 

 Вопрос 2

Имеется карта созданная в рамках сервиса "Мои карты". Посредством YMapsML подгружаю ее к себе на сайт. На исходной карте имеются метки и ломаные. При кластеризации полученной выборки ломаные естественно с карты исчезают, остаются только метки. Каким образом возможно дополнительно к кластеру меток подгрузить ломаные?


Спасибо!

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

1. Если загужаете package.full, то загружать package.clusters уже не нужно.

Чтобы метки кластеризовывались, их нужно добавлять в кластеризатор, а не в коллекции, см. пример в документации.

2. Этого сделать нельзя. Кластеризуются только геообъекты с геометрией типа Point

Я добавлял их в кластер, согласно примеру:

 

var myGeoObjects = [];

// Перебираем все группы.

    groups.forEach(function (group) {

        // Коллекция для геообъектов группы.

        clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true});

        // Перебираем элементы группы.

        group.items.forEach(function (item) {

             // Создаем метку.

             placemark = new ymaps.Placemark(item.center, { balloonContent: item.name });

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

             myGeoObjects.push(placemark);

        });

    });

 

clusterer.add(myGeoObjects); map.geoObjects.add(clusterer);
По поводу Вопроса 2: мне не нужно кластеризировать ломаные, просто добавить их на карту. То есть на карте будет кластер меток и много ломаных без кластера

1. 

Я добавлял их в кластер, согласно примеру

В вашем первом посте несколько другой код.

Лучше запостить ссылку на ваш пример, я посмотрю что не так.

2. Да так можно сделать. Будут кластеризованные метки + ломаные

1. Первый пост исправлен, при этом карта не отображается (только подложка). Сслыка на неработающий пример http://speedmap.ru/map

Предварительно перед открытием карты на вышеуказанной станице нужно выбрать "оператора"->Yota и "населенный пункт"->Яблоновский, далее нажать "показать"

2. Не подскажите где можно посмотреть пример подобного кода?

Загляните в консоль браузера

там все написано:

clusterer.add(myGeoObjects);Uncaught ReferenceError: clusterer is not defined

Данная ошибка у меня почему-то не появляется. Но имеет место другая (кусок кода из api yandex):

} center = left + Math.round((right - left) * (value - lValue) / (rValue - lValue)); if (center == left) { center++; } else if (center == right) { center--; } if (arr[center][0] < value) {Uncaught TypeError: Cannot read property '0' of undefined return this._getPosition(arr, center, right, value); } else { return this._getPosition(arr, left, center, value); } } };

 

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

 

ymaps.ready(init);

function init() {

 

    // Создание экземпляра карты.

    var myMap = new ymaps.Map('YMapsID', {

            center: [paramCenter],

            zoom: 12

        });

     var gb = [[999,999],[0,0]];

     var myGeoObjects = [];

     

     myGeoObjects[0] = new ymaps.GeoObject({

        geometry: {type: "Point", coordinates: [44.989430, 38.953249]},

        properties: {

           clusterCaption: 'Геообъект №1',

           balloonContentBody: 'Содержимое балуна геообъекта №1.'

           }

     });

     myGeoObjects[1] = new ymaps.GeoObject({

        geometry: {type: "Point", coordinates: [44.990078, 38.951382]},

        properties: {

           clusterCaption: 'Геообъект №2',

           balloonContentBody: 'Содержимое балуна геообъекта №2.'

           }

     });

     myGeoObjects[2] = new ymaps.GeoObject({

        geometry: {type: "Point", coordinates: [44.992393, 38.948314]},

        properties: {

           clusterCaption: 'Геообъект №3',

           balloonContentBody: 'Содержимое балуна геообъекта №3.'

           }

     });

     var clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true});

     clusterer.options.set({

                gridSize: 64

            });

     myMap.geoObjects.add(clusterer);

    

     // Перебираем все группы.

     groups.forEach(function (group) {

         //Коллекция для геообъектов группы.

         // Перебираем элементы группы.

        group.items.forEach(function (item) {

             // Создаем метку.

             placemark = new ymaps.Placemark(item.center, { balloonContent: item.name });

             

             gb[0][0] = Math.min(gb[0][0], item.center[0]);

             gb[0][1] = Math.min(gb[0][1], item.center[1]);

             gb[1][0] = Math.max(gb[1][0], item.center[0]);

             gb[1][1] = Math.max(gb[1][1], item.center[1]);

             

        });

           

    });

        

        clusterer.add(myGeoObjects);

                    

        //if (placemarks.length>0) {         

        myMap.controls

        // Кнопка изменения масштаба.

        .add('zoomControl', { left: 5, top: 5 })

        // Список типов карты

        .add('typeSelector')

        // Стандартный набор кнопок

        .add('mapTools', { left: 35, top: 5 });

        

        // Выставляем масштаб карты чтобы были видны все группы.

        myMap.setBounds(gb);

Вопрос 1 закрыт! Сначала нужно было определить границы карты, а только потом выводить на карту кластер. Спасибо!