共用方式為


建立、建構及查詢幾何執行個體

平面空間資料類型 (geometry) 代表 Euclidean (平面) 座標系統中的資料。 這種類型在 SQL Server 中是實作為 Common Language Runtime (CLR) 資料類型。

geometry 類型已預先定義,而且可在每個資料庫中使用。 您可以建立 geometry 類型的資料表資料行,並使用與其他 CLR 類型相同的方式來操作 geometry 資料。

SQL Server 支援的 geometry 資料類型 (平面) 符合開放式地理空間協會 (Open Geospatial Consortium,OGC) 的 SQL 簡單特徵規格 1.1.0 版。

如需有關 OGC 規格的詳細資訊,請參閱下列主題:

SQL Server 支援下列結構描述所定義之現有 GML 3.1 標準的子集:https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd

本主題內容

  • 建立或建構新的 geometry 執行個體

    • 從現有的執行個體建立新的 geometry 執行個體

    • 從已知的文字輸入建構 geometry 執行個體

    • 從已知的二進位輸入建構 geometry 執行個體

    • 從 GML 文字輸入建構 geometry 執行個體

  • 從 geometry 執行個體傳回已知的文字和已知的二進位

  • 查詢 geometry 執行個體的屬性和行為

    • 有效性、執行個體類型和 GeometryCollection 資訊

    • 點數

    • 維度

    • 空白

    • 界限、內部和外部

    • 範圍

    • 封閉性

    • 空間參考識別碼 (SRID)

  • 判斷 geometry 執行個體之間的關聯性

  • geometry 執行個體預設為零 SRID

  • 範例

建立或建構新的 geometry 執行個體

從現有的執行個體建立新的 geometry 執行個體

geometry 資料類型提供許多內建方法,您可以使用這些方法來根據現有執行個體建立新的 geometry 執行個體。

[回到頁首]

從已知的文字輸入建構 geometry 執行個體

geometry 資料類型提供數種內建方法,可從開放式地理空間協會 (Open Geospatial Consortium,OGC) 的 WKT 表示法產生幾何。 WKT 標準是一種文字字串,可允許使用文字格式交換幾何資料。

[回到頁首]

從已知的二進位輸入建構 geometry 執行個體

WKB 是 OGC 指定的一種二進位格式,可允許在用戶端應用程式與 SQL 資料庫之間交換 geometry 資料。 下列函數可接受 WKB 輸入來建構幾何:

[回到頁首]

從 GML 文字輸入建構 geometry 執行個體

geometry 資料類型提供了一個方法從 GML 產生 geometry 執行個體,GML 是幾何物件的 XML 表示法。 SQL Server 可支援 GML 的子集。

[回到頁首]

從 geometry 執行個體傳回已知的文字和已知的二進位

您可以使用下列方法傳回 WKT 或 WKB 格式的 geometry 執行個體:

[回到頁首]

查詢 geometry 執行個體的屬性和行為

所有 geometry 執行個體都有許多屬性,這些屬性可透過 SQL Server 提供的方法來加以擷取。 下列主題定義幾何類型的屬性和行為以及用來查詢每一個類型的方法。

有效性、執行個體類型和 GeometryCollection 資訊

一旦建構了 geometry 執行個體之後,您就可以使用下列方法來判斷它的格式是否正確、傳回執行個體類型,或者如果它是集合執行個體,就會傳回特定的 geometry 執行個體。

[回到頁首]

點數

所有非空白的 geometry 執行個體都是由「點」(point) 所組成。 這些點代表幾何繪製所在平面的 X 和 Y 座標。 geometry提供許多內建方法來查詢執行個體的點。

[回到頁首]

維度

非空的 geometry 執行個體可以是 0 維度、1 維度或 2 維度。 零維度 geometries (如 Point 和 MultiPoint) 沒有長度或區域。 一維度物件 (如 LineString, CircularString, CompoundCurve 和 MultiLineString) 具有長度。 二維度執行個體 (如 Polygon、CurvePolygon 和 MultiPolygon) 具有區域和長度。 空的執行個體將會報告 -1 的維度,而 GeometryCollection 則會報告與其內容類型相依的區域。

[回到頁首]

空白

「空的」(Empty) geometry 執行個體沒有任何點。 空的 LineString, CircularString、CompoundCurve 和 MultiLineString 執行個體的長度是零。 空的 Polygon、CurvePolygon 和 MultiPolygon 執行個體的區域是 0。

  • 判斷執行個體是否為空的
    STIsEmpty

[回到頁首]

簡單

