Клуб API Карт

Как в качестве иконки кластера использовать иконку первого геобъекта входящего в этот кластер?

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

Всё что получилось у меня это только создать такой код, но этого не достаточно, потому что у иконки маркера есть iconImageClipRect, т.е. само изображение иконки - часть спрайта.

var oldCreateCluster = clusterer.createCluster;

clusterer.createCluster = function(center, geoObjects) {
    var cluster = oldCreateCluster.apply(this, arguments);
    var preset = geoObjects[0].options.get('preset');
    preset = ymaps.option.presetStorage.get(preset);
    var icon = {
        href: preset.iconImageHref,
        size: preset.iconImageSize,
        offset: preset.iconImageOffset,
        clipRect: preset.iconImageClipRect
    };

    cluster.options.set({
        iconLayout: ymaps.layout.storage.get('cluster#icon'),
        icons: [icon, icon, icon]
    });

    return cluster;
};


Возможно мой ответ где-то тут, но той информации мне недостаточно (там нет собственно технических деталей)

http://clubs.ya.ru/mapsapi/replies.xml?parent_id=28092&item_no=23836&with_parent=1#reply-mapsapi-28092


Как я могу задать иконку кластеру просто частью спрайта или используя параметры иконки маркера?

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

Макеты для иконок кластера не умеют сейчас работать со спрайтами. Для реализации иконок кластера через спрайты вам придется написать свой макет.

А где-то можно посмотреть как должен выглядеть такой макет?
Не смог найти даже код макета по умолчанию - хотя бы на него посмотреть

Макеты можно создавать через templateLayoutFactory

Сам код можно посмотреть, если подключить апи в режиме дебаг. Там надо поискать что-то типа  cluster#iconLayout

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

var ClusterIconMod = function(data) {
    ClusterIconMod.superclass.constructor.call(this, data);
};

ymaps.util.augment(ClusterIconMod, ymaps.layout.storage.get('cluster#icon'), {
    _build: function() {
        ClusterIconMod.superclass._build.call(this);
        this._applyClipRect(this._resolveClipRect());
        this._element.style['backgroundSize'] = ''
    },
    _applyClipRect: function(clip) {
        this._currentClipRect = clip;
        this._element.style['backgroundPosition'] = clip ? ( (-clip[0][0]) + 'px ' + (-clip[0][1]) + 'px' ) : '';
    },
    _resolveClipRect: function() {
        return this._icons[this._iconIndex].clipRect;
    },
    _checkClipRect: function() {
        var newClip = this._resolveOffset();
        if (newClip !== this._currentClipRect){
            if (newClip && this._currentClipRect){
                if (newClip[0] != this._currentClipRect[0] || newClip[1] != this._currentClipRect[1]) {
                    this._applyOffset(newClip);
                }
            } else {
                this._applyOffset(newClip);
            }
        }
    },
    _onClusterIconsChange: function() {
        ClusterIconMod.superclass._onClusterIconsChange.call(this);
        this._checkClipRect();
    }
});
после выключения режима отладки карт код стал бессмысленным, т.к. после обфускации методы называются иначе

Не надо использовать педальные методы. Только публичные

а как тогда правильно будет добавить поддержу спрайтов в инонку кластера, наследуясь от стандартной иконки кластера? (или каким-то другим способом)