前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >根据两经纬度点计算距离公式推导

根据两经纬度点计算距离公式推导

原创
作者头像
囚兔
修改于 2019-01-30 06:00:46
修改于 2019-01-30 06:00:46
4.8K0
举报
文章被收录于专栏:IT杂记IT杂记

问题

已知地球上的点E经纬度为(J1, W1),点F经纬度为(J2, W2),求两点间最短的球面距离。

推导

步骤1

假设地球是一个标准的球体,设球心为O, 地球半径为r。

earth_2_point_distance1.png
earth_2_point_distance1.png

线段OE, OF, EF构成一个等腰三角形,OE=OF=r,定义∠EOF弧度为δ,定义E,F两点的最短球面距离为L

则有:

L= r*δ

根据余弦定理有:

cosδ=\frac {OE^2+OF^2-EF^2} {2*OE*OF}

将OE=OF=r代入得:

cosδ=1-{\frac {EF^2} {2*r^2} }
δ=arccos(1-{\frac {EF^2} {2*r^2} })

最后可得:

L=r*arccos(1-{\frac {EF^2} {2*r^2} }) \tag{1}

步骤2

下面来求EF。

earth_2_point_distance.png
earth_2_point_distance.png

图中,B点为北极点,C点和D点位于赤道上,OB,OC,OD构造空间直角坐标系,OCD即赤道面。过E点做垂线垂直于面OCD交于E1点,过F点做垂线垂直于面OCD交于F1点,过F点做垂线垂直于线EE1于F2点。

定义\angle EOE_1弧度为α,\angle FOF_1弧度为β,\angle E_1OF_1弧度为γ,其实α即为E点的纬度弧度,β即为F点的纬度弧度,γ即为F点和E点的经度差的弧度。

勾股定理有:

EF^2=EF_2 ^2 + FF_2 ^2

又有:

EF_2=EE_1-FF_1
FF_2=E_1F_1

则有:

EF^2=(EE_1-FF_1)^2 + E_1F_1^2 \tag{2}

\angle OE_1E\angle OF_1F为直角,则有:

EE_1 = OE*sinα = r*sinα \tag{3}
FF_1 = OF*sinβ = r*sinβ \tag{4}

根据余弦定理有:

E_1F_1^2=OE_1^2 + OF_1^2 - 2*OE_1*OF_1*cosγ

又有:

OE_1=OE*cosα=r*cosα
OF_1=OF*cosβ=r*cosβ

则有:

E_1F_1^2=r^2*cos^2α + r^2*cos^2β - 2r^2*cosα*cosβ*cosγ
E_1F_1^2=r^2(cos^2α + cos^2β - 2*cosα*cosβ*cosγ) \tag{5}

将公式 (3),(4),(5)代入 (2),并整理得:

EF^2=r^2(sin^2α+cos^2α) + r^2(sin^2β+cos^2β) - 2r^2sinαsinβ - 2r^2cosαcosβcosγ
EF^2=2r^2(1 - sinαsinβ - cosαcosβcosγ)

代入公式(1)得:

