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

SQL Server 2008 空間數據完整指南:幾何/地理類型、索引、OGC 標準與位置智能應用構建

     編輯:關於SqlServer

SQL Server 2008 引入原生空間數據類型 (`geometry` 平面、`geography` 地球曲面),內建 OGC Simple Features 標準、空間索引、空間查詢方法,將位置智能從專業 GIS 系統釋放到通用關係數據庫,賦能零售选址、物流路徑、風險分析、營銷精準觸達等百億級市場場景。

雙類型架構:平面 vs 曲面

特性geometry (平面幾何)geography (地理空間)
參考系任意笛卡爾坐標系 (SRID 0 或自定義)WGS84 / EPSG:4326 (經緯度),內建 3000+ SRID
計算語義平面幾何 (歐幾里得距離、面積)球面/橢球面大圓距離、真實面積、方位角
邊界限制無限平面單一半球內 (多邊形面積 < 2πR²),跨極/跨經線需拆分
精度浮點精度 (約 10^-16)同上,但涉及三角函數累積誤差
典型場景室內地圖、CAD 圖紙、遊戲座標、項目規劃圖GPS 軌跡、全球物流、地緣風險、氣象網格、行銷圍欄

核心空間對象層次 (OGC Simple Features)

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  -- 每對象最大網格單元數
);
  • `GRIDS` 密度:`LOW` (4x4)、`MEDIUM` (8x8)、`HIGH` (16x16);
  • 密度過高 → 索引膨脹、插入慢;密度過低 → 掃描誤報多、篩選效率低;
  • 最佳實踐:分析對象尺寸分佈,`CELLS_PER_OBJECT` 覆蓋 95% 對象;
  • 查詢提示:`WITH (INDEX(SIX_Stores_Location))` 強制使用,或優化器自動匹配。

核心空間方法速查 (實例語法)

分類方法示例
構造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 / AsGmlWKT/WKB/GML 輸出
ToString()WKT 字符串 (隱式調用)

實戰場景:零售选址 - 5 公里圍欄客戶畫像

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

與專業 GIS 生態互操作

  • 導入:Shapefile → `ogr2ogr` / `Shape2SQL` → WKB 插入;GeoJSON → `OPENJSON` + `geography::STGeomFromText`;
  • 導出:`.STAsBinary()` → WKB → `ogr2ogr` 輸出 Shapefile/GeoJSON/GPKG;
  • 渲染:SSRS 地圖報表 (ESRI Shapefile 背景 + 空間查詢圖層)、Power BI Azure Maps 視覺對象、Leaflet/Mapbox 前端直連 WKT/GeoJSON API。

避坑指南

  • geography 多邊形方向:外環**逆時針** (左手法則內部),內環順時針;導入工具常反向,需 `ReorientObject()` 修正;
  • 跨半球/極點:geography 不支持跨越赤道/極點的多邊形,必須拆分;
  • 索引失效陷阱:`WHERE @fence.STIntersects(c.Location) = 1` 參數在左側可能不走索引,**列必須在左** `c.Location.STIntersects(@fence)`;
  • SRID 不匹配**:跨 SRID 運算報錯,統一 4326 或顯式 `STTransform` (需 CLR/第三方);
  • 精度陷阱**:`STEquals` 要求二進制精確相等,業務判斷用 `STDistance < 0.01` 容差。

總結

SQL Server 空間引擎將位置屬性內生化:不再是外部 GIS 系統的專屬,而是關係模型的一等公民。掌握類型選擇 (geometry/geography)、索引網格調優、OGC 方法組合、圍欄查詢模式、互操作管道,即可在熟悉的 T-SQL 環境中構建企業級位置智能應用,打通「數據-位置-決策」最後一公里。

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