leaflet.layergroup.collision
Version:
Leaflet plugin for uncluttering L.Markers using basic collision detection.
165 lines (115 loc) • 3.42 kB
JavaScript
var N = 1000000,
maxFill = 16;
console.log('number: ' + N);
console.log('maxFill: ' + maxFill);
function randBox(size) {
var x = Math.random() * (100 - size),
y = Math.random() * (100 - size);
return [x, y,
x + size * Math.random(),
y + size * Math.random()];
}
function genData(N, size) {
var data = [];
for (var i = 0; i < N; i++) {
data.push(randBox(size));
}
return data;
}
var data = genData(N, 1);
var rbush = typeof require !== 'undefined' ? require('../rbush.js') : rbush;
var tree = rbush(maxFill);
console.time('insert one by one');
for (i = 0; i < N; i++) {
tree.insert(data[i]);
}
console.timeEnd('insert one by one');
// console.time('bulk load');
// tree.load(data);
// console.timeEnd('bulk load');
var bboxes100 = genData(1000, 100 * Math.sqrt(0.1));
console.time('1000 searches 10%');
for (i = 0; i < 1000; i++) {
tree.search(bboxes100[i]);
}
console.timeEnd('1000 searches 10%');
var bboxes10 = genData(1000, 10);
console.time('1000 searches 1%');
for (i = 0; i < 1000; i++) {
tree.search(bboxes10[i]);
}
console.timeEnd('1000 searches 1%');
var bboxes1 = genData(1000, 1);
console.time('1000 searches 0.01%');
for (i = 0; i < 1000; i++) {
tree.search(bboxes1[i]);
}
console.timeEnd('1000 searches 0.01%');
console.time('remove 1000 one by one');
for (i = 0; i < 1000; i++) {
tree.remove(data[i]);
}
console.timeEnd('remove 1000 one by one');
var data2 = genData(N, 1);
console.time('bulk-insert 1M more');
tree.load(data2);
console.timeEnd('bulk-insert 1M more');
console.time('1000 searches 1%');
for (i = 0; i < 1000; i++) {
tree.search(bboxes10[i]);
}
console.timeEnd('1000 searches 1%');
console.time('1000 searches 0.01%');
for (i = 0; i < 1000; i++) {
tree.search(bboxes1[i]);
}
console.timeEnd('1000 searches 0.01%');
// console.time('100 naive searches 1%');
// var result;
// for (var j = 0; j < 100; j++) {
// result = [];
// for (i = 0; i < N; i++) {
// if (tree._intersects(bboxes10[j], data[i])) {
// result.push(data[i]);
// }
// }
// }
// console.timeEnd('100 naive searches 1%');
var RTree = typeof require !== 'undefined' ? require('rtree') : RTree;
var tree2 = new RTree(maxFill);
function convertData(data) {
var result = [];
for (var i = 0; i < data.length; i++) {
result.push({x: data[i][0], y: data[i][1], w: data[i][2] - data[i][0], h: data[i][3] - data[i][1]});
}
return result;
}
var datab = convertData(data);
console.time('old RTree load one by one');
for (var i = 0; i < N; i++) {
tree2.insert(datab[i], i);
}
console.timeEnd('old RTree load one by one');
var bboxes100b = convertData(bboxes100);
console.time('1000 searches 10% 2');
for (i = 0; i < 1000; i++) {
tree2.search(bboxes100b[i]);
}
console.timeEnd('1000 searches 10% 2');
var bboxes10b = convertData(bboxes10);
console.time('1000 searches 1% 2');
for (i = 0; i < 1000; i++) {
tree2.search(bboxes10b[i]);
}
console.timeEnd('1000 searches 1% 2');
var bboxes1b = convertData(bboxes1);
console.time('1000 searches 0.01% 2');
for (i = 0; i < 1000; i++) {
tree2.search(bboxes1b[i]);
}
console.timeEnd('1000 searches 0.01% 2');
console.time('old RTree remove 1000 one by one');
for (var i = 0; i < 1000; i++) {
tree2.remove(datab[i], i);
}
console.timeEnd('old RTree remove 1000 one by one');