Android 如何实现地图方位角角度

根据公司需求需要我做一个地图上显示目标位置的方位角角度 , 然后牵扯到一些数学的算法在笔记本上涂涂画画 , 想到了一个实现的思路.

 

跟据这个图可以理解为这个正方形为我们软件的地图画面 ,中间圆点为我们自身所在坐标 , 其它圆点为目标可能所在区域的坐标,其实也很简单通过这个图我们知道一点就是我们可以把自身点向外扩散形成个圆, 我们只需要求圆的角度就OK了.

下面我拿代码给你们讲解一下:

             我们先从以X轴为正方向的讲解:

public double Amizuth(double dProjX0, double dProjY0, double dProjX1, double dProjY1) {
// 上面这四个参数分别表达的为 , 目标的坐标值与自己的坐标值,也就是经纬度
    double _PI = 3.141592653589793D;
    PointF prjPointF1 = this.projection.GeoToPrj(new PointF((float)dProjX0, (float)dProjY0));
    PointF prjPointF2 = this.projection.GeoToPrj(new PointF((float)dProjX1, (float)dProjY1));
//上面这两个是我自己封装转换数值的方法;
    double dAmizuth = 0.0D;     //先设一个变量为0.0 double值
 //然后进行判断如果自身x轴于目标x轴相等并且自身y轴于目标y轴相等就代表他们是在同一个点上
    if(prjPointF1.x == prjPointF2.x && prjPointF1.y == prjPointF2.y) {
      // 赋值为0,0度
        dAmizuth = 0.0D;
     //否则如果 自身y轴等于目标y轴这个时候就比对他们的X轴
    } else if(prjPointF1.y == prjPointF2.y) {
      //如果目标X轴大于自身X轴
        if(prjPointF2.x > prjPointF1.x) {
       //赋值为0.0度
            dAmizuth = 0.0D;
        } else {
       // 小于就赋值为180度
            dAmizuth = _PI;
        }
      //否则如果自身X轴等等于目标X轴这个时候就对比Y轴
    } else if(prjPointF1.x == prjPointF2.x) {
//如果目标Y轴大于自身Y轴
        if(prjPointF2.y > prjPointF1.y) {
    //大于赋值为90度
            dAmizuth = _PI / 2.0D;
        } else {
    //小于赋值为270度
            dAmizuth = _PI * 3.0D / 2.0D;
        }
    } else {
       //以x轴计算圆弧的角度
        dAmizuth = Math.atan(1.0D * (double)(prjPointF2.x - prjPointF1.x) / (double)(prjPointF2.y - prjPointF1.y));
        //如果目标Y轴大于自身Y轴
        if(prjPointF2.y > prjPointF1.y) {
           //1.570796D 为90度
            dAmizuth = 1.570796D - dAmizuth;
        } else {
           //4.7124D 为270度
            dAmizuth = 4.7124D - dAmizuth;
        }
    }
   // 拿到计算的值乘于180度/PI最后就是你的度数结果
    return dAmizuth * 180.0D / _PI;
}

然后以Y轴为主:

public double Amizuth(double dProjX0, double dProjY0, double dProjX1, double dProjY1) {
    double _PI = 3.141592653589793D;
    PointF prjPointF1 = mProjection.GeoToPrj(new PointF((float) dProjX0, (float) dProjY0));
    PointF prjPointF2 = mProjection.GeoToPrj(new PointF((float) dProjX1, (float) dProjY1));
    double dAmizuth = 0.0D;
    if (prjPointF1.x == prjPointF2.x && prjPointF1.y == prjPointF2.y) {
        dAmizuth = 0.0D;
    } else if (prjPointF1.x == prjPointF2.x) {
        if (prjPointF2.y > prjPointF1.y) {
            dAmizuth = 0.0D;
        } else {
            dAmizuth = _PI;
        }
    } else if (prjPointF1.y == prjPointF2.y) {
        if (prjPointF2.x > prjPointF1.x) {
            dAmizuth = _PI / 2.0D;
        } else {
            dAmizuth = _PI * 3.0D / 2.0D;
        }
    } else {
        dAmizuth = Math.atan(1.0D * (double) (prjPointF2.y - prjPointF1.y) / (double) (prjPointF2.x - prjPointF1.x));
        if (prjPointF2.x > prjPointF1.x) {
            dAmizuth = 1.570796D - dAmizuth;
        } else {
            dAmizuth = 4.7124D - dAmizuth;
        }
    }

    return dAmizuth * 180.0D / _PI;
}

跟X轴差不多 .

以上就是主要的核心代码,和算法思路. 我以上代码只供提供思路 . 希望对你们有帮助

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值