我找到了一种从两个坐标计算方向角度的好方法,我已经在 excel 中尝试了这个解决方案,当我输入近似坐标时它工作正常。但是如果我用 java 实现代码,我在 dxy(角度)双变量上得到完全不同的结果。坐标很好,我仔细检查了它们。 :)
double lon1 = (double)Math.round(LongitudeDouble * 1000000) / 1000000;
double lat1 = (double)Math.round(LatitudeDouble * 1000000) / 1000000;
double lon2 = 19.055954;
double lat2 = 47.569331;
***************************
double dy = (lat2 - lat1);
double dx = Math.cos(Math.PI/180*lat1)*(lon2-lon1);
double dxy = Math.atan2(dy, dx);
double degree = 180/Math.PI*dxy;
最佳答案
excell 偏离您的程序代码的原因是 excell 使用参数顺序:x,y 而像 java 这样的编程语言使用顺序 (y,x)。查看 atan2 的文档.
此外,您和 SO 中的其他一些帖子 混淆数学角度(东 = 0 逆时针升高)和地理方向(罗盘):北 = 0,顺时针)。在提供数学角度的角度计算之后,您必须转换为地理方向,但是:
您使用了错误的公式。您的公式适用于笛卡尔坐标(例如屏幕点、像素),不适用于球面坐标(纬度、经度)。在 SO 上搜索 bearing between two coordinates
atan2
从 [-pi, pi] 传递一个值。但地理方向是 0-360。
顺便说一下正确答案:
从 lat1,lon1 到 lat,lon2 的方位/航向/航向 = 122.0402
所以这个公式部分是废话:
您的代码给出 -32.04
1. 所以你首先交换了起点和终点;从 p1 到 p2 测量角度。
2. -90 -32 = -122 这是预期的结果。 (数学角度与地理角度)
所以你弄乱了自己的数字。你在 Excel 中输入了另一个数字,而不是在 java 中, 或发布了错误的号码:您的 Java 代码中的结果是 -32.04 使用这些数字:
double lon1 = 19.053143;
double lat1 = 47.570518;
double lon2 = 19.055954;
double lat2 = 47.569331;
关于java - 如何从两个GPS坐标计算方向的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253262/