create function [dbo].[fn_get_sz_lonlat](@map varchar(255),@dwmap varchar(255))
returns varchar(38)
as
begin
/*
得知两个定位点的经纬度,计算两点的距离
参数:字符串类型
返回:数字类型,且该数字类型会把小数点后多余的0去掉,保留6位小数
实例:定位一:印象中心`109.437595`24.349276,定位二:火车站`109.384410`24.310061
select dbo.fn_get_sz_lonlat('东城印象中心`109.437595`24.349276','火车站`109.384410`24.310061')
函数调用场景:在计算签到距离时调用
类似的函数fn_get_sz_str_qfw把数值类型转为字符串,并且把小数点后面多余的0去掉,整数部分增加千分位,注意fn_get_sz_str、fn_get_sz_str_qfw的用法
*/
declare @map_1 varchar(255),@map_2 varchar(255), @map_lon numeric(19,6),@map_lat numeric(19,6),
@dwmap_lon numeric(19,6),@dwmap_lat numeric(19,6),@distance numeric(19,6)
if (ISNULL(@map,'')<>'' and ISNULL(@dwmap,'')<>'')
begin
--截取第一个‘之后的数据
set @map_1 = isnull((SUBSTRING(@map,CHARINDEX('`',@map)+1 ,len(@map)-charindex('`',@map))),'')
set @map_2 = isnull((SUBSTRING(@dwmap,CHARINDEX('`',@dwmap)+1 ,len(@dwmap)-charindex('`',@dwmap))),'')
--截取‘之前的数据获取经度
set @map_lon = isnull(SUBSTRING(@map_1,1,CHARINDEX('`',@map_1)-1),'')
set @dwmap_lon = isnull(SUBSTRING(@map_2,1,CHARINDEX('`',@map_2)-1),'')
--截取‘之后的数据获取纬度
set @map_lat =isnull((SUBSTRING(@map_1,CHARINDEX('`',@map_1)+1 ,len(@map_1)-charindex('`',@map_1))),'')
set @dwmap_lat = isnull((SUBSTRING(@map_2,CHARINDEX('`',@map_2)+1 ,len(@map_2)-charindex('`',@map_2))),'')
--计算距离。单位:m
set @distance=isnull((select round((sqrt(
(((@map_lon - @dwmap_lon)*PI()*12656*cos(((@map_lat+@dwmap_lat)/2)*PI()/180)/180)
*
((@map_lon - @dwmap_lon)*PI()*12656*cos (((@map_lat+@dwmap_lat)/2)*PI()/180)/180))
+
(((@map_lat - @dwmap_lat)*PI() * 12656/180) * ((@map_lat - @dwmap_lat)*PI() * 12656/180)))/2) * 1000 ,6)),0)
end
else --如果有一个为空值,则距离为0
begin
set @distance=0
end
return @distance
end
GO