如果要讓執行個體的 geometry 為「簡單」(simple),它必須符合以下兩個需求:

  • 執行個體的每一個圖形都不能自己相交 (除了在它的端點上以外)。

  • 執行個體的兩個圖形不能在非兩者界限內的點上彼此相交。

[!附註]

空的幾何一定是簡單的幾何。

[回到頁首]

界限、內部和外部

geometry 執行個體的「內部」(Interior) 是此執行個體所佔據的空間,而「外部」(Exterior) 則是未佔據它的空間。

「界限」(Boundary) 是由 OGC 定義如下:

  • Point 和 MultiPoint 執行個體沒有界限。

  • LineString 和 MultiLineString 界限是由起點和終點所組成,移除發生偶數次數的點。

DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');
SELECT @g.STBoundary().ToString();

Polygon 或 MultiPolygon 執行個體的界限是它的環形集合。

DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');
SELECT @g.STBoundary().ToString();

[回到頁首]

範圍

geometry 執行個體的「範圍」(Envelope) (也稱為「週框方塊」(Bounding Box)) 是執行個體的最小和最大座標 (X,Y) 組成的座標軸對齊矩形。

[回到頁首]

封閉性

「封閉式」(Closed) geometry 執行個體是起始點與結束點相同的圖形。 Polygon 執行個體視為封閉式。 Point 執行個體視為非封閉式。

環形是簡單、封閉的 LineString 執行個體。

[回到頁首]

空間參考識別碼 (SRID)

空間參考識別碼 (SRID) 是用來指定代表 geometry 執行個體之座標系統的識別碼。 具有不同 SRID 的兩個執行個體無法進行比較。

  • 設定或傳回執行個體的 SRID
    STSrid

這個屬性可以修改。

[回到頁首]

判斷 geometry 執行個體之間的關聯性

geometry 資料類型提供許多內建方法,您可以使用這些方法來判斷兩個 geometry 執行個體之間的關聯性。

  • 判斷兩個執行個體是否組成相同的點集合
    STEquals

  • 判斷兩個執行個體是否不相交
    STDisjoint

  • 判斷兩個執行個體是否相交
    STIntersects

  • 判斷兩個執行個體是否接觸
    STTouches

  • 判斷兩個執行個體是否重疊
    STOverlaps

  • 判斷兩個執行個體是否交叉
    STCrosses

  • 判斷某個執行個體是否在另一個執行個體內
    STWithin

  • 判斷某個執行個體是否包含另一個執行個體
    STContains

  • 判斷某個執行個體是否與另一個執行個體重疊
    STOverlaps

  • 判斷兩個執行個體在空間上是否相關
    STRelate

  • 判斷兩個 geometry 內點與點之間的最短距離
    STDistance

[回到頁首]

geometry 執行個體預設為零 SRID

SQL Server 中 geometry 執行個體的預設 SRID 是 0。 有了 geometry 空間資料,執行計算時並不需要空間執行個體的特定 SRID;因此,執行個體可位於未定義的平面空間內。 若要在 geometry 資料類型方法的計算中指示未定義的平面空間,SQL Server Database Engine 會使用 SRID 0。

範例

下列兩個範例示範如何加入及查詢幾何資料。

  • 第一個範例會建立具有識別資料行及 geometry 資料行 GeomCol1 的資料表。 第三個資料行會將 geometry 資料行轉譯成它的開放式地理空間協會 (Open Geospatial Consortium,OGC) 已知的文字 (Well-Known Text,WKT) 表示法,並使用 STAsText() 方法。 然後會插入兩個資料列:一個資料列包含 geometry 的 LineString 執行個體,另一個資料列包含 Polygon 執行個體。

    IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL 
        DROP TABLE dbo.SpatialTable;
    GO
    
    CREATE TABLE SpatialTable 
        ( id int IDENTITY (1,1),
        GeomCol1 geometry, 
        GeomCol2 AS GeomCol1.STAsText() );
    GO
    
    INSERT INTO SpatialTable (GeomCol1)
    VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
    
    INSERT INTO SpatialTable (GeomCol1)
    VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
    GO
    
  • 第二個範例使用 STIntersection() 方法傳回之前插入之兩個 geometry 執行個體相交的點。

    DECLARE @geom1 geometry;
    DECLARE @geom2 geometry;
    DECLARE @result geometry;
    
    SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;
    SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;
    SELECT @result = @geom1.STIntersection(@geom2);
    SELECT @result.STAsText();
    

[回到頁首]

請參閱

概念

空間資料 (SQL Server)