数据库:计算地球上两个坐标点之间里程

数据库:计算地球上两个坐标点之间里程

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

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

以上是分享内容,感谢阅读,欢迎收藏、点赞、转发。您的支持是我最大的创作动力,有问题可以留言大家共同进步!

IT技术分享社区

个人博客网站:https://programmerblog.xyz

数据库:计算地球上两个坐标点之间里程

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

上一篇:侯捷《C++面向对象开发》--复数类的实现


下一篇:函数返回值是否使用引用类型的问题:理解引用、返回值