openlayers中使用rBush(R树)来存放要素等信息,本文修改了一点其中的rbush源码中的demo,使用canvas画出了insert和delete操作(建立树和删除树中数据)

openlayers中使用rBush(R树)来存放要素等信息,本文修改了一点其中的rbush源码中的demo,使用canvas画出了insert和delete操作(建立树和删除树中数据)

修改后的源代码下载链接:https://download.csdn.net/download/Handsome2013/12033762

其中r树源码:https://github.com/mourner/rbush这个就是ol中用到的rbush源码。

这边只是修改了点example.

1.下载了源码目录如下:(我是使用webStrom打开的)

2.主要修改了viz.js和viz-uniform.html两个文件。

viz-uniform.html:

<!doctype html>

<title>RBush Tree Visualization</title>
<canvas id="canvas" width="701" height="701"></canvas>
<br>
<button id="insert1">Insert 50000</button>
<button id="insert2">Insert 1</button>
<button id="delete">Delete 1</button>
<button id="insert3">Bulk-insert 50000</button>
<button id="insert4">Bulk-insert 1000</button>
<button id="remove">Remove leftmost 10000</button>

<script src="../index.js"></script>
<script src="viz.js"></script>
<script>

    var N = 0;
    function genData(N) {
        var data = [];
        for (var i = 0; i < N; i++) {
            data[i] = randBox(1);
        }
        return data;
    }
    var tree = new RBush(6);
    var data = [];
    genBulkInsert(N)();
    function genInsertOneByOne(K) {
        return function () {
            var data2 = genData(K);
            console.time('insert ' + K + ' items');
            for (var i = 0; i < K; i++) {
                tree.insert(data2[i]);
            }
            console.timeEnd('insert ' + K + ' items');
            data = data.concat(data2);
            draw();
        };
    }
    function genBulkInsert(K) {
        return function () {
            var data2 = genData(K);
            console.time('bulk-insert ' + K + ' items');
            tree.load(data2);
            console.timeEnd('bulk-insert ' + K + ' items');
            data = data.concat(data2);
            console.log('data' + data);
            draw();
        };
    }
    function deleteOne(K) {
        //随机选择一个
        return function () {
            var index = Math.floor(data.length * Math.random())
            var randomNode = data[index];
            tree.remove(randomNode)
            data.splice(index, 1)
            draw();
        }
    }
    document.getElementById('insert1').onclick = genInsertOneByOne(50000);
    document.getElementById('insert2').onclick = genInsertOneByOne(1);
    document.getElementById('delete').onclick = deleteOne();
    document.getElementById('insert3').onclick = genBulkInsert(50000);
    document.getElementById('insert4').onclick = genBulkInsert(1000);
    document.getElementById('canvas').onclick = search;
    document.getElementById('remove').onclick = remove;

</script>

 

viz.js:

var W = 650,
    canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d');

if (window.devicePixelRatio > 1) {
    canvas.style.width = canvas.width + 'px';
    canvas.style.height = canvas.height + 'px';
    canvas.width = canvas.width * 2;
    canvas.height = canvas.height * 2;
    ctx.scale(2, 2);
}

function randBox(size) {
    var x = Math.random() * W,
        y = Math.random() * W;
    return {
        minX: x,
        minY: y,
        maxX: x + 10,
        maxY: y + 10
    };
}

function randClusterPoint(dist) {
    var x = dist + Math.random() * (W - dist * 2),
        y = dist + Math.random() * (W - dist * 2);
    return {x: x, y: y};
}

function randClusterBox(cluster, dist, size) {
    var x = cluster.x - dist + 2 * dist * (Math.random() + Math.random() + Math.random()) / 3,
        y = cluster.y - dist + 2 * dist * (Math.random() + Math.random() + Math.random()) / 3;

    return {
        minX: x,
        minY: y,
        maxX: x + size * Math.random(),
        maxY: y + size * Math.random(),
        item: true
    };
}

   var  rects=[];

function drawTree(node, level) {
    if (!node) {
        return;
    }
    var rect = [];
    var color;
    if (level == 0) {
        color = 'red'
    } else if (level == 1) {
        color = 'blue'
    } else if (level == 2) {
        color = 'orange'
    } else if (level == 3) {
        color = 'black'
    } else if (level = 4) {
        color = 'green'
    } else if (level == 5) {
        color = 'purple'
    } else if (level = 6) {
        color = 'pink'
    } else {
        color = 'yellow'
    }
    rect.push(color);
    rect.push(1);
    rect.push([
        Math.round(node.minX),
        Math.round(node.minY),
        Math.round(node.maxX - node.minX),
        Math.round(node.maxY - node.minY),
    ]);
    rects.push(rect);
    if (node.children.length > 1) {
        for (var ii = 0; ii < node.children.length; ii++) {
            var rect2 = [];
            rect2.push('black');
            rect2.push(1);
            rect2.push([
                Math.round(node.children[ii].minX),
                Math.round(node.children[ii].minY),
                Math.round(node.children[ii].maxX - node.children[ii].minX),
                Math.round(node.children[ii].maxY - node.children[ii].minY)
            ])
            rects.push(rect2);
        }
    }
    if (node.leaf) return;
    if (level === 6) {
        return;
    }
    for (var i = 0; i < node.children.length; i++) {
        drawTree(node.children[i], level + 1);
    }
}

function draw() {
    rects = [];
    drawTree(tree.data, 0);

    ctx.clearRect(0, 0, W + 11, W + 11);

    for (var i = rects.length - 1; i >= 0; i--) {
        ctx.strokeStyle = rects[i][0];
        ctx.globalAlpha = rects[i][1];
        ctx.strokeRect.apply(ctx, rects[i][2]);
    }
}

function search(e) {
    console.time('1 pixel search');
    tree.search({
        minX: e.clientX,
        minY: e.clientY,
        maxX: e.clientX + 1,
        maxY: e.clientY + 1
    });
    console.timeEnd('1 pixel search');
}

function remove() {
    data.sort(tree.compareMinX);
    console.time('remove 10000');
    for (var i = 0; i < 10000; i++) {
        tree.remove(data[i]);
    }
    console.timeEnd('remove 10000');

    data.splice(0, 10000);

    draw();
};

3.展示到网页如下:

修改后的源代码下载链接:https://download.csdn.net/download/Handsome2013/12033762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值