利用经纬度求解两点球面距离(Haversine formula)

利用经纬度求解两点球面距离


Haversine formula

h ( θ ) = s i n 2 ( θ 2 ) = 1 − c o s ( θ ) 2 h(\theta)=sin^2(\frac{\theta}{2})=\frac{1-cos(\theta)}{2} h(θ)=sin2(2θ)=21cos(θ)

h ( θ ) = h ( d R ) = h ( Δ β ) + c o s ( β 1 ) c o s ( β 2 ) h ( Δ α ) h(\theta)=h(\frac{d}{R})=h(\Delta \beta)+cos(\beta_1)cos(\beta_2)h(\Delta \alpha) h(θ)=h(Rd)=h(Δβ)+cos(β1)cos(β2)h(Δα)

  • R 表 示 球 面 半 径 , d 表 示 球 面 距 离 , θ 表 示 两 点 与 圆 心 夹 角 弧 度 R表示球面半径,d表示球面距离,\theta表示两点与圆心夹角弧度 R,d,θ
  • α i 分 别 表 示 两 点 经 度 , β i 表 示 两 点 维 度 , Δ 表 示 差 值 \alpha_i分别表示两点经度,\beta_i表示两点维度,\Delta表示差值 αi,βi,Δ
  • 公式全称应该为 h a l f − v e r s i n e half-versine halfversine,即 v e r s i n e : 1 − c o s ( θ ) 的 一 半 versine: 1-cos(\theta)的一半 versine:1cos(θ)
  • 计算时可进一步化解: c o s ( θ ) = s i n ( β 1 ) s i n ( β 2 ) + c o s ( β 1 ) c o s ( β 2 ) c o s ( Δ α ) cos(\theta)=sin(\beta_1)sin(\beta_2)+cos(\beta_1)cos(\beta_2)cos(\Delta \alpha) cos(θ)=sin(β1)sin(β2)+cos(β1)cos(β2)cos(Δα)

在这里插入图片描述

这里求 A B ⌢ \overset{\frown}{AB} AB,显然求得 ∣ A B ∣ |AB| AB即可

O E F OEF OEF为例, ∠ O E F = Δ α , ∣ E F ∣ = 2 s i n ( Δ α 2 ) \angle OEF=\Delta \alpha,|EF|=2sin(\frac{\Delta \alpha}{2}) OEF=Δα,EF=2sin(2Δα)R,同理利用维度 ∣ A C ∣ = 2 s i n ( Δ β 2 ) R |AC|=2sin(\frac{\Delta \beta}{2})R AC=2sin(2Δβ)R

而对于 ∣ B C ∣ , ∣ A D ∣ |BC|,|AD| BC,AD A G ⊥ O E , B H ⊥ O E AG\perp OE,BH \perp OE AGOE,BHOE可得: ∣ A D ∣ = 2 s i n ( Δ α 2 ) ( ∣ O E ∣ c o s ( ∠ A O G ) ) = 2 s i n ( Δ α 2 ) R c o s ( β 1 ) |AD|=2sin(\frac{\Delta \alpha}{2})(|OE|cos(\angle AOG))=2sin(\frac{\Delta \alpha}{2})Rcos(\beta_1) AD=2sin(2Δα)(OEcos(AOG))=2sin(2Δα)Rcos(β1)

而四边形 A C B D ACBD ACBD为等腰梯形形

C H = B C − A D 2 , A B 2 = B H 2 + A H 2 = ( B C − C H ) 2 + A C 2 − C H 2 = A C 2 + B C ∗ A D CH=\frac{BC-AD}{2},AB^2=BH^2+AH^2=(BC-CH)^2+AC^2-CH^2=AC^2+BC*AD CH=2BCAD,AB2=BH2+AH2=(BCCH)2+AC2CH2=AC2+BCAD

∣ A B ∣ 2 = 4 s i n 2 ( Δ β 2 ) R 2 + 4 s i n 2 ( Δ α 2 ) c o s ( β 1 ) c o s ( β 2 ) R 2 |AB|^2=4sin^2(\frac{\Delta \beta}{2})R^2+4sin^2(\frac{\Delta \alpha}{2})cos(\beta_1)cos(\beta_2)R^2 AB2=4sin2(2Δβ)R2+4sin2(2Δα)cos(β1)cos(β2)R2

而要求解的 θ = ∠ A O B , ∣ A B ∣ 2 = 4 s i n 2 ( θ 2 ) R 2 \theta=\angle AOB,|AB|^2=4sin^2(\frac{\theta}{2})R^2 θ=AOB,AB2=4sin2(2θ)R2

得到目标公式 h ( θ ) = h ( Δ β ) + c o s ( β 1 ) c o s ( β 2 ) h ( Δ α ) , A B ⌢ = d = R θ h(\theta)=h(\Delta \beta)+cos(\beta_1)cos(\beta_2)h(\Delta \alpha),\overset{\frown}{AB}=d=R\theta h(θ)=h(Δβ)+cos(β1)cos(β2)h(Δα),AB=d=Rθ

进一步化解 1 − c o s ( θ ) = 1 − c o s ( Δ β ) + c o s ( β 1 ) c o s ( β 2 ) ( 1 − c o s ( Δ α ) ) 1-cos(\theta)=1-cos(\Delta\beta) +cos(\beta_1)cos(\beta_2)(1-cos(\Delta \alpha)) 1cos(θ)=1cos(Δβ)+cos(β1)cos(β2)(1cos(Δα))

