SQL Server 2008空間數(shù)據(jù)應(yīng)用系列四:基礎(chǔ)空間對象與函數(shù)應(yīng)用
微軟SQL Server 2008中支持的7種基礎(chǔ)空間對象實(shí)例,分別為:點(diǎn)(Point)、點(diǎn)集合(MultiPoint )、線(LineString)、線集合(MultiLineString)、多邊形(Polygon )、多邊形集合(MultiPolygon)和空間集合(GeometryCollection)。
一、點(diǎn)(Point)
在 SQL Server 空間數(shù)據(jù)中,Point 是表示單個位置的零維對象,可能包含 Z(仰角)和 M(度量)值??梢酝ㄟ^下面SQL創(chuàng)建一個點(diǎn)的示例,默認(rèn)該點(diǎn)的SRID(空間引用標(biāo)識)為0。
- DECLARE @p geometry;
- SET @p = geometry::Parse('POINT(30.6666587469201 104.062021177233)');
- select @p.STX AS X;
- select @p.STY AS Y;
如下SQL命令這創(chuàng)建了包含 Z(仰角)和 M(度量)值的點(diǎn)(Point)實(shí)例,其中 Z(仰角)和 M(度量)值可以顯示的指定為“null”。
- DECLARE @g geometry;
- SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 15 3.5)');
- --SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 null null)');
- select @g.STX AS X
- select @g.STY AS Y
- select @g.Z as Z
- select @g.M as M
二、點(diǎn)集合(MultiPoint )
MultiPoint 是零個點(diǎn)或更多個點(diǎn)的集合。MultiPoint 實(shí)例的邊界為空。其實(shí)需要使用函數(shù)STGeomFromText()來格式化被定義的數(shù)據(jù)按照OGC標(biāo)準(zhǔn)輸出WKT格式的空間數(shù)據(jù)結(jié)果,也可使用函數(shù)STMPointFromText()代替STGeomFromText()的使用,通過如下SQL命令可定義一個點(diǎn)集合對象實(shí)例,并使用函數(shù)STGeometryN()輸出空間數(shù)據(jù)結(jié)果:
- --創(chuàng)建點(diǎn)集合實(shí)例
- DECLARE @cd geometry;
- SET @cd = geometry::STGeomFromText('MULTIPOINT((30.6666587469201 104.062021177233),(29.5076372217973 106.489384971208))',4326);
- --SET @cd = geometry::STMPointFromText('MULTIPOINT((30.6666587469201 104.062021177233),(29.5076372217973 106.489384971208))',4326);
- select @cd.STGeometryN(1).STAsText() as 重慶;
- select @cd.STGeometryN(2).STAsText() as 成都;
- ---------------------------------------------------------------------------------------
- 執(zhí)行輸出結(jié)果:
- 重慶
- ---------------------------------------------------------------------------------------
- POINT (30.6666587469201 104.062021177233)
- 成都
- ---------------------------------------------------------------------------------------
- POINT (29.5076372217973 106.489384971208)
三、線(LineString)
LineString 是一個一維對象,表示一系列點(diǎn)和連接這些點(diǎn)的線段。一個 LineString 實(shí)例必須由至少兩個非重復(fù)點(diǎn)組成,也可以為空。線條描述了空間上的兩個或多個點(diǎn)之間的距離,必須有兩個端點(diǎn),分別為:起止點(diǎn)(StartPoint)和終止點(diǎn)(EndPoint)。如下SQL命令實(shí)現(xiàn)了定義重慶到成都兩點(diǎn)之間的線條:
- DECLARE @cdline geometry;
- SET @cdline = geometry::STGeomFromText('LINESTRING(30.6666 104.06202, 29.50763 106.48938)', 4326);
- select @cdline.STAsText() as 重慶_成都
- -------------------------------------------------------------------------------------------
- 重慶_成都
- -------------------------------------------------------------------------------------------
- LINESTRING (30.6666 104.06202, 29.50763 106.48938)
在SQL Server 2008的空間結(jié)果中所呈現(xiàn)的效果如下圖所示:
注:線條有多種外觀呈現(xiàn)方式,有非閉合線條、閉合線條以及圖形復(fù)雜的線條等多種情況出現(xiàn)。如下圖示。
四、線集合(MultiLineString)
MultiLineString 是零個或更多 geometry 或 geography LineString 實(shí)例的集合。為使 MultiLineString 實(shí)例有效,該實(shí)例必須滿足以下條件:
1、構(gòu)成 MultiLineString 實(shí)例的所有實(shí)例必須都是有效的 LineString 實(shí)例。
2、在構(gòu)成 MultiLineString 實(shí)例的 LineString 實(shí)例中,不能有兩個實(shí)例在某一段間隔上重疊。LineString 實(shí)例只能與自身相交或接觸,或者在有限數(shù)目的點(diǎn)上與其他 LineString 實(shí)例相交或接觸。
通過如下SQL代碼片段演示MultiLineString的具體使用:
- DECLARE @ml geometry;
- --SET @ml = geometry::Parse('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))');
- SET @ml = geometry::STGeomFromText('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))',4326);
- --SET @ml.STSrid = 4326;
- select @ml;
- select @ml.STIsValid(); --驗(yàn)證ml對象是否為正確的空間對象
五、多邊形(Polygon )
Polygon 是存儲為一系列點(diǎn)的二維表面,這些點(diǎn)定義一個外部邊界環(huán)和零個或多個內(nèi)部環(huán)。可以從至少具有三個不同點(diǎn)的環(huán)中構(gòu)建一個 Polygon 實(shí)例。以下SQL命令演示了如何創(chuàng)建多邊形以及求多邊形的面積函數(shù)的應(yīng)用。
- --創(chuàng)建多邊形
- DECLARE @pg geometry;
- SET @pg = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);
- select @pg;
- select @pg.STArea(); --求得多邊形的面積
六、多邊形集合(MultiPolygon)
多邊形集合(MultiPolygon )實(shí)例是零個或更多個 Polygon 實(shí)例的集合。下面的SQL命令演示了定義一個多邊形集合對象并返回第一個對象的WKT。
- --創(chuàng)建多邊形集合,并返回第一個多邊形的WKT
- DECLARE @mpg geometry;
- SET @mpg = geometry::Parse('MULTIPOLYGON(((1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))');
- SELECT @mpg.STGeometryN(1).STAsText();
- ---------------------------------------------------------------------------------------------
- 執(zhí)行輸出結(jié)果:
- POLYGON ((1 1, 1 2, 2 1, 1 1))
七、空間對象集合(GeometryCollection )
GeometryCollection 是零個或更多個 geometry 或 geography 實(shí)例的集合。GeometryCollection 可以為空。以下SQL演示了定義一個帶有一個點(diǎn)(Point)實(shí)例和一個多邊形(Polygon)實(shí)例的空間對象集合對象。
- --空間集合
- DECLARE @ggc geometry;
- SET @ggc= geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))', 1);
- select @ggc;
- select @ggc.STAsText(); --輸出WKT文本(不帶Z,M值)
- select @ggc.ToString(); --輸出對象原字符串(帶Z,M值)
- ---------------------------------------------------------------------------------------------
- 執(zhí)行輸出結(jié)果:
- ---------------------------------------------------------------------------------------------
- 0x010000000105050000000000000000000840000000000000084000000000000000000000000000000000000000000000F03F0000000000002440000000000000F03F000000000000000000000000000000000000000000000000000000000000F03F0000000000000040000000000000084000000000000010400000000000
- ---------------------------------------------------------------------------------------------
- GEOMETRYCOLLECTION (POINT (3 3), POLYGON ((0 0, 1 10, 1 0, 0 0)))
- ---------------------------------------------------------------------------------------------
- GEOMETRYCOLLECTION (POINT (3 3 1), POLYGON ((0 0 2, 1 10 3, 1 0 4, 0 0 2)))
八、SQL Server 2008函數(shù)應(yīng)用
SQL Server 2008中針對地理空間數(shù)據(jù)、對象、實(shí)例提供了非常豐富的內(nèi)置函數(shù),使用這些函數(shù)可以快速的完成一系列的空間數(shù)據(jù)分析。關(guān)于這些函數(shù)的具體使用這里就不逐一介紹,本文中也相應(yīng)的使用了幾個常用的OGC靜態(tài)幾何圖形方法,以后的博文使用中會根據(jù)使用情況再做介紹,詳細(xì)請大家查閱MSDN,本文末也提供了相關(guān)參考資料的鏈接。下面代碼演示了測距重慶到成都兩點(diǎn)之間坐標(biāo)的距離(單位:米)。
- DECLARE @chongqing geography = geography::Point(30.6666587469201,104.062021177233, 4326)
- DECLARE @chengdu geography = geography::Point(29.5076372217973, 106.489384971208, 4326)
- SELECT @chongqing.STDistance(@chengdu)
- -----------------------------------------------------------------------------------------
- 執(zhí)行結(jié)果為:266943.740244237
九、相關(guān)資料
[1]、空間數(shù)據(jù)庫(百度百科):http://baike.baidu.com/view/1194566.htm
[2]、使用空間數(shù)據(jù)實(shí)現(xiàn)位置智能:http://tech.ddvip.com/2008-04/120816526343873.html
[3]、基礎(chǔ)空間對象(MSDN):http://msdn.microsoft.com/de-de/library/bb964711.aspx
[4]、幾何實(shí)例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx
[5]、幾何圖形實(shí)例上的擴(kuò)展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx
[6]、OGC 靜態(tài)幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx
[7]、擴(kuò)展靜態(tài)幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933805.aspx
【編輯推薦】
- SQL Server 2008應(yīng)用 阻塞(Blocking)
- 微軟 SQL Server 2008中自動化數(shù)據(jù)采集器
- 并行查詢讓SQL Server加速運(yùn)行
- 微軟SQL Server 2008令商業(yè)智能平民化