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

发表于:2021-1-13 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:今日头条

#
SQL
分享:
  今天给大家分享计算地球上两个坐标点之间里程不同数据库版本的脚本。
  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 

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号