根据经纬度计算距离公式

公式

对上面的公式解释如下:

  1. Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度;
  2. a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
  3. 6378.137为地球半径,单位为千米;
  4. 计算出来的结果单位为千米,若将半径改为米为单位则计算的结果单位为米。
  5. 计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下。

参数说明

lng:经度
lat:纬度
地球半径:6378.137(千米)

一般地图上显示的坐标顺序为,纬度在前(范围-90 ~ 90),经度在后(范围-180 ~ 180)

各种语言计算距离的代码

这种计算方式一般都是直线距离

sql语句

SELECT*,6378.138 * 2 * ASIN(SQRT(POW(SIN(('.$lat.' * PI() / 180 - lat * PI() / 180) / 2), 2) + COS('.$lat.' * PI() / 180) * COS(lat * PI() / 180) * POW(SIN(('.$lng.' * PI() / 180 - lng * PI() / 180) / 2), 2))) *1000 AS distance
FROMdistance
ORDER BYdistance ASC

php计算距离

/*** 根据两点间的经纬度计算距离* @param $lng1* @param $lat1* @param $lng2* @param $lat2* @return int*/
public static function getDistance($lng1, $lat1, $lng2, $lat2)
{//将角度转为狐度$radLat1 = deg2rad($lat1);//deg2rad()函数将角度转换为弧度$radLat2 = deg2rad($lat2);$radLng1 = deg2rad($lng1);$radLng2 = deg2rad($lng2);$a = $radLat1 - $radLat2;$b = $radLng1 - $radLng2;$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;return $s;
}

js求距离的方法

/*** 转换弧度* @param d* @returns {number}*/
function getRad(d){var PI = Math.PI;return d*PI/180.0;
}/*** 根据经纬度计算两点间距离* @param lng1* @param lat1* @param lng2* @param lat2* @returns {number|*}* @constructor*/
function CoolWPDistance(lng1,lat1,lng2,lat2){var f = getRad((lat1 + lat2)/2);var g = getRad((lat1 - lat2)/2);var l = getRad((lng1 - lng2)/2);var sg = Math.sin(g);var sl = Math.sin(l);var sf = Math.sin(f);var s,c,w,r,d,h1,h2;var a = 6378137.0;//The Radius of eath in meter.var fl = 1/298.257;sg = sg*sg;sl = sl*sl;sf = sf*sf;s = sg*(1-sl) + (1-sf)*sl;c = (1-sg)*(1-sl) + sf*sl;w = Math.atan(Math.sqrt(s/c));r = Math.sqrt(s*c)/w;d = 2*w*a;h1 = (3*r -1)/2/c;h2 = (3*r +1)/2/s;s = d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));if(s >= 1000 && s <= 99000){var kilometer = s/1000;s = kilometer.toFixed(1) + 'km';}else if(s > 99000){s = '>99km';}else{s = Math.round(s) + 'm';}// s = s/1000;// s = s.toFixed(2);//指定小数点后的位数。return s;
}

以上代码大部分来自网上收集,经过验证过的,可以使用

原理

根据两点经纬度计算距离

这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。

在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段,叫做纬线。我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬。北极就是北纬90度,南极就是南纬90度。纬度的高低也标志着气候的冷热,如赤道和低纬度地地区无冬,两极和高纬度地区无夏,中纬度地区四季分明。 其次,从北极点到南极点,可以画出许多南北方向的与地球赤道垂直的大圆圈,这叫作“经圈”;构成这些圆圈的线段,就叫经线。

公元1884平面坐标图年,国际上规定以通过英国伦敦近郊的格林尼治天文台的经线作为计算经度的起点,即经度零度零分零秒,也称“本初子午线”。在它东面的为东经,共180度;在它西面的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同一条经线。各国公定180度经线为“国际日期变更线”。

为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时略有偏离。 每一经度和纬度还可以再细分为60分,每一分再分为60秒以及秒的小数。利用经纬线,我们就可以确定地球上每一个地方的具体位置,并且把它在地图或地球仪上表示出来。

