Microsoft SQL Server/地理空間資料
微軟在 2008 年釋出的 SQL Server 最終為 SQL Server 產品套件帶來了地理空間支援。
這允許將空間資料儲存在 SQL 表中(以點、線和多邊形的形式),以及一組函式來操作這些資料。還包括新的空間索引來支援這些函式的執行。
本書將使用一個示例資料庫作為其大多數示例的基礎。建立該資料庫的程式碼可以在附錄 A 中找到,應該按照那裡的說明執行,以便能夠在本書中使用示例程式碼。以下是該資料庫及其包含資料的簡要描述。如果您願意,可以跳過此部分,直接進入有趣的內容,在學習過程中找出資料庫的作用。
SQL Server 2008 支援兩種不同的空間資料型別:GEOMETRY 和 GEOGRAPHY。
- GEOMETRY - 此資料型別將資料儲存在投影平面表面中。
- GEOGRAPHY - 此資料型別將資料儲存在橢球模型中。
幾何類定義了一個層次結構,如下所示
從圖中我們可以看到,有七種可例項化的空間資料型別(橙色)。即
點是一個表示單個位置的物件。它始終具有 X 和 Y 座標,並且可以另外具有海拔 Z 和度量 M。
多點物件是點的集合。它與線串和多邊形不同,因為集合中的點之間沒有隱含的連線。因此,多點物件的邊界為空。
線串同樣是點的集合。但是,這與多點物件不同,因為點是有序的,線串物件還表示連線點的線段。
多線串只是線串的集合。
多邊形是表示二維表面的點的集合。多邊形可以包含一個外部環和多個內部環。為了使多邊形物件成為有效的例項,內部環不能交叉。
多邊形集合是多邊形的集合。
幾何集合是幾何(或地理)物件的集合。
-
點
-
多點
-
線串
-
多線串
-
多邊形
-
多邊形集合
-
幾何集合
資料可以從以下格式直接匯入 SQL Server:WKT、WKB 和 GML。有關這些格式的更多詳細資訊,請參閱附錄。
目前您無法直接執行此操作,將來版本是否會改變還有待觀察。如果您的資料在 shape 檔案或其他格式中,則需要找到一種方法進行轉換。有許多 Microsoft Spatial 合作伙伴提供工具,可以讓您執行此操作,但顯然這會涉及額外的許可費用。我相信隨著 SQL Server 2008 版本的釋出,免費版本將開始出現。目前,Morten Nielsen 在他的部落格上釋出了這樣一個免費工具 [[1]],Tillmann Eitelberg 在 CodePlex 上釋出了 MS-PL 下的 SSIS shape 檔案源 [[2]]。AutoConViz(由 Sugam Sharma、U Sunday Tim 和 Shashi Gadia 開發)還提供基於 GUI 的空間格式轉換(shape 檔案格式到 GML)作為其核心功能之一 [[3]]。
將空間資料匯入 SQL Server 2008 是透過 STxxxfromyyy 函式集來完成的,其中 xxx 可以是以下之一
- Geom - 用於匯入任何空間資料型別。
- Point - 用於匯入點資料。
- Line - 用於匯入線資料。
- Poly - 用於匯入多邊形資料。
- GeomColl - 用於匯入幾何集合。
- MPoint - 用於匯入多點資料。
- MLine - 用於匯入多線資料。
- MPoly - 用於匯入多邊形資料。
和 yyy 可以是
- Text - 用於匯入 WKT 格式的資料。
- WKB - 用於匯入 WKB 格式的資料。
- Gml - 用於匯入 GML 格式的資料。(注意 Gml 的大小寫,此函式缺少前導 ST,例如:GeomfromGml(.....))
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 51)', 0))
GO
- STRelate
- STDisjoint
- STIntersects
- STTouches
- STCrosses
- STWithin
- STContains
- STOverlaps
- STBuffer
- STConvexHull
- STIntersection
- STUnion
- STGeomFromText
- STPointFromText
- STLineFromText
- STPolyFromText
- STGeomFromWKB
- STPointFromWKB
- STLineFromWKB
- STPolyFromWKB
A. 示例資料庫程式碼
