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>
|