轉
gis空間索引(有了思路**還不是手到擒來)
在介紹空間索引之前,先談談什麼叫「索引「。對乙個資料集做」索引「,是為了提高對這個資料集檢索的效率。書的」目錄「就是這本書內容的」索引「,當我們拿到一本新書,想檢視感興趣內容的時候,我們會先檢視目錄,確定感興趣的內容會在哪些頁裡,直接翻到那些頁,就ok了,而不是從第一章節開始翻,乙個字乙個字地找我們感興趣的內容,直到找到為止,這種檢索內容的效率也太低了,如果一本書沒有目錄,可以想象有多麼不方便…可見書的目錄有多重要,索引有多重要啊!
現在大家對索引有了感性認識,那什麼是「空間索引「呢?」空間索引「也是」索引「,是對空間圖形集合做的乙個」目錄「,提高在這個圖形集合中查詢某個圖形物件的效率。比如說,我們在乙個地圖圖層上進行矩形選擇,確定這個圖層上哪些圖元被這個矩形所完全包含呢,在沒有」空間索引「的情況下,我們會把這個圖層上的所有圖元,一一拿來與這個矩形進行幾何上的包含判斷,以確定到底哪些圖元被完全包含在這個矩形內。您是不是覺得這樣做很合理呢?其實不然,我們先看乙個網格索引的例子:
我們對這個點圖層作了網格索引,判斷哪些點在這個矩形選擇框內,是不需要把這個圖層裡所有的點都要與矩形進行幾何包含運算的,只對a,b,c,d,e,f,g這七個點做了運算。可以推想一下,如果乙個點圖層有十萬個點,不建立空間索引,任何地圖操作都將對整個圖層的所有圖元遍歷一次,也就是要for迴圈10萬次;建立索引將使得for迴圈的次數下降很多很多,效率自然提高很多!
呵呵…想必大家都知道空間索引的好處了,也不知不覺向大家介紹了點圖層的網格索引,還有哪些常用的空間索引呢?這些空間索引又該如何實現呢?帶著這樣的問題,下面介紹幾種常用的空間索引。
網格索引
網格索引就是在乙個地圖圖層上,按每個小網格寬△w,高△h打上均勻的格網,計算每個圖元所佔據的網格或者所經過的網格單元集合,
在這些網格單元中,記錄下圖元物件的位址或者引用,比如:宣告乙個物件二維陣列 list grid[m][n]; m代表網格的行數,n代表網格的列數,每個陣列元素為乙個「集合物件」,用於儲存這個網格單元所關聯的所有圖元的位址或引用,這樣網格索引就建立好了。下一步,我們該怎麼用這個網格索引呢?所有的圖形顯示和操作都可以借助於「空間索引」來提高效率。舉幾個例子來說明「空間索引「的使用:
一、 放大開窗顯示,正如上一節介紹的,當我們在地圖上畫乙個矩形想放大地圖的時候,首先得確定放大後的地圖在螢幕上需要顯示哪些圖元?所以,我們需要判斷這個地圖中有哪些圖元全部或者部分落在這個矩形中。判斷步驟:
1,確定所畫矩形左上角和右下角所在的網格陣列元素;即可得到這個矩形所關聯覆蓋的所有網格集合;
2,遍歷這個網格集合中的元素,取到每個網格元素list中所記錄的圖元;
3,畫出這些圖元即可。(當然整個過程涉及到兩點:1,螢幕座標和地圖座標的互相變換;2,視窗裁減,也可以不裁減)
二、 包含判斷,給出乙個點point和乙個多邊形polygon,判斷點是否在麵內,首先判斷這個點所在的網格,是否同時關聯這個polygon,如果不是,表明點不在麵內,如果是,可以下一步的精確解析幾何判斷,或者精度允許的情況下,即判斷polygon是包含point的。
另外,google map應該也是採用地理網格的方式,對地圖圖象進行索引的,可見一斑,網格索引在圖形顯示,選擇,拓撲判斷上的廣泛應用。但同時也存在很嚴重的缺陷:當被索引的圖元物件是線,或者多邊形的時候,存在索引的冗餘,即乙個線或者多邊形的引用在多個網格中都有記錄。隨著冗餘量的增大,效率明顯下降。所以,很多學者提出了各種方法來改進網格索引,這個將在下面的章節中介紹。而點圖元非常適合網格索引,不存在冗餘問題。
四叉樹索引(quadtree)
類似於前面介紹的網格索引,也是對地理空間進行網格劃分,對地理空間遞迴進行四分來構建四叉樹,本文將在普通四叉樹的基礎上,介紹一種改進的四叉樹索引結構。首先,先介紹乙個gis(geographic information system)或者計算機圖形學上非常重要的概念——最小外包矩形(mbr-minimum bounding rectangle):
最小外包矩形mbr就是包圍圖元,且平行於x,y軸的最小外接矩形。mbr到底有什麼用處呢,為什麼要引入這個概念呢?因為,圖元的形狀是不規則的,而mbr是平行於x,y軸的規則圖形,設想一下,如果所有的圖元都是平行於x,y軸的矩形,那針對這樣的矩形進行幾何上的任何判斷,是不是要簡單很多呢?不管我們人自己寫公式演算法或者編寫程式執行,是不是都要比原本複雜的圖形幾何運算要簡潔很多呢?答案很顯然。
然後,我們再介紹一下gis空間操作的步驟(這個步驟,在前面忘記向大家說明了,在這裡補充一下)
可見,過濾階段,通過空間索引可以排除掉一些明顯不符合條件的圖元,得到後選集合,然後對後選圖元集合進行精確幾何運算,得到最終結果。大家可能會有這樣的疑問,這樣有必要嗎?是不是反而把問題複雜化了?合適的空間索引只會提高計算機的效率,沒有空間索引,我們無疑要對集合中的每個圖元進行精確幾何運算,而這樣的運算是複雜的,是非常占用cpu的,所以需要空間索引,採取少量的記憶體和簡單的cup運算,來儘量減少那種高耗cup的精確運算的次數,這樣做是完全值得的。至於精確的幾何運算到底複雜在**,該如何進行精確的幾何運算,將在下面的章節中詳細描述,這裡主要介紹過濾階段的空間索引。
現在,讓我們來具體了解一下「四叉樹索引」。
四叉樹索引就是遞迴地對地理空間進行四分,直到自行設定的終止條件(比如每個節點關聯圖元的個數不超過3個,超過3個,就再四分),最終形成一顆有層次的四叉樹。圖中有數字標識的矩形是每個圖元的mbr,每個葉子節點儲存了本區域所關聯的圖元標識列表和本區域地理範圍,非葉子節點僅儲存了區域的地理範圍。大家可以發現,同樣存在乙個圖元標識被多個區域所關聯,相應地儲存在多個葉子節點上,比如「6「所代表的圖元,分別儲存在四個分枝上。這樣,就存在索引的冗餘,與網格索引存在同樣的弊端。下面我們介紹一種改進的四叉樹索引,或者說是分層的網格索引。
改進的四叉樹索引,就是為了避免這種空間索引的冗餘,基本改進思路是:讓每個圖元的mbr被乙個最小區域完全包含。
可以看出,3和13分別都跨越了兩個區域,要被乙個最小區域完全包含,就只能是根節點所代表的區域,2,5跨越了兩個區域,6跨越了四個區域,要被乙個最小區域完全包含,就只能是nw區域。怎麼判斷乙個圖元被哪個最小區域完全包含呢?從直觀上看,遞迴地對地理空間進行四分,如果圖元與乙個區域四分的劃分線相交,則這個圖元就歸屬於這個區域,或者直到不再劃分了,那就屬於這個不再劃分的區域。呵呵。。。可能有點繞口,看圖,結合「最小」「完全包含」這兩個字眼,您就明白了。這顆四叉樹中,圖元的標識不再僅僅儲存在葉子節點上,而是每個節點都有可能儲存,這樣也就避免了索引冗餘。同時每個節點儲存本節點所在的地理範圍。
有了四叉樹索引,下面又該如何利用這顆樹來幫助檢索查詢呢?還是矩形選擇為例吧!(為什麼我總是拿這個例子來說事呢?因為這個例子簡單,容易理解,有代表性!)我們在地圖上畫乙個矩形,判斷地圖上哪些圖元落在這個矩形裡或者和這個所畫矩形相交。方法很多,這裡介紹一種簡單的檢索步驟,如下:
1,首先,從四叉樹的根節點開始,把根節點所關聯的圖元標識都加到乙個list裡;
2,比較此矩形範圍與根節點的四個子節點(或者叫子區域)是否有交集(相交或者包含),如果有,則把相應的區域所關聯的圖元標識加到list集合中,如果沒有,則以下這顆子樹都不再考慮。
3,以上過程的遞迴,直到樹的葉子節點終止,返回list。
4,從list集合中根據標識一一取出圖元,先判斷圖元mbr與矩形有無交集,如果有,則進行下面的精確幾何判斷,如果沒有,則不再考慮此圖元。(當然,這裡只說了乙個基本思路,其實還有其他一些不同的方法,比如,結合空間資料磁碟的物理儲存會有一些調整)
總結:改進的四叉樹索引解決了線,面物件的索引冗餘,具有較好的效能,而被大型空間資料庫引擎所採用,如arcsde,oracle spatial等,同時這種結構也適用於空間資料的磁碟索引,配合空間排序聚類,基於分形的hilbert演算法資料組織,將在空間資料格式的定義中發揮重要作用。
sylar mail: [email protected]
GIS空間索引技術
常用的空間索引技術介紹和比較 網格空間索引 四叉樹空間索引和r樹系列空間索引最為常見。目前國內外主要的空間資料庫也大都採用網格空間索引 四叉樹 與 r樹 這三類的空間索引結構。如著名的oracle公司的資料庫則同時採用 四叉樹和r樹兩種索引結構。1。空間索引技術的發展和分類 以傳統的索引技術觀點來看...
GIS 空間分析(9)
歐式距離 在 gis 中距離可以表示為歐氏距離和成本距離。歐氏距離是量測源與目標之間的直線距離,而成本距離量測的是源與目標之間穿越歐氏距離的耗費。例如,卡車司機對穿越一條路徑的時間和燃料耗費比它的歐氏距離更感興趣。在這種情況下,成本距離不僅與自然距離有關,還與限速和路況有關,在後面章節中將詳細講述成...
GIS 空間分析(20)
找出某種珍貴藥材的生長區域 1.背景 某種珍貴藥材生長於山區,通過研究了解到這種藥材生長具有嚴格的生長條件,為了能更好地保護該藥材的生長環境,現在需要使用gis空間分析方法,將藥材適合生長區域找出來,以便為該五中保護提供依據 2.資料 山區等高線資料contour.shp 山區觀測點採集的年平均溫度...