1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
<html>
<head>
<script src="../OLLoader.js"></script>
<script type="text/javascript">
function test_activate(t) {
t.plan(2);
var strategy = new OpenLayers.Strategy.Cluster();
t.eq(strategy.active, false, "not active after construction");
var layer = new OpenLayers.Layer.Vector("Vector Layer", {
strategies: [strategy]
});
var map = new OpenLayers.Map('map');
map.addLayer(layer);
t.eq(strategy.active, true, "active after adding to map");
}
function test_clusters(t) {
t.plan(22);
function featuresEq(got, exp) {
var eq = false;
if(got instanceof Array && exp instanceof Array) {
if(got.length === exp.length) {
for(var i=0; i<got.length; ++i) {
if(got[i] !== exp[i]) {
console.log(got[i], exp[i]);
break;
}
}
eq = (i == got.length);
}
}
return eq;
}
var strategy = new OpenLayers.Strategy.Cluster();
var layer = new OpenLayers.Layer.Vector("Vector Layer", {
strategies: [strategy],
isBaseLayer: true
});
var map = new OpenLayers.Map('map', {
resolutions: [4, 2, 1],
maxExtent: new OpenLayers.Bounds(-40, -40, 40, 40),
zoomMethod: null
});
map.addLayer(layer);
// create features in a line, 1 unit apart
var features = new Array(80);
for(var i=0; i<80; ++i) {
features[i] = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(-40 + i, 0)
);
}
// add one additional feature, with no geometry - just to confirm it doesn't break things
features.push(new OpenLayers.Feature.Vector());
layer.addFeatures(features);
map.setCenter(new OpenLayers.LonLat(0, 0), 0);
// resolution 4
// threshold: 4 * 20 = 80 units
// one cluster
t.eq(layer.features.length, 1, "[4] layer has one cluster");
t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 80)), "[4] cluster includes all features with geometries");
// resolution 2
// threshold: 2 * 20 = 40 units
// two clusters (41 and 39) - first cluster includes all features within 40 units of the first (0-40 or 41 features)
map.zoomIn();
t.eq(layer.features.length, 2, "[2] layer has two clusters");
t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 41)), "[2] first cluster includes first 41 features");
t.ok(featuresEq(layer.features[1].cluster, features.slice(41, 80)), "[2] second cluster includes last 39 features");
// resolution 1
// threshold: 1 * 20 = 20 units
// four clusters (21, 21, 21, and 17)
map.zoomIn();
t.eq(layer.features.length, 4, "[1] layer has four clusters");
t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 21)), "[1] first cluster includes first 21 features");
t.ok(featuresEq(layer.features[1].cluster, features.slice(21, 42)), "[1] second cluster includes second 21 features");
t.ok(featuresEq(layer.features[2].cluster, features.slice(42, 63)), "[1] third cluster includes third 21 features");
t.ok(featuresEq(layer.features[3].cluster, features.slice(63, 80)), "[1] fourth cluster includes last 17 features");
// zoom out and back in to test threshold property (21)
map.zoomOut();
strategy.threshold = 21;
map.zoomIn();
t.eq(layer.features.length, 20, "[1-threshold 21] layer has 20 clusters");
t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 21)), "[1-threshold 21] first cluster includes first 21 features");
t.ok(featuresEq(layer.features[1].cluster, features.slice(21, 42)), "[1-threshold 21] second cluster includes second 21 features");
t.ok(featuresEq(layer.features[2].cluster, features.slice(42, 63)), "[1-threshold 21] third cluster includes third 21 features");
t.ok(featuresEq(layer.features.slice(3, 20), features.slice(63, 80)), "[1-threshold 21] last 17 features are not clustered");
// zoom out and back in to test high threshold
map.zoomOut();
strategy.threshold = 100; // clusters must contain 100 features or more
map.zoomIn();
// the one feature with no geometry is not added to the layer
t.eq(layer.features.length, features.length-1, "[1-threshold 100] layer has " + (features.length-1) + " clusters");
t.ok(featuresEq(layer.features, features.slice(0, 80)), "[1-threshold 100] layer has all features with geometry");
// remove features and zoom
strategy.threshold = 1;
map.setCenter(new OpenLayers.LonLat(0, 0), 0);
t.eq(strategy.features.length, 81,
"[remove features] cluster has cache");
layer.removeAllFeatures();
t.eq(layer.features.length, 0,
"[remove features] layer has no features after remove");
t.ok(!strategy.features,
"[remove features] cluster has no cache after remove");
map.zoomIn();
t.eq(layer.features.length, 0,
"[remove features] layer has no features after zoom");
t.ok(!strategy.features,
"[remove features] cluster has no cache after zoom");
map.destroy();
}
function test_deactivate(t) {
t.plan(2);
var strategy = new OpenLayers.Strategy.Cluster();
var layer = new OpenLayers.Layer.Vector("Vector Layer", {
strategies: [strategy]
});
var map = new OpenLayers.Map('map');
map.addLayer(layer);
t.eq(strategy.active, true, "active after adding to map");
map.removeLayer(layer);
t.eq(strategy.active, false, "not active after removing from map");
}
</script>
</head>
<body>
<div id="map" style="width: 400px; height: 200px" />
</body>
</html>
|