如何计算两个WGS84坐标之间的方位角(北角)

时间:2009-03-13 12:56:52

标签: delphi geolocation geospatial

我有两个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都会很棒。)

6 个答案:

答案 0 :(得分: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 in X)以获得粗略的近似值。

答案 1 :(得分: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);
}

答案 2 :(得分:3)

我找到了这个链接

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

中给出的答案

Lat/Lon + Distance + Heading --> Lat/Lon

这看起来很有希望,特别是在接近结束时给出的平坦地球近似值。

答案 3 :(得分:2)

这仅适用于小差异。否则你不能只是“latitudinalDifference / longitudinalDifference”。

答案 4 :(得分:0)

我建议根据经度实施修正系数。我实现了一个类似的例程,一次返回特定地点x英里内的所有地理编码记录,并遇到类似的问题。不幸的是我不再有代码了,似乎无法回忆起我是如何得到修正号的,但你是在正确的轨道上。

答案 5 :(得分:0)

有人测试过吗?它不会返回正确的答案

此功能假定您在平坦的表面上。既然您提到的距离很小,那很好,但是如果您要计算世界各地城市之间的航向,则可能需要研究一些具有地球形状的东西;

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