经纬度计算函数

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

 

posted @ 2022-01-05 11:59  念梦  阅读(219)  评论(0)    收藏  举报