2017-03-09 277 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

相关问题