SQL Server 2008 引入原生空間數據類型 (`geometry` 平面、`geography` 地球曲面),內建 OGC Simple Features 標準、空間索引、空間查詢方法,將位置智能從專業 GIS 系統釋放到通用關係數據庫,賦能零售选址、物流路徑、風險分析、營銷精準觸達等百億級市場場景。
| 特性 | geometry (平面幾何) | geography (地理空間) |
|---|---|---|
| 參考系 | 任意笛卡爾坐標系 (SRID 0 或自定義) | WGS84 / EPSG:4326 (經緯度),內建 3000+ SRID |
| 計算語義 | 平面幾何 (歐幾里得距離、面積) | 球面/橢球面大圓距離、真實面積、方位角 |
| 邊界限制 | 無限平面 | 單一半球內 (多邊形面積 < 2πR²),跨極/跨經線需拆分 |
| 精度 | 浮點精度 (約 10^-16) | 同上,但涉及三角函數累積誤差 |
| 典型場景 | 室內地圖、CAD 圖紙、遊戲座標、項目規劃圖 | GPS 軌跡、全球物流、地緣風險、氣象網格、行銷圍欄 |
Geometry (抽象基類) ├── Point (點) -- STX, STY, Lat, Long ├── Curve (曲線) │ └── LineString (線串) -- STLength(), STStartPoint(), STEndPoint() ├── Surface (曲面) │ └── Polygon (多邊形) -- STArea(), STCentroid(), STExteriorRing(), STInteriorRingN() ├── GeometryCollection (幾何集合) │ ├── MultiPoint │ ├── MultiLineString │ └── MultiPolygon └── CircularString / CompoundCurve / CurvePolygon (SQL 2012+ 圓弧支持)
空間索引將地圖劃分為**四層網格 (Level 1-4)**,每層網格細化 4 倍 (16 倍面積)。對象根據覆蓋網格單元生成索引鍵,存儲於 B+ 樹。
CREATE SPATIAL INDEX SIX_Stores_Location
ON dbo.Stores (Location)
USING GEOGRAPHY_GRID
WITH (
GRIDS = (LEVEL_1 = MEDIUM, LEVEL_2 = MEDIUM, LEVEL_3 = MEDIUM, LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16 -- 每對象最大網格單元數
);
| 分類 | 方法 | 示例 |
|---|---|---|
| 構造 | STGeomFromText / STPointFromText | `geography::STGeomFromText('POINT(121.5 31.2)', 4326)` |
| STPolyFromText / STMPolyFromText | 構造多邊形/多重多邊形 | |
| Parse (僅 geometry) | `geometry::Parse('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')` | |
| STGeomCollFromText | 構造集合 | |
| 關係/分析 | STIntersects / STEquals / STDisjoint | `@a.STIntersects(@b) = 1` 判斷相交 |
| STContains / STWithin / STCrosses | 包含/被包含/交叉 | |
| STDistance | `@p1.STDistance(@p2)` 返回米 (geography) / 單位 (geometry) | |
| STBuffer | `@point.STBuffer(1000)` 緩衝區 (圍欄查詢核心) | |
| STIntersection / STUnion / STDifference | 幾何集合運算 | |
| STArea / STLength | 面積 (平方米) / 長度 (米) | |
| 屬性/序列化 | STSrid / STGeometryType / STDimension | 元數據查詢 |
| STAsText / STAsBinary / AsGml | WKT/WKB/GML 輸出 | |
| ToString() | WKT 字符串 (隱式調用) |
-- 1. 門店位置表
CREATE TABLE dbo.Stores (
StoreID INT PRIMARY KEY,
Name NVARCHAR(100),
Location GEOGRAPHY NOT NULL -- 經緯度點
);
CREATE SPATIAL INDEX SIX_Stores_Location ON dbo.Stores(Location);
-- 2. 客戶位置表 (百萬級)
CREATE TABLE dbo.Customers (
CustID BIGINT PRIMARY KEY,
Location GEOGRAPHY NOT NULL,
Age INT, Income DECIMAL(10,2), Segment NVARCHAR(20)
);
CREATE SPATIAL INDEX SIX_Customers_Location ON dbo.Customers(Location);
-- 3. 圍欄查詢:某門店 5km 內客戶畫像
DECLARE @storeLoc GEOGRAPHY = (SELECT Location FROM dbo.Stores WHERE StoreID = 1001);
DECLARE @fence GEOGRAPHY = @storeLoc.STBuffer(5000); -- 5km 緩衝區多邊形
SELECT c.Segment, COUNT(*) AS CustCount, AVG(c.Income) AS AvgIncome
FROM dbo.Customers c
WHERE c.Location.STIntersects(@fence) = 1 -- 空間索引自動生效
GROUP BY c.Segment
ORDER BY CustCount DESC;
SQL Server 空間引擎將位置屬性內生化:不再是外部 GIS 系統的專屬,而是關係模型的一等公民。掌握類型選擇 (geometry/geography)、索引網格調優、OGC 方法組合、圍欄查詢模式、互操作管道,即可在熟悉的 T-SQL 環境中構建企業級位置智能應用,打通「數據-位置-決策」最後一公里。