matlab利用经纬度计算距离_【Matlab】根据经纬度计算两点间的球面距离

做建模或者研究空间数据,可能会遇到“根据经纬度计算两点间的球面距离”的问题,网上的资料很多,都是各种公式推导,但是一旦按公式编程计算,很可能得不到正确的距离。根本原因是在“角度-弧度的转化”与“软件语法”结合上出错了。

为此,我梳理了两种常用的计算方法,并用 Matlab 编程实现,保证能计算出正确的距离。

方法一:Great-Circle距离(基于球面余弦公式)

计算公式为:

其中,

为地球半径,

分别表示

点的经度、纬度;

分别表示

点的经度、纬度。

公式的具体推导过程略(可参考文献[1][2])

Matlab实现:

先定义一个角度转弧度的函数:

functionrad =D2R(theta)rad = theta*pi/180;

再定义计算Great-Circle距离的函数:

functiond =SphereDist(x,y,R)%根据两点的经纬度计算大圆距离(基于球面余弦公式)

%x为A点[经度, 纬度], y为B点[经度, 纬度]

if nargin < 3

R = 6378.137;

end

x = D2R(x);

y = D2R(y);

DeltaS = acos(cos(x(2))*cos(y(2))*cos(x(1)-y(1))+sin(x(2))*sin(y(2)));

d = R*DeltaS;

注:R 设为了默认参数,这里要吐槽一下 Matlab 在这方面的啰嗦,其他语言直接 SphereDist(x,y,R=6378.137) 就行了。

方法二:基于Haversine公式

前面的球面余弦公式中有

项,当两点间距离很短时(比如相距几百米的两点),余弦函数会得出

的结果,会导致较大的舍入误差。Haversine 方法进行了某种变换消除了

项,能够避免该问题。

实际上,以现在电脑软件的一般计算精度,这已经不是问题。用计算器算可能有这个问题。

Haversine公式:

其中,

这里,

为地球半径;

表示两点的纬度;

表示两点经度的差值。

公式的具体推导过程略(可参考文献[2])

Matlab实现:

functiond =SphereDist2(x,y,R)%根据两点的经纬度计算大圆距离(基于Haversine公式)

%x为A点[经度, 纬度], y为B点[经度, 纬度]

if nargin < 3

R = 6378.137;

end

x = D2R(x);

y = D2R(y);

h = HaverSin(abs(x(2)-y(2)))+cos(x(2))*cos(y(2))*HaverSin(abs(x(1)-y(1)));

d = 2 * R * asin(sqrt(h));

functionh =HaverSin(theta)h=sin(theta/2)^2;

end

end

注:嵌套了一个 HaverSin 函数。

测试:

%计算北京到天津的球面距离

SphereDist([116.4,39.9], [117.2, 39.1])

SphereDist2([116.4,39.9], [117.2, 39.1])

运行结果:

参考文献:

[1] 根据两点的经纬度求方位角和距离,等

原创作品,转载请注明。

相关推荐

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

weixin_39765100

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值