例如问北京的经纬度是多少?我们很容易从地图上查出来是东经116度24分,北纬39度54分。在大海中航行的船只,只要把所在地的经度测出来,就可以确定船在海洋中的位置和前进方向。 纬度共有90度。赤道为0度,向两极排列,圈子越小,度数越大。横线是纬度,竖线是经度。
当然可以计算,四元二次方程。 经度和纬度都是一种角度。经度是个两面角,是两个经线平面的夹角。因所有经线都是一样长,为了度量经度选取一个起点面,经1884年国际会议协商,决定以通过英国伦敦近郊、泰晤士河南岸的格林尼治皇家天文台(旧址)的一台主要子午仪十字丝的那条经线为起始经线,称为本初子午线。

本初子午线平面是起点面,终点面是本地经线平面。某一点的经度,就是该点所在的经线平面与本初子午线平面间的夹角。在赤道上度量,自本初子午线平面作为起点面,分别往东往西度量,往东量值称为东经度,往西量值称为西
经度。由此可见,一地的经度是该地对于本初子午线的方向和角距离。本初子午线是0°经度,东经度的最大值为180°,西经度的最大值为180°,东、西经180°经线是同一根经线,因此不分东经或西经,而统称180°经线。 纬度是个线面角。起点面是赤道平面,线是本地的地面法线。所谓法线,即垂直于参考扁球体表面的线。某地的纬度就是该地的法线与赤道平面之间的夹角。纬度在本地经线上度量,由赤道向南、北度量,向北量值称为北纬度,向南量值称为南纬度。由此可见,一地的纬度是该地对于赤道的方向和角距离。赤道是0°纬线,北纬度的最大值为90°,即北极点;南纬度的最大值为90°,即南极点。

经纬度互换

度(DDD):E 108.90593度 N 34.21630度

如何将度(DDD): 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?
转换方法是将108.90593整数位不变取108(度),用0.9059360=54.3558,取整数位54(分),0.355860=21.348再取整数位21(秒),故转化为108度54分21秒.

同样将度分秒(DMS):东经E 108度54分22.2秒 换算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度

因为计算时小数位保留的原因,导致正反计算存在一定误差,但误差影响不是很大。1秒的误差就是几米的样子。GPS车友可以用上述方法换算成自己需要的单位坐标。

经纬度换算成米

纬度分为60分,每一分再分为60秒以及秒的小数。

纬度线投射在图上看似水平的平行线,但实际上是不同半径的圆。有相同特定纬度的所有位置都在同一个纬线上。
赤道的纬度为0°,将行星平分为南半球和北半球。
纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N,位于赤道以南的点的纬度称南纬,记为S。
纬度数值在0至30度之间的地区称为低纬地区,纬度数值在30至60度之间的地区称为中纬地区,纬度数值在60至90度之间的地区称为高纬地区。
赤道、南回归线、北回归线、南极圈和北极圈是特殊的纬线。
纬度1秒的长度
地球的子午线总长度大约40008km。平均:
纬度1度 = 大约111km
纬度1分 = 大约1.85km
纬度1秒 = 大约30.9m

根据地球上任意两点的经纬度计算两点间的距离

地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。如果以0度经线为基 准,那么根据地球表面任意两点的经纬度就可以计算出这两点间的地表距离(这里忽略地球表面地形对计算带来的误差,仅仅是理论上的估算值)。设第一点A的经 纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三角推导,可以得到计算两点距离的如下公式:

C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180

这里,R和Distance单位是相同,如果是采用6371.004千米作为半径,那么Distance就是千米为单位,如果要使用其他单位,比如mile,还需要做单位换算,1千米=0.621371192mile

如果仅对经度作正负的处理,而不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应用意义)的处理,那么公式将是:

C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)Distance = R*Arccos(C)*Pi/180

以上通过简单的三角变换就可以推出。

如果三角函数的输入和输出都采用弧度值,那么公式还可以写作:

C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)Distance = R*Arccos(C)*Pi/180

也就是:

C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所 计算的距离范围-等等),所以,通过邮政编码查询经纬度这样一个数据库是一个很有用的资源。

