Sql-Server

索引上的 SQL Server 空間幾何屬性

  • April 15, 2016

有沒有辦法將geometry.STSrid(object property) 添加到空間索引,或者當我在SQL Server 2012 中創建空間索引時已經添加了它。

我混合了SRID表,我想知道它是否有幫助?

我們將空間數據從多個來源收集到一個數據庫結構中。我沒有簡單的解決方案來轉換堆棧(SQL Server)上的空間數據,我需要保留原始數據。我考慮過的一種解決方案是保留原始幾何圖形並在旁邊添加另一個轉換的幾何圖形。

SRID 似乎不是空間索引的組成部分,也不能添加。

即使在 SQL Server 中沒有用於基於 SRID 操作幾何的真正工具,它也是幾何不可或缺的一部分。它確實有一些關於 SRID 的規則。

  • 地理位置必須具有來自特定 SRID 列表的 SRID。
  • 在比較、操作幾何和地理時,它們必須具有相同的 SRID。

例如使用以下設置。

CREATE TABLE TEST  (
   ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
   ,GEOM GEOMETRY
   )

INSERT INTO TEST (GEOM) VALUES
(Geometry::Point(0,1,0)),
(Geometry::Point(3,2,1)),
(Geometry::Point(2,3,2)),
(Geometry::Point(1,0,2))

CREATE SPATIAL INDEX TEST_SDX ON TEST(GEOM) WITH (BOUNDING_BOX=(0,0,5,5))

第一個查詢確定點之間的距離。它只會返回第 3 點和第 4 點之間的距離,因為它們是唯一具有相同 SRID 的點。其他距離將為 NULL。

第二個查詢用於選擇緩衝區內的幾何圖形。由於查詢緩衝區是使用 SRID 2 創建的,因此只返回一行。

SELECT a.ID, b.ID. a.GEOM.STDistance(b.GEOM)
FROM TEST a
   INNER JOIN TEST b ON a.ID < b.ID

ID          ID          
----------- ----------- ----------------------
1           2           NULL
1           3           NULL
2           3           NULL
1           4           NULL
2           4           NULL
3           4           3

SELECT * 
FROM TEST a
WHERE Geometry::Point(1,1,1).STBuffer(3).STContains(a.GEOM) = 1

ID          GEOM
----------- --------------------------------------------------
2           0x01000000010C00000000000000000000000000000040

另請注意,SQL Server 允許我在包含混合 SRID 的幾何列上建構空間索引,但它的用途有限。即使有更多的數據,該索引的用途也有限。

我建議您選擇一個單一的投影來使用所有數據並將幾何轉換為該投影,以使生活更輕鬆。這可以與目前幾何圖形一起完成或替換它們。此外,如果您選擇 Lat/Lon 投影,請使用 Geography 數據類型。

有一個開源項目SQL Server Spatial Tools,它有一些工具可以讓您進行投影。但是,您必須知道您正在使用的投影的參數,因為它似乎沒有可以使用的投影列表。我不能說這些有多好,因為我沒有使用它們。

引用自:https://dba.stackexchange.com/questions/135155