GIS是怎样建成的系列之二:图形,图形,我们去哪里呀(四叉树部分)
来源:互联网 发布:苹果mac用户名怎么改 编辑:程序博客网 时间:2024/05/02 17:19
经过上一篇文章我们已经有了建立一个GIS系统最基础的基石——图形。好了,数据定义好了之后我们该怎么管理数据呢,第一个想到的是我们会怎么查到自己的数据。刚入门的时候,本菜鸟觉着那是再简单不过的事了,给你一张世界地图,找到中国,你不一眼就看出来了吗?此言大谬也,因为你没搞清楚你交给任务的对象是一台计算机,一个头脑简单四肢发达的家伙,你得手把手从最基础的流程教它。后来会了写一点基本程序,想想还是简单,查找嘛,无非就是一个一个找过去,看看哪个对呗?要不说人得学习呢,读了《数据结构》,发现“哦,数据是可以这样查的”,读了计算几何,发现“哦,原来图形数据也是可以这样查的”,看了NTS发现,现实中的图形查找是这么玩的。
好吧,那我们看看NTS怎么做。NTS关于查找方面的功能在Index命名空间下,顾名思义就是空间索引。当年学GIS原理的时候,空间索引好多了,落实到NTS里面,实现了其中的四叉树、静态R树和kd树。
我们先从其中的四叉树说起。四叉树的原理就是四分四分再四分,理解四叉树我们可以想象一个你去一个有四家子公司的大公司报道。总公司一看,你的职位完全属于某一家公司管,就和你说:“小王啊,你就去我们旗下这家子公司报道吧”。你到了子公司,发现它又是一家有四家子公司的公司,经理一看,到我子公司呆着足以,于是又让你去了某个子公司。直到某个子公司感觉再让你去子公司镇不住你了。于是就只好说,“小王啊,你就在这里好好干吧”。四叉树就是这个原理,一个图形,如果它的Envelope(这时看出Envelope的作用了吧)完全属于以它为空间的某一个象限,那则将图形交给子树,直到它在子空间不能完全容下其为止。于是乎,作为节点,需要记录几个基本的信息,第一、四个子树。第二、自己维护的图形列表。
那么,如何查呢?我们查找的时候通常都是以一个截窗的形式,这个截窗本来就是个Envelope,首先得查这个Envelope在哪。这个流程和建树的时候一样。因为只有定位到窗口所在的空间里面才有可能有所需要的图形。定位到空间之后呢,则首先查当前节点里面的图形列表,并依此作相交测试,将相交结果放入检测结果。然后对与Envelope有交集的子节点中的图形,直到遍历完成。
当然,在NTS里面,还实现了Insert,remove的操作。核心过程就是查找加相应操作,这里就不赘述了,有兴趣的朋友去源码那遛一遛吧。在这里呢,给出一个quadtree的类关系图。
好了,这样,基本的四叉树就出来了。那么,这里就有几个问题,至少是我最早接触这种数据结构的疑惑——1.为什么是四叉?其实答案特简单。第一,空间的特点。数据结构里面用二叉排序树,为什么?因为对象是线性结构。这种空间可以通过无限二分得到自相似的子空间。同样,在二维空间变成了四叉树,在三维空间变成了八叉树。2.也就是一开始的问题,遍历查找不好吗?原因学过数据结构的童鞋都能背出来,效率嘛,从O(n)到O(logn)。然而时间复杂性这种东西,当你写代码处理10条数据,没有在数据处理的切肤之痛是体会不出来的,而且读书的时候看这么个数字从来没感觉,只有用的时候才发现那是瞬间与永远的差别。n等于1亿时,在logn中也不过一二十而已。回过头来,四叉树真能保证O(logn)?非也。它的作用就像二叉排序树,在极端状况下退化为O(n)。那么现在我们的平衡树在哪里呢,下次在写。
- GIS是怎样建成的系列之二:图形,图形,我们去哪里呀(四叉树部分)
- GIS是怎样建成的之三:图形,图形,我们去哪里呀(区域树部分)
- GIS是怎样建成的系列之一:从图形开始
- GIS是怎样建成的之五:瓦片(Tile)
- GIS是怎样建成的之四:gdal\ogr以及provider
- 系统是怎样建成的
- 1.小网站是怎样建成的
- 1.3 窗口是怎样建成的
- OpenGL(二)图形绘制之平面多面体的绘制
- 软工之文档图形(二)
- 如何判断用paint画出的图形的坐标是在哪里?
- Warcraft是怎样炼成的(二):我们是一个团队
- 我们的时间去了哪里?
- Android:图形(二)
- 五子棋游戏程序(二.图形接口部分)
- Android的图形API调用(二)
- 儋州洋浦大桥建成,我们很是开心.未来3年会变成怎样.我们司马见
- android 图形系统加速学习系列 (二)
- 投资损失
- Linux下搭建Android开发环境
- Linux 终端设备驱动整体框架(1)
- C# 打开指定路径下文件
- Android中的DatePicker和AutoCompleteTextView
- GIS是怎样建成的系列之二:图形,图形,我们去哪里呀(四叉树部分)
- 颜色特征的提取
- Eclipse无提示的解决办法!
- QSORT SORT 区别
- win7、vs2013编译webkit总结
- 杭州封杀嘀嘀、快的打车的加价功能
- AT指令(中文详解版)二
- Apache Spark - Cluster Mode Overview (Spark集群模式一览)
- ubuntu oracle安装