根据两点经纬度计算距离

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


相关推荐

  • 漂亮的复制零_一张图片有很多小图片组成

    漂亮的复制零_一张图片有很多小图片组成前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存10倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析I/O工作方式,以及如何优化传输文件的性能。正文为什么要有DMA技术?在没有DMA技术前,I/O的过程是这样的:CPU发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到..

    2022年9月21日
    5
  • IDEA 2018 2020 2021 2022 各版本对Maven版本兼容问题汇总「建议收藏」

    IDEA 2018 2020 2021 2022 各版本对Maven版本兼容问题汇总「建议收藏」IDEA2022兼容maven3.8.1及之前的所用版本IDEA2021兼容maven3.8IDEA2018202020212022各版本对Maven版本兼容问题汇总Maven3.6.3版本兼容问题错误信息如下:1.IDEA2021兼容maven3.8.1及之前的所用版本2.IDEA2020兼容Maven3.6.3及之前所有版本3.IDEA2018兼容Maven3.6.1及之前所有版本IDEA2022兼容maven3.8.1及之前的所用版本

    2022年8月22日
    79
  • Meta标签详解

    Meta标签详解

    2021年8月8日
    95
  • Python进制转换与ASCII转换

    Python进制转换与ASCII转换本文结合实际应用和刷Leetcode总结了Python的一些常用的方法一、字符串二、列表三、字典其他input()用于获取用户的输入值,返回一个字符串类型例:msg=input(‘请输入值’)…

    2022年5月19日
    42
  • FIREBIRD使用经验总结

    FIREBIRD使用经验总结

    2021年7月30日
    65
  • 外链图床-PicGo-Gitee

    外链图床-PicGo-Gitee前言刚开始写建立博客的时候,头疼过图片该如何处理:直接放github的仓库里吧。可是随着图片越来越多,每次pull、clone都需要耗费大量的时间。而且github的仓库加载很慢,影响博客的流畅性。外链图床吧。可是国内基本上没有什么好用的免费图床,七牛云之类的都需要收费的。国外的图床加载速度又是特别的慢。自己搭建。图床搭建所使用的工具为PicGo、Gitee、Typora.在这之前,我一般在VSCode上面写Markdown文档,但是现在开始添加图片到博客中去,转而使用Typora,以便

    2022年6月21日
    37

发表回复

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

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