根据2点经纬度,计算方位角,以及计算2条线的夹角

项目场景1:根据2点经纬度,计算方位角

以真北为0度起点,由北向东向南向西顺时针旋转360度,主要是用于控制象限。

提示:这里简述项目相关背景:

[csharp]
<summary>
/// 给定2点,获得经纬度
/// </summary>

/// <param name="startPoint">起点经纬度,都是以度为单位</param>
/// <param name="endPoint">终点经纬度,都是以度为单位</param>
/// <returns></returns>

private double GetLineAngle(Point2D startPoint, Point2D endPoint){
    double mathPI = 3.1415926535897931;
    double tmpValue = 0;
    double latStart = startPoint.Y * mathPI / 180;
    double lngStart = startPoint.X * mathPI / 180;
    double latEnd = endPoint.Y * mathPI / 180;
    double lngEnd = endPoint.X * mathPI / 180;
       
    if (startPoint.X == endPoint.X || startPoint.Y == endPoint.Y)
    {
        if (startPoint.X == endPoint.X)
        {
            /// 经度相同
            if (endPoint.Y >= startPoint.Y)
            {
                return 0;
            }
            else
            {
                return 180;
            }
        }
        else
        {
            /// 纬度相同
            if (endPoint.X >= startPoint.X)
            {
                return 90;
            }
            else
            {
                return 270;
            }
        }
    }

    tmpValue = Math.Sin(latStart) * Math.Sin(latEnd) + Math.Cos(latStart) * Math.Cos(latEnd) * Math.Cos(lngEnd - lngStart);
    tmpValue = Math.Sqrt(1 - tmpValue * tmpValue);
    tmpValue = Math.Cos(latEnd) * Math.Sin(lngEnd - lngStart) / tmpValue;
    double resultAngle = Math.Abs(Math.Asin(tmpValue) * 180 / mathPI);

    if (endPoint.X > startPoint.X)
    {
        if (endPoint.Y >= startPoint.Y)
        {
            /// 第一象限 
            return resultAngle;
        }
        else
        {
            /// 第二象限 
            return 180 - resultAngle;
        }
    }
    else
    {
        /// 第四象限
        if (endPoint.Y >= startPoint.Y)
        {
            return 360 - resultAngle;
        }
        else
        {
            /// 第三象限
            return 180 + resultAngle;
        }
    }
 }
[/csharp]

项目场景2:计算线的夹角

[csharp]
double lastAngle = GetLineAngle(tempvPoints[k-1], tempvPoints[k]);
double thisAngle = GetLineAngle(tempvPoints[k], tempvPoints[k + 1]);
double angle = Math.Abs(thisAngle - lastAngle);
if (angle > 180)
{
   angle = 360 - angle;
}
angle = 180 - angle;
[/csharp]

参考文档:

http://linfengsheng.iteye.com/blog/1473037
http://blog.sina.com.cn/s/blog_658a93570101hynw.html

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方位角是指我们站在一个上,指向另一个的方向与正北方向之间的夹角。根据两个经纬度计算方位角的公式如下: 1. 计算两个的经度和纬度之差 $$ \Delta\lambda = \lambda_2 - \lambda_1 \\ \Delta\phi = \phi_2 - \phi_1 $$ 2. 计算目标相对于起始方位角 $$ \theta = \text{arctan2}(\sin\Delta\lambda\cdot\cos\phi_2, \cos\phi_1\cdot\sin\phi_2 - \sin\phi_1\cdot\cos\phi_2\cdot\cos\Delta\lambda) $$ 3. 如果计算出的角度为负数,则加上 $360^\circ$,得到最终的方位角。如果角度超过 $360^\circ$,则减去 $360^\circ$,得到最终的方位角。 其中 $\text{arctan2}(y,x)$ 是一个函数,返回的是 $[-\pi,\pi]$ 范围内的角度,表示向量 $(x,y)$ 与正 $x$ 轴之间的夹角。在计算方位角时,我们需要将结果转换为角度制,即将弧度乘以 $180/\pi$。 示例: 假设起始的经度是 $-122.4324$,纬度是 $37.8017$,目标的经度是 $-122.4318$,纬度是 $37.8025$。 1. 计算经度和纬度之差 $$ \Delta\lambda = -122.4318 - (-122.4324) = 0.0006 \\ \Delta\phi = 37.8025 - 37.8017 = 0.0008 $$ 2. 计算方位角 $$ \theta = \text{arctan2}(\sin(0.0006)\cdot\cos(37.8025), \cos(37.8017)\cdot\sin(37.8025) - \sin(37.8017)\cdot\cos(37.8025)\cdot\cos(0.0006)) \\ \theta \approx 1.7055 $$ 3. 将角度转换为角度制 $$ \theta = 1.7055 \cdot \frac{180}{\pi} \approx 97.80^\circ $$ 因此,从起始指向目标的方向大约是 $97.80^\circ$。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值