[OpenLayers-Users] Refresh vectorLayer after de/activateclusterStrategy

Heidt, Christopher M. CHRISTOPHER.M.HEIDT at saic.com
Wed Jun 3 17:32:27 EDT 2009


i just extended the cluster strategy to get what i was looking for.
Might be helpful to others.

[JAVASCRIPT]

//This allows me to addFeatures to my layer without deleting the current ones,
//also supports toggling activity without clearing the cache so that deactivating
//the strategy will reapply the features to the layer unclustered,
//and activating will cluster them again

OpenLayers.Strategy.AppendableCluster = OpenLayers.Class(OpenLayers.Strategy.Cluster, {
    
    //activation now immediatly clusters
    activate: function() {
        var activated = OpenLayers.Strategy.prototype.activate.call(this);
        if(activated) {
            this.layer.events.on({
                "beforefeaturesadded": this.cacheFeatures,
                "moveend": this.cluster,
                scope: this
            });
            this.cluster(); //<--
        }
        return activated;
    },

    //deactivating clears clusters and adds the features directly
    //DOES NOT CLEARCACHE
    deactivate: function() {
        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
        if(deactivated) {
            this.layer.events.un({
                "beforefeaturesadded": this.cacheFeatures,
                "moveend": this.cluster,
                scope: this
            });
            this.layer.destroyFeatures(this.layer.features); //<-- 
            this.layer.addFeatures(this.features); //<-- 
        }
        return deactivated;
    },

    //cacheFeatures now appends new features to the current cache
    //DOES NOT CLEARCACHE
    cacheFeatures: function(event) {
        var propagate = true;
        if(!this.clustering) {
            if(this.features === null){
				this.features = [];
			}
			this.features = this.features.concat(event.features); //<-- 
            this.cluster();
            propagate = false;
        }
        return propagate;
    },

    //added an !event check to the second if to enable forced clustering
    cluster: function(event) {
        if((!event || event.zoomChanged) && this.features) {
            var resolution = this.layer.map.getResolution();
            if(!event || resolution != this.resolution || !this.clustersExist()) {
                this.resolution = resolution;
                var clusters = [];
                var feature, clustered, cluster;
                for(var i=0; i<this.features.length; ++i) {
                    feature = this.features[i];
                    if(feature.geometry) {
                        clustered = false;
                        for(var j=0; j<clusters.length; ++j) {
                            cluster = clusters[j];
                            if(this.shouldCluster(cluster, feature)) {
                                this.addToCluster(cluster, feature);
                                clustered = true;
                                break;
                            }
                        }
                        if(!clustered) {
                            clusters.push(this.createCluster(this.features[i]));
                        }
                    }
                }
                this.layer.destroyFeatures();
                if(clusters.length > 0) {
                    if(this.threshold > 1) {
                        var clone = clusters.slice();
                        clusters = [];
                        var candidate;
                        for(var i=0, len=clone.length; i<len; ++i) {
                            candidate = clone[i];
                            if(candidate.attributes.count < this.threshold) {
                                Array.prototype.push.apply(clusters, candidate.cluster);
                            } else {
                                clusters.push(candidate);
                            }
                        }
                    }
                    this.clustering = true;
                    this.layer.addFeatures(clusters);
                    this.clustering = false;
                }
                this.clusters = clusters;
            }
        }
    },

    CLASS_NAME: "OpenLayers.Strategy.AppendableCluster" 
});

[/JAVASCRIPT]

-----Original Message-----
From: users-bounces at openlayers.org on behalf of Heidt, Christopher M.
Sent: Wed 6/3/2009 3:36 PM
To: users at openlayers.org
Subject: [OpenLayers-Users] Refresh vectorLayer after de/activateclusterStrategy
 
I use a clusterStrategy by default, but I have a button that lets the
user toggle it off.
Is there a way to refresh the layer so that it can redraw with/without
clusters?

I've tried:
[JS]
if(pressed){
	clusterStrategy.activate();	
}
else{
	clusterStrategy.deactivate();
}
clusterStrategy.clearCache();
vectorLayer.redraw();
[/JS]

But that was not helpful.
_______________________________________________
Users mailing list
Users at openlayers.org
http://openlayers.org/mailman/listinfo/users


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/openlayers-users/attachments/20090603/8ea113e1/attachment.html


More information about the Users mailing list