首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 空間資料實戰 (四):七大基礎空間物件與 OGC 標準函數應用

     編輯:關於SqlServer

前言

SQL Server 2008 空間資料支援七種 OGC 簡單特徵幾何物件:Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection。本文逐一示範各物件的 WKT 建立方式、屬性存取 (STX, STY, Z, M)、集合索引存取 (STGeometryN) 以及驗證 (STIsValid),最後展示 STDistance 測距實戰。

1. Point (點) — 零維位置

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;

2. MultiPoint (點集合)

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)

3. LineString (線串) — 一維路徑

DECLARE @cdline GEOMETRY = geometry::STGeomFromText(
    'LINESTRING(30.6666 104.06202, 29.50763 106.48938)', 4326
);
SELECT @cdline.STAsText() AS 重慶_成都;

LineString 空間結果視覺化

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

各類線型外觀

4. MultiLineString (線集合)

驗證有效性:所有子線必須有效、僅在端點或有限點相交/接觸。

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 表有效

MultiLineString 視覺化

5. Polygon (多邊形) — 二維區域

外環 + 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();  -- 計算面積

6. MultiPolygon (多邊形集合)

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))

7. GeometryCollection (幾何集合) — 異質物件彙總

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)))

8. 空間函數實戰:測量兩地距離

使用 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 型別處理平面投影運算,依業務場景選擇正確型別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved