【Matlab】根據經緯度計算兩點間的球面距離

【Matlab】根據經緯度計算兩點間的球面距離

來自專欄數學建模與數學實驗14 人贊了文章

做建模或者研究空間數據,可能會遇到「根據經緯度計算兩點間的球面距離」的問題,網上的資料很多,都是各種公式推導,但是一旦按公式編程計算,很可能得不到正確的距離。根本原因是在「角度-弧度的轉化」與「軟體語法」結合上出錯了。

為此,我梳理了兩種常用的計算方法,並用 Matlab 編程實現,保證能計算出正確的距離。

方法一:Great-Circle距離(基於球面餘弦公式)

計算公式為:

widehat{AB} = R cdot arccos ig( cos(A_w) cos(B_w) cos(B_j-A_j) +sin(A_w) sin(B_w) ig)

其中, R 為地球半徑,A_j, A_w 分別表示 A 點的經度、緯度; B_j, B_w 分別表示 B 點的經度、緯度。

公式的具體推導過程略(可參考文獻[1][2])

Matlab實現

先定義一個角度轉弧度的函數:

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

再定義計算Great-Circle距離的函數:

function d = SphereDist(x,y,R)%根據兩點的經緯度計算大圓距離(基於球面餘弦公式)%x為A點[經度, 緯度], y為B點[經度, 緯度]if nargin < 3 R = 6378.137;endx = 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公式

前面的球面餘弦公式中有 cos(B_j-A_j) 項,當兩點間距離很短時(比如相距幾百米的兩點),餘弦函數會得出 0.999cdotscdots 的結果,會導致較大的舍入誤差。Haversine 方法進行了某種變換消除了 cos(B_j-A_j) 項,能夠避免該問題。

實際上,以現在電腦軟體的一般計算精度,這已經不是問題。用計算器算可能有這個問題。

Haversine公式:

其中,

這裡, R 為地球半徑; varphi_1, , varphi_2 表示兩點的緯度;Delta lambda 表示兩點經度的差值。

公式的具體推導過程略(可參考文獻[2])

Matlab實現:

function d = SphereDist2(x,y,R)%根據兩點的經緯度計算大圓距離(基於Haversine公式)%x為A點[經度, 緯度], y為B點[經度, 緯度]if nargin < 3 R = 6378.137;endx = 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));function h = HaverSin(theta) h=sin(theta/2)^2;endend

註:嵌套了一個 HaverSin 函數。

測試:

%計算北京到天津的球面距離SphereDist([116.4,39.9], [117.2, 39.1]) SphereDist2([116.4,39.9], [117.2, 39.1])

運行結果:

參考文獻

[1] 根據兩點的經緯度求方位角和距離,等

cnblogs.com/lihaibo-Lea

[2] 地理空間距離計算及優化(根據兩個點經緯度計算距離),blog.csdn.net/u01100108

原創作品,轉載請註明。


推薦閱讀:

隔著天邊的距離,與你浪漫牽手
當愛情被<距離>阻擋
零距離看「殲-10飛機」
距離  文選
有「距離」的情侶能長久

TAG:經緯度 | 距離 | MATLAB |