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

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

  1. ESP8266 MP3制作——关于SelectionList从源码中改代码的一次经历

    SelectionList修改源码(这可能为扩展引脚提供一个新思路) 原因 上一篇文章已经提到了SelectionList的神奇功能,然后在setup中有这个一段代码: u8g2.begin(/* m ...

  2. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析

    这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...

  3. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

  4. Mysql定义DELETE操作触发器,将删除数据存入历史表

    Mysql定义DELETE操作触发器,将删除数据存入历史表 SQL如下: // An highlighted blockDELIMITER $$ CREATE TRIGGER <触发器名称> ...

  5. 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统

    剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...

  6. MXNET源码中NDArray数据的获取和打印

    虽然本人也很想写一个系列的分析文章,奈何水平不足,零零碎碎学到一点就写一点吧 本人是想学习MXNET的源码,首先想要添加一些打印,debug一下,第一个问题是如何在C++源码中打印出NDArray结构 ...

  7. 奥莉嘎!!!ArrayList源码中remove、removeAll、clear方法我又肝了一遍,收获良多

    前言 点赞在看,养成习惯. 点赞收藏,人生辉煌. 点击关注[微信搜索公众号:编程背锅侠],第一时间获得最新文章. 看源码血泪史 刚开始工作面试的时候,面试官经常问ArrayList源码相关的问题,基本 ...

  8. OpenCV源码中Haar训练及特征提取的代码说明

    //针对大小为winsize的图,计算所有HaarFeature的rect,存入features返回,即获取所有特征坐标 CvIntHaarFeatures* icvCreateIntHaarFeat ...

  9. 「从源码中学习」面试官都不知道的Vue题目答案

    前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...

最新文章

  1. HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
  2. 证明矩阵添加一列(行),则其秩或不变,或增加1
  3. trace分析优化器执行计划 || optimizer
  4. android ndk使用c 11,使用c 11 std :: async在android ndk中使用不完整类型无效
  5. Java自动化邮件中发送图表(一)
  6. python软件_Python自制照片美颜软件~
  7. httpServlet,java web后台服务
  8. Python super() 函数的用法及实例
  9. 高铁车厢女童突然抽搐 护士为防其咬舌将手指放口中
  10. 电脑开机出现奇怪字符_电脑开机出现Reboot and select proper boot device几种解决措施...
  11. java复选框互斥_jmu-Java-07多线程-互斥访问 (5分)
  12. python入门教程收藏_python入门教程:超详细保你2小时学会Python,快来收藏看看...
  13. 配置 iSQL*Plus
  14. UNIX 高级环境编程 第10章 信号
  15. 全国雾霾大数据,哪里才是桃花源?
  16. 自动跳动滑动门html,jQuery 滑动门自动滑动实现代码
  17. 【Godot】拖放的逻辑
  18. Java 程序员必会的「垃圾回收」算法
  19. 推荐一个logo免费设计的网站
  20. swift野梦抄袭 taylor_霉霉Taylor Swift今日出新单,歌词甜腻得让我联想到多年前的那位“野梦男主”!...

热门文章

  1. android 计算图片大小
  2. @程序员,对抗 996,你真的准备好了吗?| 文末有彩蛋
  3. android 设置字体为幼圆_怎么设置电脑字体为幼圆 电脑字体幼圆怎么设置
  4. 国外流行网上支付方式
  5. 服务器打不井根目录下的文件,服务器共享文件夹的使用方法.docx
  6. eclipse如何汉化
  7. 计算机类专业学习难度排行,全国33所名校计算机专业考研跨考难度系数排名
  8. 非对称加密和对称加密的优缺点
  9. 五大内存分区,堆与栈的区别
  10. JavaScript指定长度和进制的UUID