GIS是怎樣建成的系列之二:圖形,圖形,我們去哪裏呀(四叉樹部分)

      經過上一篇文章我們已經有了建立一個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)。那麼現在我們的平衡樹在哪裏呢,下次在寫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章