这总是一件有趣的事:)
首先:Mohsen Nosratinia 的答案是可以的,只要
- 你不需要知道实际距离
- 你可以绝对保证你永远不会靠近极地
- 并且永远不会接近±180°子午线
对于给定的纬度,-180° 和 +180° 经度实际上是相同点,因此仅仅查看角度之间的差异是不够的。在极地地区,这将是一个更大的问题,因为那里较大的经度差异对实际距离的影响较小。
球坐标对于导航、绘图等目的非常有用和实用。然而,对于空间计算,例如您尝试计算的表面距离,球坐标实际上使用起来相当麻烦。
虽然它是possible直接使用角度进行这样的计算,我个人并不认为很实际的:您通常必须在球面三角学方面拥有深厚的背景,并且具有丰富的经验才能知道它的许多陷阱 - 通常存在您需要解决的不稳定性或“特殊点”(例如,极点),您需要象限模糊性由于您引入的三角函数等而需要考虑。
我在大学里学会了做这一切,但我也了解到球面三角方法经常引入复杂性,数学上说起来并不严格要求,换句话说,球面三角是not根本问题的最简单表示。
例如,如果将纬度和经度转换为 3D 笛卡尔坐标系,距离问题就变得微不足道了X,Y,Z
坐标,然后通过简单的公式求出距离
距离 (a, b) = R·arccos(a/|a| · b/|b| )
where a and b是球面上的两个这样的笛卡尔向量。请注意|a| = |b| = R
, with 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)
如果您坚持跳过笛卡尔坐标转换并直接使用纬度/经度,则必须使用半正矢公式,如下所示在这个网站上例如,这也是使用的方法distance()
从映射工具箱。
现在,这一切对整个地球都有效,provided你会发现光滑的球形地球的近似值足够准确。如果你想包括地球的扁率或一些更高阶的形状模型(或者上帝禁止,距离包括terrain),你需要做更复杂的事情。但我认为这不是你的目标:)
PS - 如果你把我所做的一切都写出来,我不会感到惊讶,你可能会重新发现半正弦公式。我只是更喜欢能够仅根据第一原理来计算一些简单的东西,例如沿着球体的距离,而不是根据很久以前植入您头脑中的一些黑匣子公式:)