文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1.背景
針對判斷一個點落在面圖層中哪個要素上的需求,在我之前的博客:WebGIS中一種根據網格索引判斷點面關系的方法(http://www.cnblogs.com/naaoveGIS/p/5148185.html)中有詳細的描述。其原理大致為:
其處理步驟為:
2.當前網格索引的幾個缺點
a.網格索引方案分為了一個索引文件和一個數據文件,任何請求進入時均會先讀取索引文件,再讀取數據文件,那么很容易出現資源爭搶情況,不利於並發支持。
b.網格的大小會嚴重影響到查詢效率,但是如果網格建立的足夠小,那么索引文件不斷增大,同樣會導致磁盤尋址花費的時間增多。
c.數據的讀取一定要經過兩次IO,一次讀索引,一次讀數據,會影響讀取效率。
3.方案的優化,基於網格索引的索引四叉樹划分
四叉樹、R樹等均是空間索引常用的算法,這里我選擇使用四叉索引來進行進一步優化。四叉樹索引原理非常簡單,即將一個范圍根據深度,不斷平分,如圖所示:
這里優化思路是:將要素首先進行四叉樹平分,然后對每個葉子節點包含的范圍再進行網格索引生成:
4.優化方案的詳細描述
4.1索引的生成步驟
a.首先生成數據文件。
b.通過設置的四叉樹深度,算出葉子節點的個數。然后通過獲取到的要素四角坐標,算出葉子節點的四角范圍:leafminx、leafminy、leafmaxx、leafmaxy。
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/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^