计算两个经纬点的距离

php cookbook有一个计算两个经纬点的例子,代码就照着抄了一遍,多次检查,多次运行的结果都是略小于预期值的一半,楞是费了一番,才发现是经纬度参数的顺序反了,在英文里,是纬度在前,经度在后,不似耳熟的东经多少多少,北纬多少多少。既然到了这了,也学着梳理一下计算经纬点的数学步骤。对这个,园里softfair的博文很给力,图文对照,https://www.cnblogs.com/softfair/p/distance_of_two_latitude_and_longitude_points.html,是以此文仅是加深一下学习的印象。
(以下论述纯自我理解,必有错有误)地球的自转轴与公转平面约23.4的夹角,沿赤道线自转,受离心力和月球引力的影响,地球的赤道面略宽,两极略扁的不规则椭圆球体,表面地形的高低起伏,有山高海平,故而这里的经纬点计算仅是假想地球的规则的球体,忽略地形的近似结果,误差究竟有多少呢,有的说几米,有的说0.5%(若参照的是1km,0.5%就是5米,还对得上;若是参照实际距离的0.5%,比如超百公里,就偏差过大),海拔相差百米内,距离千公里内的两点,就想当然预计是10米内了,日常测距中可忽略不计。
一,HALF-VERSINE,就是sin角的一半,三角函数是初中就接触了的,也都荒废了,有个别的公式比较直观,一看之下就能想起来,比如这个sinθ2+cosθ2=1,还有这个sin(θ/2)^2=(1-cosθ)/2,后者转换一下就是sin(θ/2)=sqrt((1-cosθ)/2),这就是需要用到的HALF-VERSINE了。引用博文的图片很直观,就直接复制粘贴了。
二,平面圆通过半径和圆心角求弦

如图是设半径为1,弦长为L,等腰三角形作高垂直于弦,根据三角函数的定义,直观得到sin(θ/2)=1/2L,得L=2sin(θ/2)
三,球面上的两个点,坐标P1(lat1,lon1),p2(lat2,lon2),通过互换经纬度坐标,很容易得到另两个对称的点P3(lat1,lon2),P4(lat2,lon1),这四个就像刀切苹果一样,连起来就是去除了外弧线部分的梯形

经纬度有现实的意义的,两个点的度差,就是规则的角度差,经纬皆是,像经度是整个圆分布,就是0180度,球体的两面就是东经和西经;纬度由赤道开始沿向两极,就是半圆,是090度,视觉上下就是北纬和南纬。如引图,就理解到:角AOC是A点与C点的纬度差dlat。角EOF是经度E点和经度F点的差dlon,EF所在的线是赤道(equator),纬度是0。EF的距离是EF=2sin(dlon/2)。
既然角度有了,就根据三角函数的定义,得到弦AC的长度,AC=2
sin(dlat/2),弦BD和AC是等腰梯形对称的两个腰,故AC=BD(补充:OA和OC都是球体的半径哦,故三角形AOC是等腰的,由上文二的申明直观得到)。
对AD的弦长,引文详细,通过A点作垂线于赤道上的半径,由三角函数推得,这里简单的想当然一下,因赤道到两极的纬线是渐次缩小为零,直观上等价于呈余弦的曲率变化,姑A点上的半径就是赤道的半径rcos(lat1),设半径为1,就是cos(lat1),B点就是cos(lat2)。如此弦长AD= 2sin(dlon/2)cos(lat1),类推出CB=2sin(dlon/2)*cos(lat2)。

四,如图,现在需求得AD的弦长,以进一步获得AD的弧长。

AH^2 = AC^2 - CH^2 = AC^2 - (CB-AD)^2/4
HB= AD+CH = AD + (CB-AD)/2 = (CB+AD)/2
AB^2 = AH^2 + HB^2 = AC^2 - (CB-AD)^2/4 + (CB+AD)^2/4 = AC^2 + CB*AD

根据前面求得的AC、AD和CB的长度,代入公式得到:

AB^2 = 4(sin^2(dlat/2) + 4cos(lat1)cos(lat2)sin^2(dlon/2))

再需求得代表AB长度的角度AOB:

若规则球体,圆点到任意球面点的距离都是半径,前边已设r=1,则有

tan(<AOC) = AC/OC = (AB/2)/sqrt(1-(AB/2)^2)
∠AOC = arctan((AB/2)/sqrt(1-(AB/2)^2))
弧长AB = EARTH_RADIUS * ∠AOC = 2r * arctan((AB/2)/sqrt(1-(AB/2)^2))

到了这,问题看似解决了,只是和预期的表达式相差过大,是哪里没转换到吗?一时不了,还是动手运行一下看看:

多番调试纠错,排除了和cookbook上冲突的代码,得到的结果是预期的2倍,奇怪,哪里错了呢,再发现引文在得出最终结论时,用了这个表达:
弧长AB = EARTH_RADIUS * ∠AOC = 2r * arctan((AB/2)/sqrt(1-(AB/2)^2))
实际
c = 2 * arctan(sqrt(a)/sqrt(1-a)),
这一项说明c就是∠AOC全角的度数了,而不是半角,结论那根本不用乘二,怕是博主埋的瓜,修改至此得证引文的论述是成立的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何破局大文件远程跨国传输难题,实现业务高增长?

