SQL Server 空間型別介紹

語言: CN / TW / HK

SQL Server功能非常強大,它對空間型別也有著非常強的支援。本文用較為簡短的篇幅概述其空間型別的基本使用與原理。可以幫助讀者瞭解空間型別的整體框架,如需瞭解更多細節,可以繼續閱讀其文件獲取更多詳情。

另外,本文內容比較“幹”,看客需要自備礦泉水解渴。

01、概述

  • 官方介紹

SQL Server的空間型別主要有兩種,分別是空間幾何型別(Geometry)和空間地理型別(Geography)。其中, Geometry 型別表示歐幾里得(平面)座標系中的資料,Geography 型別表示圓形地球座標系中的資料,如 GPS 經緯度座標資料。

  • 通俗介紹

Geometry是平面空間資料型別,通過該型別可以儲存平面座標系(也就是X、Y平面座標系)上的點(單點、多點)、線(弧線、折線)、多邊形(多邊形內嵌)。G eography是立體空間資料型別,主要是用於記錄地球的經緯度。

空間幾何和空間地理資料型別支援 16 種空間資料物件或例項型別,分為Point(點)、Curve (線) 、Surface (面) 、GeomCollection (集合)四大類。 這些例項型別中只有 11 種是可例項化的,分別為 Point、LineString、CircularString、CompundCurve、Polygon、CurvePolygon、MultiPolygon、MultiLineString、MultiPoint 和 GeomCollection。圖1顯示16種資料型別所基於的幾何層次結構,其中11種可例項化型別以藍色表示。

圖1

只要例項的格式正確,即使未顯式定義該例項,Geometry 和 Geography 型別也可識別該例項。例如,如果您使用 STPointFromText() 方法顯式定義了一個 Point 例項,只要方法輸入的格式正確,Geometry 和 Geography 便將該例項識別為 Point。如果您使用 STGeomFromText() 方法定義了相同的例項,則 Geometry 和 Geography 資料型別都將該例項識別為 Point。

另外,空間幾何型別有SRID(Spatial Reference Identifiers)概念。因為 地球並不是理想化的平面,也不是理想的圓形,而是一個非標準的橢圓球體。因此,在不同的經緯度位置,計算兩點的距離沒有一個完美的公式。所以座標系應運而生,SRID是指資料的座標系,不同座標系資料不具有比較的意義。SQL Server的Geometry型別預設的SRID是0, Geography型別預設的是4326。 空間幾何的資料型別也是支援create  Spatial index,此型別的索引結構是B-tree, 前提是 該表必須有主鍵 ,詳細的空間索引型別可以參考官方介紹。

  • 示例

該示例表示建立包含一個自增列、一個Geography型別列名為GeogCol1的表,第三列使用 Geography中的 STAsText()方法的計算列。 然後插入三行資料,分別是含Point、LineString 和Polygon型別的例項。

DROP TABLE if EXISTS SpatialTable;   


CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeogCol1 geography,
GeogCol2 AS GeogCol1.STAsText() );
GO
INSERT INTO SpatialTable (GeogCol1)
VALUES (geography::STGeomFromText('POINT(-122.360 47.656)', 4326));


INSERT INTO SpatialTable (GeogCol1)
VALUES (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326));


INSERT INTO SpatialTable (GeogCol1)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326));
GO

下面分別從點、線、面和集合四大類別中各抽取一個可例項化物件為例,簡單介紹SQL Server空間資料型別是如何使用的。

02、點:Point    

在SQL Server資料中,Point 是表示單個位置的 0 維物件,可能包含 Z (標高) 和 M (度量) 值。

  • Geography 型別

在Geography 資料型別中Point表示單個位置,其中 Long 表示經度(前一位),Lat 表示緯度(後一位), 維度和經度值以度數進行衡量。其中緯度值始終處於間隔 [-90, 90] 內,如果輸入的值超出此範圍,將引發異常。而經度值始終處於間隔 (-180, 180] 內,如果輸入的值超出此範圍,並不會直接報錯,而是先對對值進行迴繞以便適合此範圍。例 如,如果為經度值輸入 190,則該值將被迴繞到值 -170。 但是經度值必須在 -15069 和 15069 度之間,否則也會報錯。  SRID 表示您希望返回的 geometry 例項的空間引用 ID,預設是4326。

  • Geometry型別

在Geometry 資料型別中Point 型別表示單個位置,其中 X 表示要生成的點的 X 座標, Y 表示要生成的點的 Y 座標。SRID 表示您希望返回的 geometry 例項的空間引用 ID ,預設是0。

  • 示例

下面的示例建立一個 geometry型別 表示點 (3, 4) 的幾何點例項,它的 SRID 為 0。

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POINT (3 4)', 0);

下面的示例建立一個 geometry型別 表示點 (3, 4) 的幾何點例項,它的 Z(高程)值為 7、M(度量)值為 2.5 且預設 SRID 為 0。

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POINT(3 4 7 2.5)');

03、線:LineString    

LineString 是一個一維物件,表示一系列點和連線這些點的線段。下圖2顯示了 LineString 例項的示例。

圖2

