2014-12-18 118 views
1

我在我的數據庫中的座標存儲爲(55.573012889640765,9.72362365248182)。我想創建一個函數來獲得這個值,並把它們放在@latitude = 55.573012889640765和 @ long = 9.72362365248182。將座標分爲緯線和緯度

所以實際上函數獲取座標並分別返回給我兩點。我想這個,所以我可以用這樣一個函數以後計算兩個點之間的距離:

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lon1 FLOAT, @lat2 FLOAT, @lon2 FLOAT) 
RETURNS FLOAT 
AS 
BEGIN 

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371 
END 

正如你看到此功能,需要待分離的點,在我的數據庫我有他們作爲一個。 你能告訴我知道如何分割零件或修改上述功能以適合我的代碼。

預先感謝您

回答

5

您可以通過使用SQL的幾何功能保存自己的一些努力。

declare @coords1 nvarchar(64) = '(55.573012889640765, 9.72362365248182)' 
, @coords2 nvarchar(64) = '(56.573012889640765, 9.72362365248182)' 

declare @g1 geometry = geometry::STGeomFromText('POINT' + replace(@coords1,',',' '), 0) 
, @g2 geometry = geometry::STGeomFromText('POINT' + replace(@coords2,',',' '), 0) 
SELECT @g1.STDistance(@g2); 

此處瞭解詳情:http://msdn.microsoft.com/en-us/library/bb933952.aspx

或者,如果你只是希望分裂周圍的逗號的字符串,來看看這個例子:How do I split a string so I can access item x?

3

我喜歡JonLBevan的答案,但這個是從字面上要求什麼:

DECLARE @string nvarchar(max) = '(55.573012889640765, 9.72362365248182)'; 

SELECT @string; 

DECLARE @latitude float; 
DECLARE @long float; 

SELECT @latitude = CONVERT(float, SUBSTRING(@string, 2, charindex(',', @string)-2)), 
     @long = CONVERT(float, SUBSTRING(@string, charindex(',', @string)+1, LEN(@string)-charindex(',', @string)-1)); 

SELECT @latitude, @long; 

這是值得指出,但最好不要存儲v由於涉及的功能,在進行範圍搜索時,您無法利用索引編制的優勢。