2017-03-09 32 views
0

在matlab中,我有一個由它們的經度和緯度給出的2410個位置的列表。我想創建一個以公里爲單位的距離矩陣。我知道如何在度數上做到這一點,但我怎樣才能以千米爲單位呢?我有映射工具箱,使用2016b。謝謝!距離矩陣(以公里爲單位)來自經緯度數據的matlab

例如,在我的程度距離矩陣是這樣的:

enter image description here

回答

1

首先,你需要問你自己,你的距離是什麼意思。

你想要點之間的歐幾里得距離嗎?想象一下,你可以從一個地方穿過地球到另一個地球,這是點之間的歐幾里得距離。要計算這個距離,您需要先將每個lat長點轉換爲ecef點。您可以使用此代碼執行此轉換(https://www.mathworks.com/matlabcentral/fileexchange/7942-covert-lat--lon--alt-to-ecef-cartesian)。在將每個點轉換爲eef點後,您現在可以計算每個可能的點對之間的歐幾里得範數https://en.wikipedia.org/wiki/Norm_(mathematics))。

或者你想計算出一個旅行者如果沿着地球表面行走的話,他們會走過的距離。從它的外觀來看,這是一個更難以解決的問題,需要迭代求解器。幸運的是,有人已經完成了爲您執行此操作的算法(https://www.mathworks.com/matlabcentral/fileexchange/5379-geodetic-distance-on-wgs84-earth-ellipsoid)。注意,如果你閱讀這個函數的註釋,它就好像mathworks已經實現了一個不同的算法來在映射工具箱中執行相同的計算。要計算矩陣,您只需遍歷每個可能的經緯度長度配對並將其插入vdist函數。

以下應該使用上面的vdist函數爲您計算距離矩陣。注意我沒有測試過這個代碼,所以你可以糾正錯誤。

points % assuming this is a matrix of your points [2 x N] formatted as follows 
% [ lat1 , lat2, ... ] 
% [ lon1 , lat2, ... ] 

dist = zeros(N,N); % the resulting distance matrix 

for(idx1 = 1:N) 
    for(idx2 = 1:N) 
     dist(idx1,idx2) = vdist(points(1,idx1),points(2,idx1),points(1,idx2)points(2,idx2)); 
    end 
end 

注意因爲地球表面是歧管(https://en.wikipedia.org/wiki/Manifold)的結果將是類似的,如果點是彼此接近。如果速度對您很重要,並且點緊密分組,您可能需要使用第一種方法來計算距離矩陣。使用這個近似值應該是多麼接近點應該取決於你需要結果的準確度。

+0

謝謝 - 我想要第二個選項。我不確定如何從經緯度點列表中編碼。任何建議都會很棒。 – user2861089

+0

謝謝!這真的很有幫助。我稍微改了一行:'points = [lat lon]; N = 2410; %位數 dist =零(N,N); %所得到的距離矩陣 爲IDX1 = 1:N 爲IDX2 = 1:N DIST(IDX1,IDX2)= vdist(點(1,IDX1),點(1,IDX2),點(2,IDX1) ,分(2,idx2)); 結束 結束'但我得到的錯誤'索引超出矩陣的維度。' – user2861089

+0

什麼是您的索引超過矩陣?它是點矩陣嗎?我的猜測是,它是。大小(點數)的輸出是多少? – kabla002

相關問題