圖2中:

  • 1顯示的是一個簡單、非閉合的 LineString 例項。

  • 2顯示的是一個不簡單、非閉合的 LineString 例項。

  • 3顯示的是一個閉合、簡單的 LineString 例項,因此是一個環。

  • 4顯示的是一個閉合、不簡單的 LineString 例項,因此不是一個環。

LineString例項分為可接受的、有效的,其中有效例項表示必須有兩個及以上不同的點組成或者例項為空,如果兩個是 LineString例項是兩個相同的點,則稱之為可接受但無效例項,使用時會報 System.FormatException 異常。

  • 示例

有效例項,返回1。

DECLARE @g1 geometry= 'LINESTRING EMPTY';  
DECLARE @g2 geometry= 'LINESTRING(1 1, 1 2)';
DECLARE @g3 geometry= 'LINESTRING(1 1, 3 3, 2 4, 2 0)';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

無效可接受例項,返回0。

DECLARE @g1 geometry= 'LINESTRING(1 1, 1 1)';
SELECT @g1.STIsValid()

04、面:Polygon    

Polygon 是儲存為一系列點的二維表面,這些點定義一個外部邊界環和零個或多個內部環。至少具有三個不同點的平面才可以構建一個 Polygon 例項。Polygon 例項也可以為空。下圖3顯示了 Polygon 例項的示例。

圖3

圖3中:

  • 1是由外部環定義其邊界的 Polygon 例項。

  • 2是由外部環和兩個內部環定義其邊界的 Polygon 例項。內部環內的面積是 Polygon 例項的外部環的一部分。

  • 3是一個有效的 Polygon 例項,因為其內部環在單個切點處相交。

  • 示例

以下示例建立了一個帶有孔且SRID為10的簡單GeometryPolygon例項。

DECLARE @g geometry;
SET @g=geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))',10);

05、集合:GemetryCollection    

GeometryCollection 是零個或更多個 geometry 或 geography 例項的集合,也就是該例項可以為空。 GeometryCollection例項中所有的例項都為有效時,該集合型別才為有效例項。

  • 示例

以下示例顯示三個有效的 GeometryCollection 例項和一個g4無效的例項。

DECLARE @g1 geometry = 'GEOMETRYCOLLECTION EMPTY';  
DECLARE @g2 geometry = 'GEOMETRYCOLLECTION(LINESTRING EMPTY,POLYGON((-1 -1, -1 -5, -5 -5, -5 -1, -1 -1)))';
DECLARE @g3 geometry = 'GEOMETRYCOLLECTION(LINESTRING(1 1, 3 5),POLYGON((-1 -1, -1 -5, -5 -5, -5 -1, -1 -1)))';
DECLARE @g4 geometry = 'GEOMETRYCOLLECTION(LINESTRING(1 1, 3 5),POLYGON((-1 -1, 1 -5, -5 5, -5 -1, -1 -1)))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid();

06、 資料型別常用函式使用     

空間地理型別的例項提供了豐富的函式,例如將資料型別轉換成字串、判斷例項幾何圖形型別等等函式。下面簡單介紹幾個常用的資料型別。

  • STAsText將幾何圖形轉換成字串

使用:Geometry例項.STAsText()

返回型別:nvarchar(max)

  • STBoundary查詢幾何圖形的邊界

使用:Geometry例項.STBoundary()

返回型別:geometry

當圖形物件是Point時,查詢其邊界,返回的Geometry型別為空。

  • STGeometryType查詢幾何圖形的型別

使用:Geometry例項.STGeometryType()

返回型別:nvarchar(4000)

  • 線段相關方法

STLength:計算線段長度

STStartPoint:返回Geometry例項第一個Point

STEndPoint:返回Geometry例項最後一個Point

STPointN:返回Geometry例項制定Point

  • 多邊形相關方法

STArea:求多邊形面積

STNRings:返回多邊形中環的數量

STPerimeter:返回閉環的長度包括內環

STExteriorRing:以線串的形式返回多邊形最外面的環

STInteriorRingN:以線串形式返回指定的內部環

  • 其他常用方法

STGeometryType:返回一個幾何型別

更多的方法使用參考SQL Server官方文件。

07、總結    

到此,我們對SQL Server的空間地理型別應該有了初步的認識。簡單總結下,SQL Server空間地理型別分為空間幾何型別(Geometry)和空間地理型別(Geography),其中Geometry用於平面幾何圖形,Geography用於空間地理。兩種型別支援 16 種空間資料物件或例項型別,分為Point(點)、Curve(線)、Surface(面)、GeomCollection(集合)四大類,其中有 11 種可以例項化。另外,對於空間型別還有特有的SRID標識,一般我們用預設值即可。

08、參考    

@SQL Server Spatial Data Type

@SQL Server  Spatial index

@SQL Server Data types (Transact-SQL)

@Wiki SCID

往期內容推薦:

SQL Server 2022公測:全面支援雲服務的資料庫

雲廠商SQL Server 效能測試報告

雲資料庫技術行業動態@2022-06-24

雲資料庫技術行業動態@2022-06-10

雲資料庫技術行業動態@ 2022-05-27