这总是一个有趣的问题 :)
首先,Mohsen Nosratinia的回答可以,只要您不需要知道实际距离,可以绝对确定您永远不会靠近极地地区,也永远不会靠近±180°子午线。对于给定的纬度,-180°和+180°经度实际上是同一点,因此仅查看角度差异是不足够的。这在极地地区将是更大的问题,因为那里的大经度差异对实际距离的影响将更小。
球面坐标在导航、制图等方面非常有用和实用。然而,在表面距离等空间计算方面,球面坐标实际上非常麻烦。虽然可能使用角度直接进行此类计算,但我个人认为这不是很实用:您通常需要具有球面三角学的强背景,并且需要具有相当的经验才能了解其许多缺陷——通常有不稳定性或“特殊点”需要解决(例如极点),需要考虑四象限歧义性,因为您引入了三角函数等。
例如,如果您将纬度和经度转换为3D笛卡尔X、Y、Z坐标,则您的距离问题就非常简单,然后通过简单的公式找到距离:
距离(a,b)= R·arccos(a/|a|·b/|b|)
其中a和b是球体上的两个笛卡尔向量。注意| a |= | b |= R,其中R = 6371是地球的半径。
在MATLAB代码中:
lon = 360*rand(2030, 1354);
lat = 180*rand(2030, 1354) - 90;
P = [4, 54];
RE = 6371;
[X,Y,Z] = sph2cart( lon*pi/180, lat*pi/180, 1);
[xP,yP,zP] = sph2cart(P(1)*pi/180, P(2)*pi/180, 1);
dotProd = xP*X(:) + yP*Y(:) + zP*Z(:);
[minDist, index] = min( RE*acos( min(max(-1,dotProd),1) ) );
[ii,jj] = ind2sub(size(lon), index)
如果您坚持跳过转换为笛卡尔坐标并直接使用纬度/经度,您将不得不使用Haversine公式,例如在
此网站中所述的方式,这也是映射工具箱中
distance()
使用的方法。
现在,所有这些都适用于整个地球,前提是您认为平滑的球形地球足够准确。如果您想包括地球的扁率或一些更高阶的形状模型(或者天哪,包括
地形的距离),则需要进行更复杂的操作。但我不认为这是您的目标:)
PS-如果您把我写的一切都写出来,我不会感到惊讶,您可能会重新发现Haversine公式。我只是更喜欢能够仅从第一原理计算沿着球体的简单距离,而不是从您很久以前植入头脑中的某个黑匣子公式计算。