10

我有两个 WGS84 坐标,以度为单位的纬度和经度。这些点相当靠近,例如仅相隔一米。

有没有一种简单的方法来计算这些点之间的线的方位角,即向北的角度?

天真的方法是假设笛卡尔坐标系(因为这些点非常靠近)并使用

sin(a) = abs(L2-L1) / sqrt(sqr(L2-L1) + sqr(B2-B1))

a = 方位角 L1, L2 = 经度 B1, B2 = 纬度

随着坐标远离赤道,误差会更大,因为两个经度之间的距离变得越来越小于两个纬度之间的距离(保持不变)。

我发现了一些我真的不想实现的非常复杂的公式,因为它们对于那些靠得很近的点来说似乎有点矫枉过正,我不需要非常高的精度(两位小数就足够了,一个可能也可以,因为那里无论如何都会降低精度的其他因素,例如 GPS 返回的因素)。

也许我可以根据纬度确定一个近似的纵向校正因子并使用这样的东西:

sin(a) = abs(L2*f-L1*f) / sqrt(sqr(L2*f-L1*f) + sqr(B2-B1))

其中 f 是校正因子

有什么提示吗?

(我不想为此使用任何库,尤其是不需要运行时许可证的库。任何 MPLed Delphi Source 都会很棒。)

4

6 回答 6

10

您在文本中引用的公式是计算 2 点之间的大圆距离。这是我计算点之间角度的方法:

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • 记得处理2点相等的情况(检查结果是否等于cNO_ANGLE,或者修改函数抛出异常);

  • 此功能假定您在平坦的表面上。对于您提到的小距离,这一切都很好,但是如果您要计算世界各地城市之间的航向,您可能需要研究一下地球形状的东西;

  • 最好为这个函数提供已经映射到平面的坐标。您可以将 WGS84 Latitude 直接输入 Y(并将 lon 输入 X)以获得粗略的近似值。

于 2009-03-17T04:33:23.480 回答
5

这是 C# 解决方案。测试 0、45、90、135、180、225、270 和 315 角度。

编辑我用 Wouter 解决方案的 C# 翻译替换了我以前丑陋的解决方案:

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}
public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}
于 2009-06-26T19:48:26.930 回答
3

我找到了这个链接

http://williams.best.vwh.net/avform.htm

在答案中给出

纬度/经度 + 距离 + 航向 --> 纬度/经度

这看起来很有希望,尤其是在接近尾声时给出的平坦地球近似值。

于 2009-03-13T19:07:56.210 回答
2

这仅适用于小的差异。否则你不能只是“纬度差异/纵向差异”。

于 2009-09-14T09:43:15.413 回答
0

我建议根据经度实施校正因子。我实施了一次类似的例程,以返回特定地点 x 英里内的所有地理编码记录,并遇到了类似的问题。不幸的是,我没有代码了,而且似乎不记得我是如何得到更正号码的,但你在正确的轨道上。

于 2009-03-13T16:22:54.593 回答
0

有没有人测试过这个?它不返回正确的答案

此功能假定您在平坦的表面上。对于您提到的小距离,这一切都很好,但是如果您要计算世界各地城市之间的航向,您可能需要研究一下地球形状的东西;

你平坦的地球与此无关。正如您所说,该错误是因为您正在计算一个点的初始方位角。除非你直奔电线杆,否则你与电线杆的关系会随着距离而改变。无论如何,上述程序不会返回正确的结果。

于 2019-02-09T18:51:53.867 回答