首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算两个WGS84坐标之间的方位角(向北的角度

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

Stack Overflow用户
提问于 2009-03-13 12:56:52
回答 6查看 37.7K关注 0票数 10

我有两个WGS84坐标,纬度和经度。这些点离得很近,例如相距只有一米。

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

天真的方法是假设一个笛卡尔坐标系(因为这些点离得很近),然后使用

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

A=方位角,L2 =经度B1,B2 =纬度

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

我发现了一些非常复杂的公式,我真的不想实现,因为它们对于离得太近的点似乎有点过分,而且我不需要非常高的精度(两个小数就足够了,一个小数可能也行,因为还有其他因素会降低精度,比如GPS返回的那个)。

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

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

其中f是校正因子

有什么提示吗?

(我不想为此使用任何库,特别是那些需要运行时许可证的库。任何MPLed的Delphi源码都会很棒。)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-17 04:33:23

你在正文中引用的公式是计算两点之间的大圆距离。下面是我如何计算点之间的角度:

代码语言:javascript
运行
复制
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;

  • 记住处理两个点相等的情况(检查结果是否等于cNO_ANGLE,或者修改函数以抛出异常);
  • 此函数假定您在平面上。有了你提到的小距离,这一切都很好,但如果你要计算世界各地城市之间的航向,你可能想要研究一些采取地球形状的东西;,

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

Stack Overflow用户

发布于 2009-06-26 19:48:27

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

我用的解决方案的C#翻译替换了我之前丑陋的解决方案:

代码语言:javascript
运行
复制
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;
}
代码语言:javascript
运行
复制
public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}
票数 5
EN

Stack Overflow用户

发布于 2009-03-13 19:07:56

我找到了这个链接

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

在答案中给出

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/642555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档