更改MapView方向

时间:2015-05-20 08:40:55

标签: android android-mapview osmdroid direction

我想更改OSMdroid MapView方向以面向用户前进的方向(使用Location.bearingTo在每个onLocationChanged上的上一个和当前用户位置之间进行计算,并转换为正常度数而不是真北纬度-180 / 180°以东。)

这个方向是正确的,我正在向这个方向旋转箭头图像,它会指向正确的方向 但是,当我想使用setMapOrientation方法(记录为here)将MapView定向到这些userDirection时,这不是我想要的那样。当我将地图朝向用户的方向定位时,箭头图像应始终指向北方,对吗?因为这是我想要达到的目的:让它看起来像箭头总是指向前方(就像GPS跟踪器:你在GPS上的位置总是用向前的图标表示,我的箭头指向各种方向,因为地图方向错误。)

我猜测osmdroid.MapView orientation正在期待另一种学位价值,但我已经尝试过转回东北的真北学位,没有用。或者我的逻辑完全错误, 正常工作。

如何设置MapView的方向,使其始终面向用户的当前方向,以便箭头始终指向前方(而不是向后,向右或向左,......)? / p>

2 个答案:

答案 0 :(得分:3)

我认为你所指的是使用指南针True North的Map的“真北”方向。为此,您需要设备Compass或Sensor Listener来获取方向,在获得需要为MapView设置它的标题之后。这是一个非常有帮助的Snippet。

private void compassHeadingUp() {

        if(enableCompassHeadUp){
            mSensorManager.registerListener(mySensorEventListener,
                    SensorManager.SENSOR_ORIENTATION,
                    SensorManager.SENSOR_DELAY_FASTEST);
        } else {
            mSensorManager.unregisterListener(mySensorEventListener);
            mDirection = 0;
        }
}

public SensorListener mySensorEventListener = new SensorListener(){

    @Override
    public void onAccuracyChanged(int arg0, int arg1) {

    }

    @Override
    public void onSensorChanged(int sensor, float[] values) {
        synchronized (this) {
            float mHeading = values[0];             
            if(Math.abs(mDirection-mHeading) > Constance.ROTATION_SENSITIVITY){
                mMapView.setMapOrientation(-mHeading);
                mDirection = mHeading;
            }
            Matrix matrix = new Matrix();
            mCompassImageView.setScaleType(ScaleType.MATRIX);
            matrix.postRotate((float) -mHeading, mCompassImageView.getDrawable().getBounds().width()/2, mCompassImageView.getDrawable().getBounds().height()/2);
//Set your Arrow image view to the matrix
mCompassImageView.setImageMatrix(matrix);
            }
        }
    };

答案 1 :(得分:0)

我已经通过反转这样的角度解决了这个问题:

float bearing = location.getBearing();

float t = (360 - bearing);
if (t < 0) {
   t += 360;
}
if (t > 360) {
   t -= 360;
}

//help smooth everything out
t = (int) t;
t = t / 5;
t = (int) t;
t = t * 5;

mapOSM.setMapOrientation(t);