空間權(quán)重矩陣的那些事(八)-球面距離權(quán)重矩陣

前段時(shí)間有人向我咨詢(xún)了根據(jù)經(jīng)緯度計(jì)算球面距離的方法,希望我出一篇文章,所以就有了這篇文章。必要文件可通過(guò)后臺(tái)回復(fù)地理經(jīng)緯度獲取。

我首先想到的是matlab的jplv7工具箱里的distance函數(shù),下面是具體的程序內(nèi)容:

function D = distance(xc,yc)
% PURPOSE: Computes the list of pairwise distances for a given set of locations (loc).
% ----------------------------------------------------------
% Usage: D = distance(xc,yc)
% where: xc,yc are vectors of latt-long coordinates for each location
% ----------------------------------------------------------
% Returns: D = (n x n)-matrix of pairwise distances

% Written by: TONY E. SMITH, 2/10/98

n = length(xc) ;  %number of locations
% Start procedure.
X = xc ; %column vector
Y = yc ; %column vector
U = ones(n,1) ; %column vector
XX = X*U' - U*X' ;
YY = Y*U' - U*Y' ;
D = (XX.^2 + YY.^2) ;

根據(jù)程序內(nèi)容,距離計(jì)算公式是:
D=\,\,\left( x1-x2 \right) ^2+\left( y1-y2 \right) ^2

其中,(x1, y1) 是點(diǎn) A 的坐標(biāo),(x2, y2) 是點(diǎn) B 的坐標(biāo)。這明顯不是球面距離。實(shí)際上,如果經(jīng)緯度數(shù)據(jù)如果是未投影的數(shù)據(jù)(即空間坐標(biāo),單位為 °),經(jīng)過(guò)上面的函數(shù)計(jì)算得到的距離仍然不是地理矩陣,因?yàn)槠鋯挝徊皇?m 或者 km 等距離單位。使用該函數(shù)時(shí)需要特別注意!總之,只有平面坐標(biāo)通過(guò)上面的函數(shù)計(jì)算的結(jié)果還是真實(shí)的地理距離。

通過(guò)查找資料,發(fā)現(xiàn)matlab本身就存在可以計(jì)算球面距離的函數(shù),而且函數(shù)名也是distance。這樣,如果在matlab中已經(jīng)導(dǎo)入了jplv7包的情況下再想使用matlab自帶的distance函數(shù),就可能存在沖突。解決方法是,調(diào)正函數(shù)的優(yōu)先級(jí)。具體操作是:主頁(yè) > 設(shè)置路徑,選中jplv7的所有路徑,點(diǎn)擊移至底端、保存

image

這樣再使用distance函數(shù)時(shí),系統(tǒng)就會(huì)自動(dòng)調(diào)用matlab本身的函數(shù),而不是jplv7下的distance函數(shù)。

具體的計(jì)算原理:

image

圖中,空間坐標(biāo)系 A(x1, y1), B(x2, y2),我們需要計(jì)算的球面距離為弧長(zhǎng)\hat{AB}??梢酝ㄟ^(guò)公式:半徑 × \angle \text{AOB} 來(lái)完成。地球赤道半徑 6378.140km,地球極地半徑 6356.755km 。那么,現(xiàn)在面臨的問(wèn)題就是 \angle \text{AOB} 的計(jì)算了。

matlab本身自帶的distance函數(shù)就可以解決這個(gè)問(wèn)題。這里,取赤道半徑6378.1km,下面展示計(jì)算過(guò)程:

>> D = distance(23.0, 101.1, 23.06, 113.34)

D =

   11.2613

>> 11.2613/180*pi*6378.1

ans =

  1.2536e+003

或者

>> D = distance(23.0, 101.1, 23.06, 113.34, 6378.1)

D =

   1.2536e+03

可以看到。兩種方式計(jì)算的結(jié)果是一致的。

下面,我們將演示怎樣用matlab自帶的這個(gè)函數(shù)進(jìn)行空間權(quán)重矩陣的構(gòu)建。首先,使用ArcGis導(dǎo)出地理坐標(biāo)系下的經(jīng)緯度數(shù)據(jù)(單位為 °),排好序后以列向量的格式導(dǎo)入matlab。具體過(guò)程不再演示,相關(guān)經(jīng)緯度數(shù)據(jù)可通過(guò)后臺(tái)回復(fù)地理經(jīng)緯度獲取,下面直接貼出代碼內(nèi)容:

% 球面距離空間權(quán)重矩陣
E = zeros(33, 33);
for i = 1:32;
    for j = 1 + i:33;
        E(i, j) = E(i, j) + distance(X(i), Y(i), X(j), Y(j), 6378.1);
    end;
end;
wd= E + E';

下面給出了,基于赤道半徑的球面距離和歐幾里得距離法下的空間權(quán)重矩陣(這兩份數(shù)據(jù)也已上傳到百度云,回復(fù)可獲得)的部分結(jié)果:

球面距離空間權(quán)重矩陣


歐幾里得距離空間權(quán)重矩陣

可見(jiàn),兩者存在一定差距。畢竟,地球并不是標(biāo)準(zhǔn)的球體,以赤道半徑作為地球半徑本身存在一定誤差。所以,在沒(méi)有特殊要求的情況下,還是建議使用投影后的平面坐標(biāo)來(lái)計(jì)算地理距離。






往期回顧

  1. R中空間權(quán)重矩陣的處理
  2. 使用R進(jìn)行地圖可視化
  3. 使用QGIS進(jìn)行地圖可視化
  4. 南海九段線(xiàn)可以這樣處理
  5. Stata 繪圖也可以很好看
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容