将坐标分为经度和纬度

时间:2014-12-18 22:54:30

标签: sql-server function coordinates

我的数据库中的坐标存储为(55.573012889640765,9.72362365248182)。我想创建一个将获得此值的函数并将它们放在@latitude = 55.573012889640765上 @长= 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

如您所见,此功能需要分开点,在我的数据库中我将​​它们作为一个分开。 你能告诉我如何划分部件或修改上述功能以适应我的代码。

提前谢谢

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分: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;

值得指出的是,最好不要以这种方式存储值,因为在执行范围搜索时由于涉及的功能而无法利用索引的优势。