詳解SQL Server 2008空間數據類型
SQL Server 2008為大地測量空間數據提供了geography數據類型,為平面空間數據提供了geometry數據類型。這兩個都是Microsoft .NET Framework通用語言運行時(CLR)類型,并且可以用來存儲不同種類的地理元素,例如點、線和多邊形。這兩個數據類型都提供了你可以用來執行空間操作的屬性和方法,例如計算位置間的距離和找出兩者間交叉的地理特性(例如一條河流經一個城鎮。)
geography 數據類型
geography數據類型為空間數據提供了一個由經度和緯度聯合定義的存儲結構。使用這種數據的典型用法包括定義道路、建筑、或者地理特性如可以覆蓋到一個光柵圖上的向量數據,它考慮了地球的彎曲性,或者計算真實的圓弧距離和空中傳播軌道,而這些在一個平面模型中所存在的固有失真引起的錯誤程度是不可接受的。
geometry數據類型
geometry數據類型為空間數據提供了一個存儲結構,它是由任意平面上的坐標定義的。這種數據通常是用在區域匹配系統中的,例如由美國政府制定的州平面系統,或者是不需要考慮地球彎曲性的地圖和內層布置圖。
geometry 數據類型提供了與開放地理空間聯盟(OGC)Simple Features Specification for SQL標準結合的屬性和方法,使得你可以對geometry數據執行操作以產生行業標準的行為。
空間數據類型的方法
SQL Server 2008中的兩種空間數據類型都提供了一組全面的實例和靜態方法,你可以使用它們對空間數據執行查詢和操作。例如,下面的代碼示例為一個城市地圖應用程序創建了兩個表;一個包含了城市中區的geometry值,另一個包含了城市中的街道的geometry 值。然后一個查詢獲得了城市中交叉的街道和區。
CREATE TABLE Districts( DistrictId int IDENTITY (1,1),
DistrictName nvarchar(20),
DistrictGeo geometry);
GO
CREATE TABLE Streets
( StreetId int IDENTITY (1,1),
StreetName nvarchar(20),
StreetGeo geometry);
GO
INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Downtown',
geometry::STGeomFromText
('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Green Park',
geometry::STGeomFromText
('POLYGON ((300 0, 150 0, 150 150, 300 150, 300 0))', 0));
INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Harborside',
geometry::STGeomFromText
('POLYGON ((150 0, 300 0, 300 300, 150 300, 150 0))', 0));
INSERT INTO Streets (StreetName, StreetGeo)
VALUES ('First Avenue',
geometry::STGeomFromText
('LINESTRING (100 100, 20 180, 180 180)', 0))
GO
INSERT INTO Streets (StreetName, StreetGeo)
VALUES ('Mercator Street',
geometry::STGeomFromText
('LINESTRING (300 300, 300 150, 50 50)', 0))
GO
SELECT StreetName, DistrictName
FROM Districts d, Streets s
WHERE s.StreetGeo.STIntersects(DistrictGeo) = 1
ORDER BY StreetName
該查詢的結果如下表所示
|
|
First Avenue |
Downtown |
First Avenue |
Harborside |
Mercator Street |
Downtown |
Mercator Street |
Green Park |
Mercator Street |
Harborside |
高性能的空間數據
SQL Server 2008中的空間數據類型作為CLR系統類型來執行。SQL Server 2008增加了數據庫中的CLR類型的***規模,提高了原來在SQL Server 2005中的8000字節的限制,這使得它可以存儲非常復雜的空間數據元素,例如通過許多點定義的多邊形。
通過在關系表中存儲空間數據,SQL Server 2008 使得可以結合空間數據到其他任何商業數據類型中去;這消除了對維護一個單獨的只用于空間數據存儲的維護要求,并使得可以做高性能查詢,它不需要結合從多個外部來源獲得的數據。
在SQL Server 2008中對空間索引的支持進一步增強了對空間數據的查詢操作。你可以用一個集成在SQL Server數據庫引擎中的適合的多級網格索引來檢索空間數據。空間索引包含一個基于網格的層級,在其中每一級索引又細分為由上一級所定義的網格區域。一個空間索引的概念模型如圖3所示。
圖3:一個空間索引
SQL Server查詢優化器會作出基于成本的決策,決定對給定的查詢使用哪種索引,并且因為空間索引是數據庫引擎的一個完整部分,可以作出關于是否使用特殊的空間索引的基于成本的決策,就像其它索引一樣。
【編輯推薦】