【百度 map】数据库中知道两点坐标,查询出两点间的距离

本文介绍了两种SQL方法用于计算两点间的地理距离,并通过代码实现。包括公式解释、参数说明和示例函数。

方法一:

/*****************************************
百度坐标计算两点之间的距离


*********************************************/
CREATE FUNCTION [dbo].[f_GetDistance]
(
@lat1 DECIMAL(18,13),--小值
@lng1 DECIMAL(18,13),--大值
@lat2 DECIMAL(18,13),
@lng2 DECIMAL(18,13)
)
RETURNS decimal(18,2)
BEGIN
DECLARE @num decimal(18,13)
IF @lat1 is null or @lng1 is null
BEGIN
set @num=100000
END
ELSE
BEGIN
DECLARE  @pk DECIMAL(18,10) = 180 / 3.14169  
DECLARE @a1 DECIMAL(18,13);
DECLARE @a2 DECIMAL(18,13);
DECLARE @b1 DECIMAL(18,13);
DECLARE @b2 DECIMAL(18,13);
DECLARE @t1 DECIMAL(18,13);
DECLARE @t2 DECIMAL(18,13);
DECLARE @t3 DECIMAL(18,13);
DECLARE @tt DECIMAL(18,13);
DECLARE @tsum DECIMAL(18,13);

SET @a1 = @lat1 / @pk  
SET @a2 = @lng1 / @pk  
SET @b1 = @lat2 / @pk  
SET @b2 = @lng2 / @pk  
SET @t1 = cos(@a1) * cos(@a2) * cos(@b1) * cos(@b2)  
SET @t2 = cos(@a1) * sin(@a2) * cos(@b1) * sin(@b2)  
SET @t3 = sin(@a1) * sin(@b1) 
SET  @tsum = @t1 + @t2 + @t3
IF (@t1 + @t2 + @t3>1)
BEGIN
SET @tsum=1
END
IF (@t1 + @t2 + @t3<-1)
BEGIN
SET @tsum=-1
end

SET @tt = acos(@tsum)  
return 6366000 * @tt  
END
RETURN @num*1000;
END
GO


-----------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------






方法二:经测试有偏差

--查询两点间距离方法

CREATE FUNCTION F_GetDistance(@lng1 float,@lat1 float,@lng2 float,@lat2 float) RETURNS float
BEGIN
DECLARE @num float
set @num=2 * 6378.137 * ASIN(SQRT(POWER(SIN(PI() * (@lat1 - @lat2) / 360), 2) + COS(PI() * @lat1 / 180)* COS(@lat2* PI() / 180) * POWER(SIN(PI() * (@lng1 - @lng2) / 360), 2)));
RETURN @num*1000;
END

 

---------------注意参数顺序

create FUNCTION dbo.fnGetDistance
(
@LatBegin REAL
, @LngBegin REAL
, @LatEnd REAL
, @LngEnd REAL
)

RETURNS FLOAT
AS
BEGIN
DECLARE @Distance REAL
DECLARE @EARTH_RADIUS REAL
SET @EARTH_RADIUS =6378.137
DECLARE @RadLatBegin REAL, @RadLatEnd REAL, @RadLatDiff REAL, @RadLngDiff REAL
SET @RadLatBegin =@LatBegin * PI() / 180.0
SET @RadLatEnd =@LatEnd * PI() / 180.0
SET @RadLatDiff =@RadLatBegin - @RadLatEnd
SET @RadLngDiff =@LngBegin * PI() / 180.0 - @LngEnd * PI() / 180.0
SET @Distance = 2 *ASIN(SQRT(POWER(Sin(@RadLatDiff / 2), 2) + COS(@RadLatBegin) * COS(@RadLatEnd)* POWER(SIN(@RadLngDiff/2),2)))
SET @Distance =@Distance * @EARTH_RADIUS
SET @Distance =Round(@Distance * 10000,10) / 10000

--将千米单位改为米
RETURN @Distance*1000;
 
END

 

----注意参数顺序

CREATE function fn_GoogleMap
(
@lat1 float,
@lng1 float,
@lat2 float,
@lng2 float
)
returns float
AS
begin
declare @radLng1 float
declare @radLng2 float
declare @a float
declare @b float
declare @s float
set @radLng1=@lng1 * PI() / 180.0
set @radLng2=@lng2 * PI() / 180.0
set @a=@radLng1-@radLng2
set @b = (@lat1 - @lat2) * PI() / 180.0
set @s= 2 * Asin(Sqrt(Power(Sin(@a / 2), 2) + Cos(@radLng1) * Cos(@radLng2) * Power(Sin(@b / 2), 2))) * 6378.137
set @s = Round(@s * 10000,4) / 10000;

--将千米单位改为米
return @s
end

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感谢一路走过的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值