SQL Server 2008 空間資料支援七種 OGC 簡單特徵幾何物件:Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection。本文逐一示範各物件的 WKT 建立方式、屬性存取 (STX, STY, Z, M)、集合索引存取 (STGeometryN) 以及驗證 (STIsValid),最後展示 STDistance 測距實戰。
DECLARE @p GEOMETRY = geometry::Parse('POINT(30.6666587469201 104.062021177233)');
SELECT @p.STX AS X, @p.STY AS Y;
含 Z (高程) 與 M (度量) 值:
DECLARE @g GEOMETRY = geometry::Parse('POINT(30.6666587469201 104.062021177233 15 3.5)');
SELECT @g.STX AS X, @g.STY AS Y, @g.Z AS Z, @g.M AS M;
DECLARE @cd GEOMETRY = geometry::STGeomFromText(
'MULTIPOINT((30.6666587469201 104.062021177233),(29.5076372217973 106.489384971208))',
4326
);
SELECT @cd.STGeometryN(1).STAsText() AS 重慶;
SELECT @cd.STGeometryN(2).STAsText() AS 成都;
輸出:POINT(30.6666587469201 104.062021177233) / POINT(29.5076372217973 106.489384971208)
DECLARE @cdline GEOMETRY = geometry::STGeomFromText(
'LINESTRING(30.6666 104.06202, 29.50763 106.48938)', 4326
);
SELECT @cdline.STAsText() AS 重慶_成都;

線型外觀多樣:開放線、閉合線、複雜自相交線。

驗證有效性:所有子線必須有效、僅在端點或有限點相交/接觸。
DECLARE @ml GEOMETRY = geometry::STGeomFromText(
'MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202, 33.78142 105.97914))',
4326
);
SELECT @ml;
SELECT @ml.STIsValid(); -- 回傳 1 表有效

外環 + 0~N 內環 (洞)。至少 3 點構成環。
DECLARE @pg GEOMETRY = 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(); -- 計算面積
DECLARE @mpg GEOMETRY = geometry::Parse(
'MULTIPOLYGON(((1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))'
);
SELECT @mpg.STGeometryN(1).STAsText(); -- 取第一個多邊形 WKT
輸出:POLYGON((1 1, 1 2, 2 1, 1 1))
DECLARE @ggc GEOMETRY = geometry::STGeomCollFromText(
'GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))',
1
);
SELECT @ggc.STAsText(); -- WKT 無 Z/M
SELECT @ggc.ToString(); -- 原始字串含 Z/M
輸出差異:GEOMETRYCOLLECTION(POINT(3 3), POLYGON((0 0, 1 10, 1 0, 0 0))) vs GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))
使用 geography 型別可得真實大地距離 (單位:公尺)。
DECLARE @cq GEOGRAPHY = geography::Point(30.6666587469201, 104.062021177233, 4326);
DECLARE @cd GEOGRAPHY = geography::Point(29.5076372217973, 106.489384971208, 4326);
SELECT @cq.STDistance(@cd); -- 結果:266943.74 公尺
掌握七大基礎空間物件的建立、屬性存取與驗證,是進行空間查詢 (相交、包含、距離、緩衝區等) 的基石。善用 geography 型別進行大地測量計算,geometry 型別處理平面投影運算,依業務場景選擇正確型別。