我想更改OSMdroid MapView方向以面向用户前进的方向(使用Location.bearingTo
在每个onLocationChanged
上的上一个和当前用户位置之间进行计算,并转换为正常度数而不是真北纬度-180 / 180°以东。)
这个方向是正确的,我正在向这个方向旋转箭头图像,它会指向正确的方向
但是,当我想使用setMapOrientation
方法(记录为here)将MapView定向到这些userDirection时,这不是我想要的那样。当我将地图朝向用户的方向定位时,箭头图像应始终指向北方,对吗?因为这是我想要达到的目的:让它看起来像箭头总是指向前方(就像GPS跟踪器:你在GPS上的位置总是用向前的图标表示,我的箭头指向各种方向,因为地图方向错误。)
我猜测osmdroid.MapView orientation
正在期待另一种学位价值,但我已经尝试过转回东北的真北学位,没有用。或者我的逻辑完全错误, 正常工作。
如何设置MapView
的方向,使其始终面向用户的当前方向,以便箭头始终指向前方(而不是向后,向右或向左,......)? / p>
答案 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);