我需要用 Matlab 解决最小化问题,我想知道哪个是最简单的解决方案。我一直在考虑的所有潜在解决方案都需要大量的编程工作。
假设我有一个纬度/经度坐标点(A,B),我需要在纬度/经度坐标地图中搜索离该坐标最近的点。
特别是,纬度和经度数组是 2030x1354 元素(1km 距离)的两个矩阵,其想法是在这些矩阵中找到唯一索引,以最小化与坐标 (A,B) 的距离,即找到最接近的值到给定的坐标(A,B)。
任何帮助将不胜感激。
谢谢!
我需要用 Matlab 解决最小化问题,我想知道哪个是最简单的解决方案。我一直在考虑的所有潜在解决方案都需要大量的编程工作。
假设我有一个纬度/经度坐标点(A,B),我需要在纬度/经度坐标地图中搜索离该坐标最近的点。
特别是,纬度和经度数组是 2030x1354 元素(1km 距离)的两个矩阵,其想法是在这些矩阵中找到唯一索引,以最小化与坐标 (A,B) 的距离,即找到最接近的值到给定的坐标(A,B)。
任何帮助将不胜感激。
谢谢!
设Lat
并Long
表示纬度和经度矩阵,然后
dist2=sum(bsxfun(@minus, cat(3,A,B), cat(3,Lat,Long)).^2,3);
[I,J]=find(dist2==min(dist2(:)));
I
并包含与最近点对应J
的索引。请注意,如果有多个答案,则不会是标量值,而是向量。A
B
I
J
这总是一个有趣的:)
首先:Mohsen Nosratinia 的回答是可以的,只要
对于给定的纬度,-180° 和 +180° 经度实际上是同一点,因此仅查看角度之间的差异是不够的。这在极地地区将是一个更大的问题,因为大的经度差异对实际距离的影响较小。
球面坐标对于导航、地图绘制等用途非常有用且实用。然而,对于空间计算,例如您尝试计算的表面距离,球坐标实际上非常麻烦。
尽管可以直接使用角度进行此类计算,但我个人认为它不是很实用:您通常必须具有强大的球面三角学背景,并且有相当多的经验才能了解它的许多陷阱——通常存在不稳定或您需要解决的“特殊点”(例如极点),由于您引入的三角函数等而需要考虑的象限模糊性等。
我在大学里学会了做这一切,但我也了解到球面三角法通常会引入数学上并不严格要求的复杂性,换句话说,球面三角法并不是潜在问题的最简单表示。
例如,如果您将纬度和经度转换为 3D 笛卡尔X,Y,Z
坐标,然后通过简单的公式找到距离,那么您的距离问题就很简单了
距离 ( a , b ) = R · arccos( a /| a | · b /| b | )
其中a和b是球面上的两个这样的笛卡尔向量。请注意 | 一个| = | 乙| = R
,与R = 6371
地球的半径。
在 MATLAB 代码中:
% Some example coordinates (degrees are assumed)
lon = 360*rand(2030, 1354);
lat = 180*rand(2030, 1354) - 90;
% Your point of interest
P = [4, 54];
% Radius of Earth
RE = 6371;
% Convert the array of lat/lon coordinates to Cartesian vectors
% NOTE: sph2cart expects radians
% NOTE: use radius 1, so we don't have to normalize the vectors
[X,Y,Z] = sph2cart( lon*pi/180, lat*pi/180, 1);
% Same for your point of interest
[xP,yP,zP] = sph2cart(P(1)*pi/180, P(2)*pi/180, 1);
% The minimum distance, and the linear index where that distance was found
% NOTE: force the dot product into the interval [-1 +1]. This prevents
% slight overshoots due to numerical artifacts
dotProd = xP*X(:) + yP*Y(:) + zP*Z(:);
[minDist, index] = min( RE*acos( min(max(-1,dotProd),1) ) );
% Convert that linear index to 2D subscripts
[ii,jj] = ind2sub(size(lon), index)
如果您坚持跳过转换为笛卡尔并直接使用纬度/经度,您将不得不使用Haversine 公式,例如本网站上概述的,这也是distance()
映射工具箱中使用的方法。
现在,所有这些都适用于整个地球,只要您发现光滑的球形地球足够准确的近似值。如果你想包括地球的扁率或一些更高阶的形状模型(或者上帝保佑,包括地形的距离),你需要做更复杂的事情。但我认为这不是你的目标:)
PS - 如果你把我所做的一切都写出来,我不会感到惊讶,你可能会重新发现 Haversine 公式。我只是更喜欢能够仅根据第一原理来计算像球体上的距离这样简单的东西,而不是根据您很久以前植入脑海中的一些黑匣子公式:)