mysql 下 计算 两点 经纬度 之间的距离 计算结果排序相关推荐

  1. mysql 单精度和双经度_mysql 下 计算 两点 经纬度 之间的距离 计算结果排序

    根据经纬度计算距离公式 公式 对上面的公式解释如下: Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung ...

  2. mysql 下 计算 两点 经纬度 之间的距离 含具体sql语句

    mysql取字段逗号分隔的第一个 cover字段为:(admin/LUpiEMD1Pk6U6B,admin/LUpiEMD1Pk6U6B,admin/LUpiEMD1Pk6U6B) 取逗号分隔第一个词 ...

  3. mysql 计算gps坐标距离_mysql 下 计算 两点 经纬度 之间的距离(转)

    公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/180-lat2* ...

  4. js计算两点经纬度之间的距离

    最近公司需要实现一个校验手机位置的经纬度,是不是在楼栋的经纬度范围的需求 记录一下cv知识 // 获取两个经纬度的距离 // 校验数据:A点:(112.91646300,28.17454050)B点: ...

  5. Python-计算两点经纬度之间的距离

    计算两点经纬度之间的距离 经纬度是利用三维球面空间来描述地球上一个位置的坐标系统,每个经纬度坐标由经度 lng 和纬度 lat 两个分量组成.经纬度的有效范围为经度-180度到+180度,纬度大约-9 ...

  6. 高德地图相关api使用计算两点地理坐标之间的距离

    利用腾讯地图api&计算两点地理坐标之间的距离 $key = 'key参数'; //腾讯地图开发自己申请 $mode = 'driving'; //driving(驾车).walking(步行 ...

  7. 两经纬度之间的距离计算

    以下是计算两经纬度之间距离的代码,分为:头文件.源代码和测试代码三部分. 具体如下: 1 // LatLonDistanceDlg.h : 头文件 2 // 3 4 #pragma once 5 6 ...

  8. 经纬度之间的距离计算

    来自谷歌地图的计算公式: 通过JAVA的Math类各种方法调用.实现上述公式 private static double EARTH_RADIUS = 6378.137;// 单位千米/*** 角度弧 ...

  9. java计算两个经纬度之间的距离

    前一阵项目中,有一个需求:是查找附近的人,其实就是查询某个距离内有多少用户.实现方式还是比较简单的,之前使用GeodeticCalculator计算经纬度误差在高德上与腾讯有点偏差,首先用户在APP上 ...

最新文章

  1. C++——包装器std::function与绑定器std::bind
  2. 一年75次上微博热搜!宇宙首富Tony老师上线!马斯克DIY发型
  3. 在CentOS 5.5下用OpenSSH构建SSH服务器(上)
  4. react native 学习笔记
  5. t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
  6. 基于特征选择的局部敏感哈希位选择算法
  7. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放
  8. 找礼物(find)(模拟)
  9. 第三方服务-极光推送
  10. 4款基于Django框架的开源软件推荐
  11. 【快捷键】—— 键盘篇
  12. C++ STL中vector的内存机制和性能分析
  13. 解决 css 浮动后 父元素高度失效问题
  14. windows 远程桌面连接(mstsc)删除下拉框的记录
  15. unbuntu 安装nginx
  16. spring mvc 文件上传、下载功能
  17. 【Redis】《Redis 开发与运维》笔记-汇总
  18. (usb转串口)CH340驱动安装失败的解决方案
  19. 教你如何合并pdf文件
  20. 图形推理题 答案揭晓

热门文章

  1. Vue中使用Axios传递数组参数给SpringBoot后台时的实现方式
  2. Itext实现导出PDF常用方法说明
  3. SpringBoot项目启动提示:An attempt was made to call the method org.apache.coyote.AbstractProtocol.setAccept
  4. python属性使用教程_Python对象的属性访问过程详解
  5. php自定义中文分词方法,PHPAnalysis中文分词类详解
  6. 神策数据荣获北京市广播电视局优秀推荐项目
  7. 策小编脑中的“私有化部署”
  8. 2017-2018-20172309 《程序设计与数据结构》第八周学习总结
  9. 前端小白的 docker 配置nginx踩坑之旅
  10. 大数据数据库技术简介与分类分析