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

SQL Server 2008 空間資料類型入門:Geometry 與 Geography 應用指南

     編輯:關於SqlServer

空間資料類型概覽

類型模型座標系統適用場景
geometry平面(歐幾里得)任意投影座標 (X, Y)室內地圖、CAD 圖面、平面分析
geography球面(地球)經緯度 (Longitude, Latitude),WGS84 (SRID 4326)GPS 軌跡、地理圍柵、距離計算、鄰近搜尋

常用方法

  • STDistance(other):回傳兩物件最短距離(geometry 單位同座標;geography 以公尺)。
  • STIntersects(other):判斷是否相交。
  • STWithin(other):判斷是否包含於另一物件內。
  • STBuffer(distance):產生緩衝區(圍柵)。
  • STAsText() / STAsBinary():輸出 WKT / WKB 格式。

建立空間資料表

CREATE TABLE dbo.Stores (
    StoreID   INT IDENTITY PRIMARY KEY,
    Name      NVARCHAR(100),
    Location  GEOGRAPHY  -- 經緯度點
);

-- 插入台北 101、高雄 85 大樓
INSERT INTO dbo.Stores (Name, Location) VALUES
('Taipei 101', GEOGRAPHY::Point(25.033964, 121.564468, 4326)),
('Kaohsiung 85', GEOGRAPHY::Point(22.610732, 120.301882, 4326));

空間索引(效能關鍵)

CREATE SPATIAL INDEX IX_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);
  • geography 索引僅支援 GEOGRAPHY_GRID 或 GEOGRAPHY_AUTO_GRID(SQL 2012+)。
  • geometry 索引支援 GEOMETRY_GRID / GEOMETRY_AUTO_GRID,需指定邊界框。

實用查詢範例

1. 找出離指定點 10 公里內的門市

DECLARE @myLoc GEOGRAPHY = GEOGRAPHY::Point(25.04, 121.53, 4326); -- 台北車站
SELECT Name, Location.STDistance(@myLoc) / 1000.0 AS DistanceKm
FROM dbo.Stores
WHERE Location.STDistance(@myLoc) <= 10000  -- 公尺
ORDER BY DistanceKm;

2. 繪製圍柵:某門市 5 公里服務範圍

SELECT Location.STBuffer(5000) AS ServiceArea
FROM dbo.Stores WHERE Name = 'Taipei 101';

3. 判斷某座標是否落在服務範圍內

DECLARE @custLoc GEOGRAPHY = GEOGRAPHY::Point(25.05, 121.55, 4326);
SELECT CASE WHEN ServiceArea.STContains(@custLoc) = 1 THEN '在範圍內' ELSE '超出範圍' END
FROM (SELECT Location.STBuffer(5000) AS ServiceArea FROM dbo.Stores WHERE Name = 'Taipei 101') t;

匯入/匯出標準格式

  • WKT:POINT(121.564468 25.033964)、POLYGON((...))
  • WKB:二進位格式,適合程式傳輸。
  • GML:XML 格式,Web 服務常用。
-- 匯出 WKT
SELECT Location.STAsText() FROM dbo.Stores;
-- 匯入 WKT
INSERT INTO dbo.Stores (Name, Location) VALUES ('New Store', GEOGRAPHY::STPointFromText('POINT(121.5 25.0)', 4326));

SRID 重要性

所有空間運算要求參與物件具有相同 SRID,否則回傳 NULL。全球通用 WGS84 為 4326,台灣常用 TWD97 (SRID 3826) 平面座標,搭配 geometry 使用。

結語

SQL Server 2008+ 內建空間資料類型讓資料庫直接具備 GIS 計算能力,省去外部 GIS 中介軟體。善用 geography 處理經緯度距離/圍柵,geometry 處理平面幾何,並建立適當空間索引,即可在 T-SQL 中完成高效能的位置智慧應用。

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