在全球化浪潮中,跨国合作已成为众多行业的常态。无论是医疗影像、基建数据、影视制作,还是跨国企业的日常运营,大文件远程跨国传输的需求日益增长。然而,网络延迟、带宽限制、数据安全等问题,常常让这一过程变得低效且充满风险。如何实现高效、安全、稳定的大文件远程跨国…

2023陇剑杯

数据分析-SS 1.黑客是使用什么漏洞来拿下root权限的 分析使用系统命令id之前的流量包,发现奇怪的传输上网搜索发现是CVE-2022-22965 2.黑客反弹shell的ip和端口是什么 分析后面的流量包,查看返回包明文192.168.43.128:2333 3.黑客的病毒名称是什么? 解压文件系统按照创建时间…

VMware Workstation 17.6.3 Pro macOS Unlocker OEM BIOS 2.7 for Linux - 在 Linux 上运行 macOS Sequoia

VMware Workstation 17.6.3 Pro macOS Unlocker & OEM BIOS 2.7 for Linux - 在 Linux 上运行 macOS SequoiaVMware Workstation 17.6.3 Pro macOS Unlocker & OEM BIOS 2.7 for Linux 在 Linux 上运行 macOS Sequoia 请访问原文链接:https://sysin.org/blog/vmware-w…

Zabbix 7.0 LTS OVF (build with LNMP based on Rocky 8.10) - VMware 虚拟机模板

Zabbix 7.0 LTS OVF (build with LNMP based on Rocky 8.10) - VMware 虚拟机模板Zabbix 7.0 LTS OVF (build with LNMP based on Rocky 8.10) - VMware 虚拟机模板 Zabbix 7.0 LTS | 企业级开源监控解决方案 请访问原文链接:https://sysin.org/blog/zabbix-7-ovf/ 查看最新版…

上班族的DeepSeek指南,厦门大学DeepSeek手册Ⅲ《DeepSeek企业应用实践》

上班族的DeepSeek指南,厦门大学DeepSeek手册Ⅲ《DeepSeek企业应用实践》随着DeepSeek的普及,无论是高校师生、上班族的小伙伴、政府工作人员还是面向社会大众人群,都能在各大高校的一系列手册中找到自己想要学习、了解的内容,这些手册面向大众群体深入浅出地讲解大模型概念…

买了CRM却不会用?5步教你从入门到精通

先问个问题:你的客户资料是不是还散落在Excel表里? 是不是每次找个客户信息都要翻半天? 销售跟进靠聊天记录,客户流失了都不知道咋回事?如果你有这些痛点,那么你可以试一试CRM系统了! CRM(客户关系管理系统)不是花里胡哨的工具,而是帮你提升业绩、减少客户流失、提高…

读DAMA数据管理知识体系指南10数据建模(中)

读DAMA数据管理知识体系指南10数据建模(中)1. 域 1.1. 在数据建模中,域(Domain)代表某一属性可被赋予的全部可能取值 1.2. 域可以用不同的方式来表达 1.3. 域提供了一种将属性特征标准化的方法 1.4. 域中所有的值都为有效的值1.4.1. 不在域中的值被称为无效的值1.4.2. 属性中…

markdown基础用法

内附图片均由Typora制作一:如何打出大标题-方式一:#空格标题,使用几个井号表示为几级标题 例如:一级标题 # 标题 二级标题 ## 标题以此类推。 !注意加空格很重要-方式二:使用快捷键CTRL+数字键123456 例如:CTRL+1即为一级标题,CTRL+2即为二级标题。 !注意:CTRL加0为正…

React—11—redux

一、redux概念 ◼ JavaScript开发的应用程序,已经变得越来越复杂了:  JavaScript需要管理的状态越来越多,越来越复杂;  这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等,也包括一些UI的状态,比如某些元素是否被选中,是否显示 加载动效,当前分页;…

ENSP中路由配置实验(静态路由、NAT转换、项目实例搭建)

一、实验一:静态路由配置 现在管理员拥有这三个路由的控制权 1、要求使得三个局域网下的主机能够互相访问,具体地址分配见下图2、操作遇到一个插曲,启动路由器时报40号错误,查阅官方技术文档进行自检修复无果 最后终于找到一个解决方案,来自哔哩哔哩视频下的某个评论 其实是…

欢迎屏幕和新的用户帐户设置;当前用户、欢迎屏幕(系统帐户)和新用户帐户的设置;注册表位置

欢迎屏幕和新的用户帐户设置下面显示的是当前用户、欢迎屏幕(系统帐户)和新用户帐户的设置(S)。当前用户显示语言:中文(简体)输入语言:简体中文(中国大陆)-微软拼音格式:简体中文(中国大陆)位置:中国欢迎屏幕显示语言:中文(简体)输入语言:简体中文(中国大陆)-微软拼音格…

Codeforces Round 757 (Div. 2)

我不知道为什么要补这一个远古场,但是确实里面几道题有点意思。C. Divan and bitwise operations 显然,我们可以得到整个序列的按位或就是所有 \(x\) 的按位或,设为 \(S\)。 如果 \(S\) 的第 \(i\) 位为 \(0\),贡献即为 \(0\)。 否则总有一个 \(1\),当中恰有一个对应贡献为…