c o s ( Δ β ) = c o s ( β 1 ) c o s ( β 2 ) + s i n ( β 1 ) s i n ( β 2 ) cos(\Delta \beta)=cos(\beta_1)cos(\beta_2)+sin(\beta_1)sin(\beta_2) cos(Δβ)=cos(β1)cos(β2)+sin(β1)sin(β2)

可得 c o s ( θ ) = s i n ( β 1 ) s i n ( β 2 ) + c o s ( β 1 ) c o s ( β 2 ) c o s ( Δ α ) cos(\theta)=sin(\beta_1)sin(\beta_2)+cos(\beta_1)cos(\beta_2)cos(\Delta \alpha) cos(θ)=sin(β1)sin(β2)+cos(β1)cos(β2)cos(Δα)

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在MATLAB中,可以使用haversine公式来计算两个经纬度坐标之间的球面距离。具体步骤如下: 1. 首先,将经纬度坐标转换为弧度制。这可以通过将经纬度值除以180再乘以π来实现。 2. 然后,使用haversine公式来计算球面距离。haversine公式如下: d = 2 * R * asin(sqrt(sin((lat2-lat1)/2)^2 + cos(lat1) * cos(lat2) * sin((lon2-lon1)/2)^2)) 其中,d是距离,R是地球的半径(一般情况下为6371千米),lat1和lon1是第一个点的纬度和经度,lat2和lon2是第二个点的纬度和经度。 3. 最后,根据需要可以将距离换算为其他单位。 下面是一个MATLAB代码示例,可以根据上述步骤计算两个经纬度坐标之间的球面距离: ```matlab function distance = calculateDistance(lat1, lon1, lat2, lon2) R = 6371; % 地球半径,单位:千米 % 将经纬度转换为弧度制 lat1 = deg2rad(lat1); lon1 = deg2rad(lon1); lat2 = deg2rad(lat2); lon2 = deg2rad(lon2); % 使用haversine公式计算球面距离 dlat = lat2 - lat1; dlon = lon2 - lon1; a = sin(dlat/2)^2 + cos(lat1) * cos(lat2) * sin(dlon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = R * c; end ``` 使用这个函数,可以通过传入经纬度坐标调用该函数来计算两点之间的球面距离。例如: ```matlab lat1 = 31.21563; lon1 = 121.50891; lat2 = 39.90420; lon2 = 116.40740; distance = calculateDistance(lat1, lon1, lat2, lon2); disp(distance); % 输出球面距离,单位:千米 ``` 运行以上代码,将会输出上海和北京之间的球面距离约为1030千米。 ### 回答2: 在Matlab中,计算两点之间的球面距离可以利用Haversine公式。该公式基于经纬度坐标系,以一个球体来近似地描述地球的形状,计算两点之间的弧长。以下是一个实现该功能的简单示例代码: ```matlab function distance = computeDistance(lat1, lon1, lat2, lon2) % 地球的平均半径(单位:千米) radius = 6371; % 将角度转换为弧度 lat1 = deg2rad(lat1); lon1 = deg2rad(lon1); lat2 = deg2rad(lat2); lon2 = deg2rad(lon2); % 计算两点间的差值 dlat = lat2 - lat1; dlon = lon2 - lon1; % 使用Haversine公式计算球面距离 a = sin(dlat/2)^2 + cos(lat1) * cos(lat2) * sin(dlon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = radius * c; end ``` 在上述代码中,`lat1`和`lon1`表示第一个坐标点的纬度和经度,`lat2`和`lon2`表示第二个坐标点的纬度和经度。最终,函数返回两点之间的球面距离。注意,这里使用的是地球的平均半径,该值为6371公里。 你可以调用这个函数并传入相应的经纬度数据,以计算得到两点之间的球面距离。 ### 回答3: 在Matlab中,我们可以使用Haversine公式来计算两点之间的球面距离,该公式适用于两点之间的直线距离小于200km的情况。首先,我们需要获取两个点的经纬度坐标。 假设点A的经纬度坐标为(A_lat, A_lon),点B的经纬度坐标为(B_lat, B_lon),则可以使用以下代码计算两点之间的球面距离: ```matlab function distance = calculateDistance(A_lat, A_lon, B_lat, B_lon) R = 6371; % 地球半径(单位:km) % 将角度转换为弧度 lat1 = deg2rad(A_lat); lon1 = deg2rad(A_lon); lat2 = deg2rad(B_lat); lon2 = deg2rad(B_lon); % 使用Haversine公式计算球面距离 delta_lat = lat2 - lat1; delta_lon = lon2 - lon1; a = sin(delta_lat/2)^2 + cos(lat1) * cos(lat2) * sin(delta_lon/2)^2; c = 2 * atan2(sqrt(a), sqrt(1-a)); distance = R * c; end ``` 使用上述函数即可计算两个经纬度坐标点之间的球面距离。函数参数A_lat、A_lon分别表示点A的纬度和经度,B_lat、B_lon表示点B的纬度和经度。最后,返回的距离单位为千米(km)。 例如,我们可以调用该函数进行实际计算: ```matlab A_lat = 39.9042; A_lon = 116.4074; B_lat = 31.2304; B_lon = 121.4737; distance = calculateDistance(A_lat, A_lon, B_lat, B_lon); disp(distance); % 输出两个点之间的球面距离(单位:km) ``` 通过以上示例,我们可以用Matlab计算任意两点间的球面距离。注意,如果两点之间的直线距离大于200km,我们应该使用其他更精确的球面距离计算方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值