通过路由在osmdroid中旋转MapView

时间:2015-07-21 10:24:53

标签: android rotation android-mapview osmdroid navigator

我需要像导航器一样从osmdroid制作MapView。司机乘坐从服务器取出的路线乘车。地图应该为他旋转,因为路线总是在地图上的点前面。问题是我无法为每次旋转获得直角。有时它有效,有时不行。例如,如何定义旋转将在1米?也许,osmdroid中的一些库或类可以帮助我解决这些问题吗?

2 个答案:

答案 0 :(得分:0)

我认为你要做的最好的事情是根据设备指南针和/或gps标题来定位地图。 Osmdroid没有内置任何东西。

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

答案 1 :(得分:0)

我找到了解决方案。此方法计算旋转地图的正确程度。我把路线切成了直线。当前位置靠近下一行时,我称之为

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;
}