根据两点经纬度计算距离

根据两点经纬度计算距离在实际应用当中,一般是通过一个个体的编码来查找该编码对应的地区中心的经纬度,然后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所计算的距离范围-等等)。用GPS测出两个点的经纬度后,如何计算这两个点之间的距离呢?设两点A、B的经、纬度分别为(jA,wA)(jB,wB),则半径为

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

用GPS测出两个点的经纬度后,如何计算这两个点之间的距离呢?

根据两点经纬度计算距离

 

设两点A、B的经、纬度分别为(jA,wA)(jB,wB),则半径为R的球面上两点间的最短距离(大圆弧)为:

弧AB=R*arccos[sin(wA)sin(wB)+cos(wA)cos(wB)*cos(jA-jB)]

地球是一个近乎标准的椭球体,它的赤道半径为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就是千米为单位。

如果仅对经度作正负的处理,而不对纬度作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

 

附:源代码
/** 
 * google maps的脚本里代码 
 */    
private const double EARTH_RADIUS = 6378.137; 
private static double rad(double d) 
{ 
     return d * Math.PI / 180.0; 
}  

/** 
 * 根据两点间经纬度坐标(double值),计算两点间距离,单位为米 
 */ 
public static double GetDistance(double lat1, double lng1, double lat2, double lng2) 
{ 
    double radLat1 = rad(lat1); 
    double radLat2 = rad(lat2); 
    double a = radLat1 - radLat2; 
    double b = rad(lng1) - rad(lng2); 
    double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + 
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2))); 
    s = s * EARTH_RADIUS; 
    s = Math.Round(s * 10000) / 10000; 
    return s; 
} 

原文地址:
http://xiaogui.org/get-distance-by-two-radius-of-latitude-and-longitude.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190211.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月25日 上午11:22
下一篇 2026年2月25日 下午12:01


相关推荐

  • 物业 小程序_智慧物业平台app安卓版

    物业 小程序_智慧物业平台app安卓版智慧小区小程序功能小区资讯展示小区最新的资讯和动态.让小区居民对小区的活动有全盘的了解.小区资讯详情.将对活动的具体情况.有一个更详尽的描述。物业通知由物业服务公司通过管理后台发布.能将最新的物业通知推送到用户手机桌面.实现物业管理信息的即时推送.点击即可查看详情。邮包提醒将以数字的方式,提醒住户有多少邮包在传达室尚未领取,领取完成后,该数字将自动归零。小区服务整合小区所有服务项目,如物业维修、超…

    2022年10月10日
    3
  • 密码学与网络安全第七版部分课后习题答案[通俗易懂]

    密码学与网络安全第七版部分课后习题答案[通俗易懂]第0章序言1.课后题汇总(仅部分)第一章思考题:1、2、4、5第二章习题:10、12、16第三章习题:9第四章思考题:4、5、6第五章习题:11第六章习题:2、6第七章思考题:2、3、4习题:4、7、8第八章习题:2第九章思考题:5、6习题:2、3第十章习题:1、2第十一章思考题:1、2、3第十二章思考题:1、3、4、7第十三章思考题:…

    2022年5月21日
    42
  • Lenovo windows 解决win键失灵

    Lenovo windows 解决win键失灵电脑突然win键就不能用了,实在太影响使用了!!!上网查了查,估计是把win键锁住了要解锁的话,好像不同的电脑不太一样我的电脑是lenovo的F9+Fn就能开关win键如果不可以的话,建议按住Fn键其他的组合键挨个试一下。…

    2022年5月9日
    66
  • 武侠金曲「建议收藏」

    十首香港武侠金曲唱出无限中国意境

    2022年4月13日
    42
  • 2019 Python最新面试题及答案16道题

    在Python相关的工作岗位面试中,基础语法是必考的一个部分,它考察求职者对Python语言的最基本掌握情况;其次是数据库相关的问题,如查询,修改,插入数据等,数据库所占的比重也很大,不容小觑。

    2022年1月18日
    73
  • 【STM32F407的DSP教程】第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)「建议收藏」

    【STM32F407的DSP教程】第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)「建议收藏」完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第48章STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)本章节讲解中值滤波器实现,适用于噪声和脉冲的过滤。目录48.1初学者重要提示48.2中值滤波器介绍48.3中值滤波器原理48.4Matlab中值滤波器实现48.5中值滤波器设计48.5.1函数MidFilter…

    2025年9月16日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号