两个GPS坐标之间的夹角

8

我正在开发一个使用AR技术的iPhone应用程序,并且正在创建自己的框架,但是我在尝试获取第二个坐标相对于当前设备位置的角度时遇到了困难,有没有好的资源可以帮助我解决这个问题呢?

提前感谢!

2个回答

17

如果两点足够接近且远离极点,你可以使用一些简单的三角函数:

float dy = lat2 - lat1;
float dx = cosf(M_PI/180*lat1)*(long2 - long1);
float angle = atan2f(dy, dx);

编辑:我忘了提到latNlongN — 以及dxdy — 可以是以度或弧度为单位,只要不混合使用。然而angle将始终以弧度返回。当然,如果你将其乘以180/M_PI,你可以将其转换为度数。


@MarceloCantos 谢谢,这对我的目的来说应该足够好了。我已经玩了一会儿。两点之间的角度没有意义。这是从真北还是磁北计算出来的角度?我想知道相对于我的当前位置和航向,到GPS点的方位角。因此,需要在某种程度上考虑这一因素。 - Aeluned
@Aeluned:我的答案计算了从一个点到另一个点的罗盘方位。要计算相对于航向的方位角,只需减去角度(并处理边缘情况)。 - Marcelo Cantos
@MarceloCantos 再次感谢。我实际上一直在从方位中减去当前航向,但事情似乎并不对劲。我希望这不是事实,但我认为设备在足够小的距离(比如30-50英尺)内可能不够精确,因为我在这里找到的方位计算结果导致角度跳来跳去。我将 GPS 坐标硬编码到一个住在镇上的朋友家里,确保方位计算完全正确。非常感谢您迄今为止提供的所有帮助。 - Aeluned
2
这个公式是错误的,所有接受者都应该感到羞耻。两个地理位置之间的角度限制在0-360范围内。与地理相关的北方= 0度,顺时针上升。您的公式返回数学角度,其中0 =东,逆时针,并且在-pi,pi范围内。 - AlexWien
2
@AlexWien:我使用了这个公式来制作可证明正确的程序,所以“这个公式是错误的”这种说法是错误的。当然,它使用了一个不同的基础——事实上,这是数学家(包括我)更喜欢的基础(atan2f(dy, dx)与任何好的数学文本中找到的公式atan(y/x)密切对应)。你的基础可能在地理空间工作中是一种已经建立的规范,我们应该遵循这种规范才能获得纯粹的好处。如果你能提出这样的论点(并附上链接),而不是只是说我错了并指责支持者,我会全力支持你(即使现在你这么做,我仍然可能支持你)。 - Marcelo Cantos
显示剩余5条评论

1
这是该代码的安卓版本。
import com.google.android.maps.GeoPoint;
    public double calculateAngle(GeoPoint startPoint, GeoPoint endPoint) {
        double lat1 = startPoint.getLatitudeE6() / 1E6;
        double lat2 = endPoint.getLatitudeE6() / 1E6;
        double long2 = startPoint.getLongitudeE6() / 1E6;
        double long1 = endPoint.getLongitudeE6() / 1E6;
        double dy = lat2 - lat1;
        double dx = Math.cos(Math.PI / 180 * lat1) * (long2 - long1);
        double angle = Math.atan2(dy, dx);
        return angle;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接