Sql server 将坐标分为龙图和纬度
我的数据库中的坐标存储为(55.573012889640765,9.72362365248182)。我想做一个函数,得到这个值,然后把它们放在@latitude=55.573012889640765上,然后 @长=9.72362365248182 实际上,这个函数得到坐标,然后分别返回两个点。我想得到这个,这样我可以在以后用这样的函数计算两点之间的距离:Sql server 将坐标分为龙图和纬度,sql-server,function,coordinates,Sql Server,Function,Coordinates,我的数据库中的坐标存储为(55.573012889640765,9.72362365248182)。我想做一个函数,得到这个值,然后把它们放在@latitude=55.573012889640765上,然后 @长=9.72362365248182 实际上,这个函数得到坐标,然后分别返回两个点。我想得到这个,这样我可以在以后用这样的函数计算两点之间的距离: CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lon1 FLOAT, @lat2 FL
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
正如您所看到的,这个函数要求将点分开,在我的数据库中,我将它们作为一个整体。
你能告诉我如何划分部分或修改上述函数以适合我的代码吗
提前感谢使用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);
更多信息请点击此处:
或者,如果您只是想在逗号周围拆分字符串,请看下面的示例:您可以通过使用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);
更多信息请点击此处:
或者,如果您只是想将字符串拆分为逗号,请看下面的示例:我更喜欢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;
不过,值得指出的是,最好不要以这种方式存储值,因为在进行范围搜索时,由于涉及的函数,您无法利用任何索引的优势。我更喜欢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;
但是值得指出的是,最好不要以这种方式存储值,因为在执行范围搜索时,由于涉及的函数,您无法利用索引