[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