L=r*arccos(sinαsinβ + cosαcosβcosγ)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Redis在秒杀场景的作用
秒杀可分成秒杀前、秒杀中和秒杀后三阶段,每个阶段的请求处理需求不同,Redis具体在秒杀场景的哪个环节起到作用呢?
JavaEdge
2023/02/13
8140
Redis在秒杀场景的作用
分布式锁:5个案例,附源码
常见的synchronized、Lock等这些锁都是基于单个JVM的实现的,如果分布式场景下怎么办呢?这时候分布式锁就出现了。
田维常
2021/11/26
5220
✅日活3kw的实际库存业务场景中的超卖到底怎么解决的
这个问题其实可以说是随便一百度几乎可以出来全是解决方案,其实超卖问题再实际业务场景中是十分复杂的。没有什么绝对的解决方案。都是因人而异的。
@派大星
2024/03/08
2660
糟糕,线上库存竟然变成负500。。。
根本原因:数据库的查询和更新操作,不是原子性校验,多个事务可能同时通过stock>0的条件检查。
苏三说技术
2025/04/16
860
糟糕,线上库存竟然变成负500。。。
从扣减库存场景来讲讲redis分布式锁中的那些“坑”
代码的逻辑很简单,就是从redis里拿到一个key为stock的键值对,然后判断其值在大于0的情况下进行减一操作,之后再将这个键值对重新存储,这里模拟的是下单减商品库存这么一个场景。
别惹CC
2025/05/27
800
Redis应用—4.在库存里的应用
7.库存扣减时"基于库存分片依次扣减 + 合并扣减 + 扣不了返还 + 异步落库"的实现
东阳马生架构
2025/03/05
1050
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
先来回顾一下: 我们前面为了解决锁因异常情况(例如执行完加锁逻辑服务宕机了)未执行到释放,从而造成锁一直被占用的情况。而为了解决这个问题,我们给每个锁加上了过期时间,但是这又引申出了新的问题:如果锁到期了,而业务还没执行完,此时就给释放了,锁又被新的线程拿到了,那么就又会产生并发问题了。所以,我们是不希望锁在一定时间后自动过期掉的。那么,为了解决这个问题,我们应该在线程拿到锁后一直延长过期时间,直到业务执行完成后才释放这把锁。我们分析下可以怎么做:
别惹CC
2025/02/27
1830
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
带你一步步用php实现redis分布式、高并发库存问题
开始正文, 有任何疑问都可以在评论区留言,以laravel5.8框架为基础来编写业务逻辑。
友儿
2022/09/11
1.6K0
带你一步步用php实现redis分布式、高并发库存问题
拼多多二面:高并发场景扣减商品库存如何防止超卖?
相信大家都参与过某某电商的抢购活动,那么大家有没有思考过,在高并发场景下,如何防止商品超卖?这里需要注意哪些问题?
码哥字节
2025/03/11
1820
拼多多二面:高并发场景扣减商品库存如何防止超卖?
Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用
数据库自增指的是单独使用数据库中某一张表来专门存放主键,当我们需要的时候,只需要提前从该表中读取出一批主键集合,缓存在内存中即可,但是该方法显然太慢了,因此不推荐使用
大忽悠爱学习
2022/05/09
7970
Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用
Redis分布式锁
上一章节我提到了基于zk分布式锁的实现,这章节就来说一下基于Redis的分布式锁实现吧。
Vincent-yuan
2021/09/26
7510
Redis分布式锁
Redis解决秒杀下单
上述就是实现最基本的优惠卷下单功能。当然真实的业务场景绝对不会是向我们这么简单的。
用户11097514
2024/05/30
1810
Redis解决秒杀下单
如何使用Redis实现电商系统的库存扣减?
在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。
好好学java
2021/03/29
3.2K0
分布式锁(数据库、Redis、ZK)拍了拍你
标题使用最近异常火热的微信拍一拍的方式命名,最近拍一拍的玩法被各位网友玩坏了,出现了各种版本的拍一拍。
用户4172423
2020/09/22
3010
分布式锁(数据库、Redis、ZK)拍了拍你
分布式锁:数据库、Redis、ZK
分布式锁的实现方式有以下三种方式:「数据库分布式锁、Redis实现分布式锁、ZooKeeper实现分布式锁」。
用户6884826
2021/07/08
9120
Redis高并发分布式锁详解
  1.为了解决Java共享内存模型带来的线程安全问题,我们可以通过加锁来保证资源访问的单一,如JVM内置锁synchronized,类级别的锁ReentrantLock。
忧愁的chafry
2022/10/30
1.2K0
Redis高并发分布式锁详解
订单抢购系统详细设计方案
上一篇文章中,我们介绍了订单系统秒杀与抢购的设计原则、挑战及常用方案。 本文就来介绍一个现实可行且实际工作的秒杀流程详细设计,以及面临的各种问题与应对方案。
用户3147702
2022/06/27
1.5K0
订单抢购系统详细设计方案
Redis进阶学习04---秒杀优化和消息队列
如果一个饭店只有一个服务员,并且这个服务员不仅需要负责客人的点餐服务,还需要负责炒菜服务,显然这样的话,只能是先处理完第一个客人所有的点餐,烧菜任务后,才能去处理下一个客人的点餐,烧菜任务,这样显然把任务给串行化了,效率大大降低。
大忽悠爱学习
2022/05/09
1.1K0
Redis进阶学习04---秒杀优化和消息队列
并发扣减库存方案二
上一篇<<并发扣减库存方案一>>中使用了基于CAS和幂等思想, 使用当前值和期望值比较以及版本号变更比较来完成并发场景下 控制库存不被少扣或者扣减成负值, 此篇幅使用另外一个思路解决并发修改库存的问题, 利用redis单线程阻塞操作特性,以及redis执行lua脚本原子性, 来完成控制并发场景下库存扣减问题;首先简单 介绍一下此方案用到的一些redis和lua的特性: 1.redis阻塞操作 鉴于redis自身独有特性,我们知道redis执行命令是阻塞操作 (单进程单线程),举例说明:A服务向redis发送
叔牙
2020/11/19
1.4K0
并发扣减库存方案二
互联网那些事儿 | 秒杀库存解决方案
电商系统中秒杀是一种常见的业务场景需求,其中核心设计之一就是如何扣减库存。本篇主要分享一些常见库存扣减技术方案,库存扣减设计选择并非一味追求性能更佳,更多的应该考虑根据实际情况来进行架构取舍。在商品购买的过程中,库存的抵扣过程通常包括以下步骤:
Java研究者
2023/08/14
2K0
互联网那些事儿 | 秒杀库存解决方案
推荐阅读
相关推荐
Redis在秒杀场景的作用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档