Microsoft SQL Server 2008 提供了全面性的空間支持,可讓組織通過具有空間功能的應用程序來無縫地取用、使用及擴展以位置為基礎的數據,最後協助用戶做出更好的決策。本篇文章著重介紹的是空間索引的概念微軟SQL Server 2008空間索引的應用。
一、空間索引
空間索引是指依據空間對象的位置和形狀或空間對象之間的某種空間關系按一定的順序排列的一種數據結構,其中包含空間對象的概要信息。作為一種輔助性的空間數據結構,空間索引介於空間操作算法和空間對象之間,它通過篩選作用,大量與特定空間操作無關的空間對象被排除,從而提高空間操作的速度和效率。
來至百科的定義:為便於空間目標的定位及各種空間數據操作,按要素或目標的位置和形狀或空間對象之間的某種空間關系來組織和存儲數據的結構。
關於更多空間索引的知識點需要深入了解EPSG和SRID,本文主要介紹基於微軟SQL Server 2008的空間數據特性實現介紹,故不詳細介紹這些基礎理論知識點,有興趣的可以訪問文末的推薦資料鏈接,了解更多關於EPSG核SRID的相關知識。
SQL Server 2008中的空間數據類型作為CLR系統類型來執行。SQL Server 2008增加了數據庫中的CLR類型的最大規模,提高了原來在SQL Server 2005中的8000字節的限制,這使得它可以存儲非常復雜的空間數據元素,例如通過許多點定義的多邊形。通過在關系表中存儲空間數據,SQL Server 2008 使得可以結合空間數據到其他任何商業數據類型中去;這消除了對維護一個單獨的只用於空間數據存儲的維護要求,並使得可以做高性能查詢,它不需要結合從多個外部來源獲得的數據。
在SQL Server 2008中對空間索引的支持進一步增強了對空間數據的查詢操作。你可以用一個集成在SQL Server數據庫引擎中的適合的多級網格索引來檢索空間數據。空間索引包含一個基於網格的層級,在其中每一級索引又細分為由上一級所定義的網格區域。下圖為官方給出的一個空間索引的概率模型圖:
SQL Server查詢優化器會作出基於成本的決策,決定對給定的查詢使用哪種索引,並且因為空間索引是數據庫引擎的一個完整部分,可以作出關於是否使用特殊的空間索引的基於成本的決策,就像其它索引一樣。
二、SQL Server 2008的空間參考系統
微軟SQL Server 2008的空間系統表(實際上是一個系統視圖)"sys.spatial_reference_systems"中存儲了詳細的支持所有大地測量空間參考系統標准,該表中的每一行數據對應於一個唯一的空間參考系統,可以基於這些空間參考系統在SQL Server 2008中來定義任何形式的空間數據。
系統表“sys.spatial_reference_systems”中實際上僅僅只是存儲了應用於SQL Server 2008中地理參照坐標的參考系統,除了空間參考系統可以使用這張表中列出的參考系統標准,也可以基於這些標准來定義基於任何地理投影的空間數據。
三、空間參照文本格式(WKT)
Well-Known Text (WKT) Representation of Spatial Reference Systems:顧名思義用眾所周知的文字形式來描述看見坐標參考系統,它與EPSG(2005年已經換名)的坐標文字表述模型一致。WKT字符串應用於確定空間參考系統的組成部分的描述,其定義主要包含以下10項內容:
1、一個總體的坐標系名
2、一個地理圖形坐標系統名
3、一個基准面定義
4、一個橢球體的名字。長半軸(semi-major axis)和反扁率(inverse flattening)
5、本初子午線(prime meridian)名和其與格林威治子午線的偏移值
6、投影方法類型(如橫軸莫卡托)
7、投影參數列表(如中央經線等)
8、一個單位的名稱和其到米和弧度單位的轉換參數
9、軸線的名稱和順序
10、在預定義的權威坐標系中的編碼(如EPSG)
- select well_known_text
- from sys.spatial_reference_systems
- where authorized_spatial_reference_id=4326
- and authority_name='EPSG'
基於sys.spatial_reference_systems表定義了多種不同的空間參照系統的WKT描述,如上SQL語句查詢出的是我們平時在地圖應用開發中使用最多的EPSG:4326空間參照系統標准,則對於的WKT如下:
- GEOGCS["WGS 84",
- DATUM["World Geodetic System 1984",
- ELLIPSOID["WGS 84", 6378137, 298.257223563]],
- PRIMEM["Greenwich", 0],
- UNIT["Degree", 0.0174532925199433]
- ]
以上KWT字符串確定了EPSG:4326空間參照系統的組成部分元素描述,其主要使用了四種空間配置,分別為:基准(Datum)、橢圓(Ellipsoid)、本初子午線(Primem)和Unit(計量單位)。關於這些空間參考系統參數在上一篇文中中介紹過,這裡就不在做重復介紹,以上KWT字符串表述的意思大致是這樣的:“WGS 84坐標系,采用1984年訂立的世界地理坐標系統標准,地理標准半徑為:6378137........”。
四、SQL Server 2008的空間索引
SQL Server 2008 引入了對空間數據和空間索引的支持。“空間索引”是一種擴展索引,允許您對空間列編制索引。空間列是包含空間數據類型(如 geometry 或 geography)數據的表列。本節中的主題介紹了空間索引。
在 SQL Server 2008 中,空間索引(存儲在:sys.spatial_indexes表中)使用 B 樹構建而成,也就是說,這些索引必須按 B 樹的線性順序表示二維空間數據。因此,將數據讀入空間索引之前,SQL Server 2008 先實現對空間的分層均勻分解。索引創建過程會將空間分解成一個四級“網格層次結構”。這些級別指的是“第 1 級”(頂級)、“第 2 級”、“第 3 級”和“第 4 級”。
每個後續級別都會進一步分解其上一級,因此上一級別的每個單元都包含下一級別的整個網格。在給定級別上,所有網格沿兩個軸都有相同數目的單元(例如 4x4 或 8x8),並且單元的大小都相同。下圖顯示了網格層次結構每個級別的右上角單元被分解成 4x4 網格的情況。事實上,所有單元都是以這種方式分解的。因此,以此為例,將一個空間分解成四個級別的 4x4 網格際上會總共產生 65,536 個第四級單元。針對空間索引進行的空間分解與應用程序數據使用的度量單位無關。
網格層次結構的單元是利用多種 Hilbert 空間填充曲線以線性方式編號的。然而,出於演示目的,這裡使用的是簡單的按行編號,而不是由 Hilbert 曲線實際產生的編號。在下圖中,幾個表示建築物的多邊形和表示街道的線已經放進了一個 4x4 的 1 級網格中。第 1 級單元的編號為 1 到 16,編號從左上角的單元開始。
沿網格軸的單元數目確定了網格的“密度”:單元數目越大,網格的密度越大。例如,8x8 網格(產生 64 個單元)的密度就大於 4x4 網格(產生 16 個單元)的密度。網格密度是以每個級別為基礎定義的。網格配置單元數目低 :4X4 =16,中8X8 = 64,高16X16 =256,默認設置所有級別都為 中。
您可以通過指定非默認的網格密度控制分解過程。例如,在不同級別指定不同網格密度對於基於索引空間的大小和空間列中的對象來優化索引可能非常有用。空間索引的網格密度顯示在 sys.spatial_index_tessellations 目錄視圖的 level_1_grid、level_2_grid、level_3_grid 和 level_4_grid 列中。
將索引空間分解成網格層次結構後,空間索引將逐行讀取空間列中的數據。讀取空間對象(或實例)的數據後,空間索引將為該對象執行“分割過程”。分割過程通過將對象與其接觸的網格單元集(“接觸單元”)相關聯使該對象適合網格層次結構。從網格層次結構的第 1 級開始,分割過程以“廣度優先”方式對整個級別進行處理。在可能的情況下,此過程可以連續處理所有四個級別,一次處理一個級別。
注:以上內容截取SQL Server 2008幫助文檔,詳細請查看聯機幫助文檔。
五