云服务器

数据库实用脚本:计算地球上两个坐标点之间的里程

2021-01-13 10:58:27 10

今天给大家分享计算地球上两个坐标点之间里程不同数据库版本的脚本。

 

1、SQLServer脚本

–-计算地球上两个坐标点(经度,纬度)之间距离sql函数  
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 
RETURN @Distance 
END 
--使用方法如下: 
SELECT dbo.fnGetDistance(25,30,12.56,15.5) ; 

 

2、MySQl脚本

–-计算地球上两个坐标点(经度,纬度)之间距离sql函数  
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 
RETURN @Distance 
END 
--使用方法如下: 
SELECT dbo.fnGetDistance(25,30,12.56,15.5) ; 

 

3、Orcale脚本

CREATE OR REPLACE FUNCTION GetDistance 
(lat1 number, lng1 number,lat2 number,lng2 number)  
RETURN NUMBER is  
  earth_padius number := 6378.137;  
  radLat1      number := Radian(lat1);  
  radLat2      number := Radian(lat2);  
  a            number := radLat1 - radLat2;  
  b            number := Radian(lng1) - Radian(lng2);  
  s            number := 0;  
begin  
  s := 2 *  
       Asin(Sqrt(power(sin(a / 2), 2) +  
                 cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));  
  s := s * earth_padius;  
  s := Round(s * 10000) / 10000;  
  return s;  
end;  
--使用方法 
select GetDistance(25,30,12.56,15.5) from dual 

文章来源:今日头条

上一篇: 无

微信关注

获取更多技术咨询