| 類型 | 模型 | 座標系統 | 適用場景 |
|---|---|---|---|
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_GRID 或 GEOGRAPHY_AUTO_GRID(SQL 2012+)。GEOMETRY_GRID / GEOMETRY_AUTO_GRID,需指定邊界框。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;
SELECT Location.STBuffer(5000) AS ServiceArea
FROM dbo.Stores WHERE Name = 'Taipei 101';
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;
POINT(121.564468 25.033964)、POLYGON((...))-- 匯出 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,否則回傳 NULL。全球通用 WGS84 為 4326,台灣常用 TWD97 (SRID 3826) 平面座標,搭配 geometry 使用。
SQL Server 2008+ 內建空間資料類型讓資料庫直接具備 GIS 計算能力,省去外部 GIS 中介軟體。善用 geography 處理經緯度距離/圍柵,geometry 處理平面幾何,並建立適當空間索引,即可在 T-SQL 中完成高效能的位置智慧應用。