根据公司需求需要我做一个地图上显示目标位置的方位角角度 , 然后牵扯到一些数学的算法在笔记本上涂涂画画 , 想到了一个实现的思路.
跟据这个图可以理解为这个正方形为我们软件的地图画面 ,中间圆点为我们自身所在坐标 , 其它圆点为目标可能所在区域的坐标,其实也很简单通过这个图我们知道一点就是我们可以把自身点向外扩散形成个圆, 我们只需要求圆的角度就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轴差不多 .
以上就是主要的核心代码,和算法思路. 我以上代码只供提供思路 . 希望对你们有帮助