詳解SQL Server 2008空間數(shù)據(jù)類(lèi)型
SQL Server 2008為大地測(cè)量空間數(shù)據(jù)提供了geography數(shù)據(jù)類(lèi)型,為平面空間數(shù)據(jù)提供了geometry數(shù)據(jù)類(lèi)型。這兩個(gè)都是Microsoft .NET Framework通用語(yǔ)言運(yùn)行時(shí)(CLR)類(lèi)型,并且可以用來(lái)存儲(chǔ)不同種類(lèi)的地理元素,例如點(diǎn)、線(xiàn)和多邊形。這兩個(gè)數(shù)據(jù)類(lèi)型都提供了你可以用來(lái)執(zhí)行空間操作的屬性和方法,例如計(jì)算位置間的距離和找出兩者間交叉的地理特性(例如一條河流經(jīng)一個(gè)城鎮(zhèn)。)
geography 數(shù)據(jù)類(lèi)型
geography數(shù)據(jù)類(lèi)型為空間數(shù)據(jù)提供了一個(gè)由經(jīng)度和緯度聯(lián)合定義的存儲(chǔ)結(jié)構(gòu)。使用這種數(shù)據(jù)的典型用法包括定義道路、建筑、或者地理特性如可以覆蓋到一個(gè)光柵圖上的向量數(shù)據(jù),它考慮了地球的彎曲性,或者計(jì)算真實(shí)的圓弧距離和空中傳播軌道,而這些在一個(gè)平面模型中所存在的固有失真引起的錯(cuò)誤程度是不可接受的。
geometry數(shù)據(jù)類(lèi)型
geometry數(shù)據(jù)類(lèi)型為空間數(shù)據(jù)提供了一個(gè)存儲(chǔ)結(jié)構(gòu),它是由任意平面上的坐標(biāo)定義的。這種數(shù)據(jù)通常是用在區(qū)域匹配系統(tǒng)中的,例如由美國(guó)政府制定的州平面系統(tǒng),或者是不需要考慮地球彎曲性的地圖和內(nèi)層布置圖。
geometry 數(shù)據(jù)類(lèi)型提供了與開(kāi)放地理空間聯(lián)盟(OGC)Simple Features Specification for SQL標(biāo)準(zhǔn)結(jié)合的屬性和方法,使得你可以對(duì)geometry數(shù)據(jù)執(zhí)行操作以產(chǎn)生行業(yè)標(biāo)準(zhǔn)的行為。
空間數(shù)據(jù)類(lèi)型的方法
SQL Server 2008中的兩種空間數(shù)據(jù)類(lèi)型都提供了一組全面的實(shí)例和靜態(tài)方法,你可以使用它們對(duì)空間數(shù)據(jù)執(zhí)行查詢(xún)和操作。例如,下面的代碼示例為一個(gè)城市地圖應(yīng)用程序創(chuàng)建了兩個(gè)表;一個(gè)包含了城市中區(qū)的geometry值,另一個(gè)包含了城市中的街道的geometry 值。然后一個(gè)查詢(xún)獲得了城市中交叉的街道和區(qū)。
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
該查詢(xún)的結(jié)果如下表所示
|
|
|
|
First Avenue |
Downtown |
|
First Avenue |
Harborside |
|
Mercator Street |
Downtown |
|
Mercator Street |
Green Park |
|
Mercator Street |
Harborside |
高性能的空間數(shù)據(jù)
SQL Server 2008中的空間數(shù)據(jù)類(lèi)型作為CLR系統(tǒng)類(lèi)型來(lái)執(zhí)行。SQL Server 2008增加了數(shù)據(jù)庫(kù)中的CLR類(lèi)型的***規(guī)模,提高了原來(lái)在SQL Server 2005中的8000字節(jié)的限制,這使得它可以存儲(chǔ)非常復(fù)雜的空間數(shù)據(jù)元素,例如通過(guò)許多點(diǎn)定義的多邊形。
通過(guò)在關(guān)系表中存儲(chǔ)空間數(shù)據(jù),SQL Server 2008 使得可以結(jié)合空間數(shù)據(jù)到其他任何商業(yè)數(shù)據(jù)類(lèi)型中去;這消除了對(duì)維護(hù)一個(gè)單獨(dú)的只用于空間數(shù)據(jù)存儲(chǔ)的維護(hù)要求,并使得可以做高性能查詢(xún),它不需要結(jié)合從多個(gè)外部來(lái)源獲得的數(shù)據(jù)。
在SQL Server 2008中對(duì)空間索引的支持進(jìn)一步增強(qiáng)了對(duì)空間數(shù)據(jù)的查詢(xún)操作。你可以用一個(gè)集成在SQL Server數(shù)據(jù)庫(kù)引擎中的適合的多級(jí)網(wǎng)格索引來(lái)檢索空間數(shù)據(jù)。空間索引包含一個(gè)基于網(wǎng)格的層級(jí),在其中每一級(jí)索引又細(xì)分為由上一級(jí)所定義的網(wǎng)格區(qū)域。一個(gè)空間索引的概念模型如圖3所示。
圖3:一個(gè)空間索引
SQL Server查詢(xún)優(yōu)化器會(huì)作出基于成本的決策,決定對(duì)給定的查詢(xún)使用哪種索引,并且因?yàn)榭臻g索引是數(shù)據(jù)庫(kù)引擎的一個(gè)完整部分,可以作出關(guān)于是否使用特殊的空間索引的基于成本的決策,就像其它索引一樣。
【編輯推薦】



















