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)。那么现在我们的平衡树在哪里呢,下次在写。


0 0
原创粉丝点击