Skip to content

Instantly share code, notes, and snippets.

@mrvaldes
Created April 20, 2013 00:48
Show Gist options
  • Save mrvaldes/bd7f5618cb15fa03fa2e to your computer and use it in GitHub Desktop.
Save mrvaldes/bd7f5618cb15fa03fa2e to your computer and use it in GitHub Desktop.
openlayers custom cluster strategy
OpenLayers.Strategy.MinvuCustomCluster = OpenLayers.Class(OpenLayers.Strategy.Cluster, {
cluster: function (event) {
var isPan = (event && event.type == "moveend" && !event.zoomChanged);
if ((!event || event.zoomChanged || isPan) && this.features) {
var resolution = this.layer.map.getResolution();
if (resolution != this.resolution || !this.clustersExist() || (event && event.recluster)) {
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 = clusters.length - 1; j >= 0; --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.removeAllFeatures();
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 {
if (map.zoom >= max_zoom && custom_cluster_flag) { // separar features segun sectorizada o no
var sect = []; var norm = [];
candidate.cluster.forEach(function (f) {
if (f.attributes && f.attributes.sectorizada && f.attributes.sectorizada > 0) {
sect.push(f);
} else {
norm.push(f);
}
});
if (sect.length > 0) {
var pts = OpenLayers.Geometry.Polygon.createRegularPolygon(
new OpenLayers.Geometry.Point(candidate.geometry.x, candidate.geometry.y),
30, sect.length, 0).getVertices();
for (var j in sect) {
var nf = new OpenLayers.Feature.Vector(pts[j], sect[j].attributes);
nf.data = sect[j].data;
Array.prototype.push.apply(clusters, [nf]);
}
}
if (norm.length > 0) {
if (norm.length == 1) {
clusters.push(norm[0]);
} else {
candidate.cluster = norm;
candidate.attributes.count = norm.length;
clusters.push(candidate);
}
}
} else {
clusters.push(candidate);
}
}
}
}
this.clustering = true;
this.layer.addFeatures(clusters);
this.clustering = false;
}
this.clusters = clusters;
}
}
},
CLASS_NAME: "OpenLayers.Strategy.MinvuCustomCluster"
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment