2017-03-09 51 views
0

matlabには、緯度と経度で指定された2410の場所のリストがあります。私は距離行列をキロメートル単位で作成したいと考えています。私は度でこれを行う方法を知っていますが、これをどのようにキロメートルで行うのですか?私は2016bを使って、マッピングツールボックスを持っています。ありがとう!例えばmatlabの緯度と経度のデータからの距離行列

度の私の距離行列は次のようになり、:

enter image description here

答えて

1

まず、あなたは距離によって何を意味するかあなたの自己を依頼する必要があります。

ポイント間のユークリッド距離をしますか?あなたが地球を一点から他の点にトンネルすることができると想像してください、これは点間のユークリッド距離です。この距離を計算するには、最初に緯度の長い各点をecef点に変換する必要があります。この変換は、このコード(https://www.mathworks.com/matlabcentral/fileexchange/7942-covert-lat--lon--alt-to-ecef-cartesian)で行うことができます。各点をエフェクト点に変換した後、ユークリッドのノルム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

ありがとうございます - 私は2番目のオプションが欲しいです。私は緯度と経度のリストからこれをどのようにコード化するのか、本当に分かりません。どんな提案も素晴らしいだろう。 – user2861089

+0

ありがとう!これは本当に役に立ちます。 1行を少し変更しました。 'points = [lat lon];N = 2410; %個の場所の数 dist =ゼロ(N、N); idx1 = 1:N for idx2 = 1:N dist(idx1、idx2)= vdist(ポイント(1、idx1)、ポイント(1、idx2)、ポイント(2、idx1))の結果の距離行列 、点(2、idx2)); end end'ですが、「インデックスが行列の寸法を超えています」というエラーが表示されます。 – user2861089

+0

インデックスが超過しているマトリックスは何ですか?それはポイントマトリックスですか?私の推測はそうです。サイズ(ポイント)の出力は何ですか? – kabla002

関連する問題