2014-12-18 5 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; 

стоит отметить, однако, что было бы лучше не хранить клиновые таким образом, поскольку вы не можете воспользоваться преимуществами индексации при выполнении поиска диапазона из-за задействованных функций.