前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库:计算地球上两个坐标点之间里程

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

原创
作者头像
IT技术分享社区
修改2021-03-08 09:56:48
8020
修改2021-03-08 09:56:48
举报
文章被收录于专栏:SQLServerIT技术分享社区

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

1、SQLServer脚本

代码语言:javascript
复制
–-计算地球上两个坐标点(经度,纬度)之间距离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脚本

代码语言:javascript
复制

–-计算地球上两个坐标点(经度,纬度)之间距离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脚本

代码语言:javascript
复制

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、SQLServer脚本
  • 2、MySQl脚本
  • 3、Orcale脚本
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档