面空間數據中網格索引和四叉樹索引的結合及優化的一種方案

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/html

1.背景

針對判斷一個點落在面圖層中哪一個要素上的需求,在我以前的博客:WebGIS中一種根據網格索引判斷點面關係的方法http://www.cnblogs.com/naaoveGIS/p/5148185.html)中有詳細的描述。其原理大體爲:算法

            

其處理步驟爲:緩存

                    

2.當前網格索引的幾個缺點

a.網格索引方案分爲了一個索引文件和一個數據文件,任何請求進入時均會先讀取索引文件,再讀取數據文件,那麼很容易出現資源爭搶狀況,不利於併發支持。微信

b.網格的大小會嚴重影響到查詢效率,可是若是網格創建的足夠小,那麼索引文件不斷增大,一樣會致使磁盤尋址花費的時間增多。併發

c.數據的讀取必定要通過兩次IO,一次讀索引,一次讀數據,會影響讀取效率。優化

3.方案的優化,基於網格索引的索引四叉樹劃分

四叉樹、R樹等均是空間索引經常使用的算法,這裏我選擇使用四叉索引來進行進一步優化。四叉樹索引原理很是簡單,即將一個範圍根據深度,不斷平分,如圖所示:spa

                    

這裏優化思路是:將要素首先進行四叉樹平分,而後對每一個葉子節點包含的範圍再進行網格索引生成:指針

           

4.優化方案的詳細描述

4.1索引的生成步驟

a.首先生成數據文件。htm

b.經過設置的四叉樹深度,算出葉子節點的個數。而後經過獲取到的要素四角座標,算出葉子節點的四角範圍:leafminx、leafminy、leafmaxx、leafmaxy。blog

c.根據要素個數和網格因子,算出整個範圍內網格的個數,用整個範圍的四角座標與網格因子計算,得出一個網格的BlockXsize和BlokcYsize。

d.針對每一個葉子節點,創建該節點的網格索引,索引中包含了網格與要素的對應關係。

生成文件截圖:

                       

4.2數據讀取

a.讀取配置獲取到要素的四角範圍mapminx、mapminy、mapmaxx、mapmaxy、leafgeoxsize、leafgeoysize。

b.經過mapminx、mapminy、leafgeoxsize、leafgeoysize參數算出該XY座標所在的網格索引編號。

c.讀取該網格索引,獲取到該索引的leafminx、leafminy、leafmaxx、leafmaxy、blockxsize、blockysize。

d.經過leafmaxx、leafmaxy以及blockxsize、blockysize算出XY所在網格索引的字節位置pos,將磁盤指針移動至該pos處。

e.獲取到索引中包含的要素信息,好比要素所在的數據文件中的datapos。

f.讀取數據文件,在該文件的datapos處將詳細信息讀取返回。

5.方案優勢總結

a.將一個大索引文件分紅多個索引文件,在大量隨機點併發訪問時,能夠將壓力負載至各文件上,減小同一文件讀取時的資源爭搶IO瓶頸。

b.每個索引文件大小大大減少,讀取會更快,磁盤尋址也會更快。

c.爲增長網格命中單個(非多個)要素的機率,能夠將每一個網格的大小進一步縮小,其致使的網格索引增大會平攤至每一個網格索引上,從而使反作用變小。

6.進一步優化

a.在讀取索引基本信息後能夠將該信息緩存至內存中,減小Config文件的IO次數。

b.生成索引時,若是一個網格只包含了一個要素的信息,能夠將該信息也整合至網格索引中。這樣,查詢時,若是查詢到的網格只包含單個要素,則能夠直接在索引中將要素信息獲取,而不須要再對數據索引作讀取操做,減小對數據索引的IO次數。

                                                                         -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                             若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                                                                                           

相關文章
相關標籤/搜索