2015-11-29 90 views
1
沿線兩個點的距離

我已經加入其中代表map.As路線的MSSQL數據庫線,如何計算TSQL

update route 
    set locationArray=geography::STGeomFromText('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326) 
    where routeID=45; 

現在我選擇在該行的兩個點,我的魔杖計算與圖像相似的線條(不是直接距離或位移)的兩條線之間的距離。 enter image description here

我試過了STLength()函數和STDistance()函數。但他們都提供直接距離。有人可以幫助我使用TSQL來計算沿線的距離嗎?

+0

你是指計算連續點的距離並添加它們? – Gurusinghe

回答

2

STLength (geometry Data Type)

返回一個幾何實例的元素的總長度。

STLength (geography Data Type)

返回一個地理實例或 一個的GeometryCollection內的地理實例的元件的總長度。

我計算了Excel中每個段SQRT(X*X + Y*Y)的簡單長度之和,並將其與SQL Server進行了比較。對於geometry類型,Excel給出了與STLength相同的結果。 STLength確實不是計算從開始到結束點的距離,它會計算每個段的長度,然後按照預期進行累加。

DECLARE @G1 geometry = geometry::STGeomFromText ('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326); 
DECLARE @G2 geography = geography::STGeomFromText('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326); 

SELECT @G1.STLength() AS LGeometry, @G2.STLength() AS LGeography; 

結果

LGeometry    LGeography 
0.0252888043080671 1809.85271737151 

所以,STLength工作正常,檢查你的代碼。檢查您使用的是正確類型(geometry vs geography)。

+0

你是對的弗拉基米爾。但我已經使用了Geography數據類型。由於我檢查STLenth()方法,問題出現了。我選擇了一條長度爲7.4公里的路線,並獲得了非常接近(50m-150m)的座標。但即使這樣的接近點也會產生巨大的誤差,並且產生長度爲6.873km的距離。當我使用STStartPoint()和STEndPoint()計算相同路線起點和終點的位移時,我得到了6.833km。所以我被自己的結果欺騙了。 – Gurusinghe