2012-12-14 20 views
2

我有一個包含許多SQL Server地理座標(地理數據類型)的表。點在表格中正確排列。我想將這些點結合到一條線上並計算折線的總長度。SQL Server空間:獲取多個點的長度

我的想法是以下幾點:

  1. UNION的地理座標。 (這創建了一個MULTI POINT。
  2. MULTI POINT轉換爲LINE STRING
  3. 使用.STLength()拿到長度

是否有存在的點而不從字符串構建LINESTRING工會的有效途徑?

我使用SQL Server 2012的

回答

1
-- Test initialization 
DECLARE @CocoJambo TABLE (
    AddressID INT PRIMARY KEY, 
    SpatialLocation geography NOT NULL 
); 

INSERT INTO @CocoJambo (AddressID,SpatialLocation) 
VALUES 
(11, 'POINT (-122.164644615406 47.7869921906598)'), 
(22, 'POINT (-122.250185528911 47.6867097047995)'), 
(33, 'POINT (-122.274625789912 47.7631154083121)'), 
(44, 'POINT (-122.335726442416 47.7392386259644)'), 
(55, 'POINT (-122.091323832402 47.7010357742081)'), 
(66, 'POINT (-122.360166703417 47.7058111306776)'), 
(77, 'POINT (-122.335726442416 47.7631154083121)'), 
(88, 'POINT (-122.372386833918 47.7440139824339)'), 
(99, 'POINT (-122.189084876407 47.7201372000862)'), 
(100, 'POINT (-122.042443310399 47.7822168341902)'); 
-- End of Test initialization 

-- Test 1 (SQL Server 2008 >=) 
DECLARE @Results TABLE (
    RowNum INT PRIMARY KEY, 
    SpatialLocation geography NOT NULL 
); 
INSERT @Results (RowNum, SpatialLocation) 
SELECT ROW_NUMBER() OVER(ORDER BY t.AddressID) AS RowNum, t.SpatialLocation 
FROM @CocoJambo t; 

SELECT SUM(crt.SpatialLocation.STDistance(prev.SpatialLocation)) AS SumOfDistance1 
FROM @Results crt INNER JOIN @Results prev ON crt.RowNum=prev.RowNum+1; 
-- End of Test 1 (SQL Server 2008 >=) 

-- Test 2 (SQL Server 2012) 
SELECT SUM(x.CurrentLocation.STDistance(x.PreviousLocation)) AS SumOfDistance2 
FROM (
    SELECT 
    t.SpatialLocation AS CurrentLocation, 
    LAG(t.SpatialLocation) OVER(ORDER BY t.AddressID) AS PreviousLocation 
    FROM CocoJambo T 
) x 
-- End of Test 2 (SQL Server 2012) 

結果:

SumOfDistance1 
---------------------- 
102946.467827877 

SumOfDistance2 
---------------------- 
102946.46782787738 

Demo SQLFiddle爲SQL 2012的版本

參考文獻: