通过路由在osmdroid中旋转MapView

Rotate MapView in osmdroid by route

我需要像在导航器中一样从 osmdroid 制作 MapView。 driver 按照从服务器获取的路线骑车。地图应该为他旋转,因为路线总是在他在地图上的点之前。问题是我无法为每次旋转都获得正确的角度。有时有效,有时无效。例如,如何定义旋转以 1 米为单位?也许,osmdroid 中的某些库或 类 可以帮助我解决这些问题?

我认为您最好根据设备罗盘 and/or gps 航向定位地图。 Osmdroid 没有为此内置任何东西。

当你从服务器获取路线后,你能计算出你在哪条路段吗?如果是这样,您应该能够确定何时旋转地图。

我找到了解决办法。此方法计算出我旋转地图的正确度数。我把路线剪成直线。当当前位置靠近下一行时,我调用此方法

public double rotateToNextCheckPoint() {
    int lineId = OfferPreference.getInstance().getCurrentLineId();
    if (rotates != null && lineId >= 0 && road.mRouteHigh.size() > 0) {
        if (lineId < (rotates.size() - 1)) {
            GeoPoint nextPoint = rotates.get(lineId).getLast();
            GeoPoint currPoint = rotates.get(lineId).getFirst();

            if (nextPoint == null || currPoint == null) {
                return 0;
            }

            double lat1 = Math.toRadians(currPoint.getLatitude());
            double lon1 = Math.toRadians(currPoint.getLongitude());
            double lat2 = Math.toRadians(nextPoint.getLatitude());
            double lon2 = Math.toRadians(nextPoint.getLongitude());

            double cos1 = Math.cos(lat1);
            double cos2 = Math.cos(lat2);
            double sin1 = Math.sin(lat1);
            double sin2 = Math.sin(lat2);

            double delta = lon2 - lon1;
            double deltaCos = Math.cos(delta);
            double deltaSin = Math.sin(delta);

            double x = (cos1 * sin2) - (sin1 * cos2 * deltaCos);
            double y = deltaSin * cos2;
            double z = Math.toDegrees(Math.atan((-y / x)));
            if (x < 0) {
                z += 180;
            }
            double z2 = (z + 180) % 360 - 180;
            z2 = -Math.toRadians(z2);

            double angleRad = z2 - (Math.PI * 2 * Math.floor(z2 / (2 * Math.PI)));
            double angle = Math.toDegrees(angleRad);
            rotationGestureOverlay.onRotate(-(float) angle, false);
            return angle;
        }
    }
    return 0;
}