文档章节

关于已知两点经纬度求球面最短距离的公式推导

LoSingSang
 LoSingSang
发布于 01/15 14:04
字数 1230
阅读 1
收藏 0
COS

已知两点经纬度计算球面距离的公式,一搜一大堆,形式如下:

可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个大致的说明,红色的半圆表示赤道,蓝色的圆弧表示本初子午线(也就是经度为0的子午线)。球最上方是北极点,点A和点B分别为要计算的两个点,坐标分别为AjA,wA)和BjBwB)。

1 示意图

 

再开始推导之前,我们需要在图中绘制一些辅助线,便于后面的描述和推导。如图1所示,AjA,wA),BjB,wB)两点分别为球面上的两点,坐标为经纬度表示。延AB两点分别做垂直于赤道平面的垂线交赤道面为CD两点。连接CD两点,然后过ACD的平行线交BD与点E。至此,所有的辅助线绘制完毕。假设地球为一个规则的圆球,半径为R(其实地球是一个椭球体,赤道的半径比极地的半径稍微大一点点)。

第一步:确定已知条件,

 

第二步:在直角和直角中有:

 

第三步:在平面ABCD中,有:

 

第四步:在直角中,使用勾股定理可以得到AB的直线长度。如下:

 

第五步:这里需要引入一个公式(5),就是大名鼎鼎的余弦定理,假设三角形的三个角为A,B,C,则有:

把上面的公式(1)、(2)、(3)、(5)带入(4)中,然后整理可以得到:

 

最后,通过整理得到AB之间的直线距离为:

第六步:我们已经知道AB的直线距离,那么AB的弧长距离可以先通过计算中对应的圆心角,然后用弧长公式计算出来。这里在依旧使用余弦定理公式(5),经过变形可以得到:

 

把式(6)带入式(7),化简得到:

 

最终,我们得到了一个关于圆心角的余弦值的公式:

 

第七步:知道圆心角,计算弧长的公式很简单,使用半径乘以圆心角(弧度单位)即可:

 

所以最后我们就得到了球面上AB的距离应该是:

最后使用公式(10)就可以编写代码来计算球面上任意两点间的最短距离了。这里使用的是一个规则的球来代替的椭球的,肯定会有误差的,一般都用这个公式来进行计算。代码就不写了,也就一两句话就出来了。最后需要注意的就是,需要把经纬度都化成弧度单位。

…………………………………………………华丽的分割线………………………………………………
……………………………………
以下内容更新于2013130…………………………………………

昨天使用立体几何的知识推导了一下球面两点的距离公式,发现比较复杂,今天想到一个简单的方法,使用空间直角坐标系来推导,很方便。首先我们需要建立一个空间坐标系:在赤道平面内,X轴由球心O指向本初子午线,Y轴在赤道平面内垂直于X轴,Z轴垂直于赤道平面朝向北极。还是假设AB两点的经纬度坐标为:AjAwA),BjBwB)。由该坐标系的定义以及经纬度的定义可以把上面的AB两点的坐标转换为该坐标系中的坐标如下:

 

由两点距离公式可以得到AB的直线距离为:

 

对于球面上的任意一个点(XYZ),都有:

 

把上面的公式整理就可以得到(下面用到了一个积化和差公式):

 

好了,大功告成,是不是比用立体几何要简单的多。接下来就是用上面的弦长和弧长的关系来计算AB的弧长就可以了。

 

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/7634151.html,如需转载请自行联系原作者

----------------------------------------------------------------------------------------------------------------


MySQL按经纬度距离查询某点周围按距离排序的点

SELECT id,longitude,latitude,6378.138*ACOS(COS(0*PI()/180)*COS(latitude*PI()/180)*COS(longitude*PI()/180-0*PI()/180)+SIN(0*PI()/180)*SIN(latitude*PI()/180)) as juli
FROM user_infos
ORDER BY juli DESC;

本文转载自:http://www.cnblogs.com/zhoug2020/p/7634151.html?tdsourcetag=s_pctim_aiomsg

共有 人打赏支持
LoSingSang
粉丝 3
博文 62
码字总数 29869
作品 0
深圳
程序员
私信 提问
[算法系列]算法一 地理空间距离计算优化

1. 地理空间距离计算面临的挑战 打开美团app,不管是筛选团购还是筛选商家,默认的排序项都是“离我最近”或者“智能排序”(如下图所示): 不管是“离我最近”还是“智能排序”,都涉及到计...

sjf0115
2017/11/15
0
0
spring计算方圆300km内其它城市(附完整代码)

最近工作需要,页面展示某个城市附近300km范围内所有的其它城市。找了半天也没有合适的方法,这里给出一种解决方法,如果有更好的,请不吝赐教。 一、准备工作 问题抽象:求城市300km范围内所...

lkee6760
2017/11/27
0
0
根据给定点的经纬度和特定距离取范围类的数据

一、计算两个经纬度的距离 根据经纬度计算距离 R为地球半径,可取平均值 6371km; φ1, φ2 表示两点的纬度; Δλ 表示两点经度的差值。 二、根据某一经纬度和距离计算附近的经纬度 R为地球...

南烟阁
2017/11/28
0
0
geohash查找附近的人-1

查找附近的人是移动开发非常流行的功能,不但可以用于普通应用开发,也可以用于游戏开发。本人主要简单运用流行的geohash算法来简单实现查找附近的人功能,并制作一个模拟环境,使用Unity和原...

安世博
2015/10/23
1K
0
php 计算两点地理坐标的距离

功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。 获取两点坐标距离: <?php/** * 计算两点地理坐标之间的距离 * @param Decimal $longitude1 起点经度 * @par...

蜗牛奔跑
2016/03/07
11
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
12
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部