当地图旋转时,将标记旋转到精确位置处的设备标题。

时间:2015-06-14 08:04:29

标签: android openstreetmap mapsforge

使用新版本的mapsforge 0.5.1,地图可以与onSensorChanged事件一起旋转。我在onLocationChanged事件的GPS点添加了自定义GPS位置标记。当地图旋转时,标记也会旋转以指向设备标题,就像在Google地图中一样,使用标记的绘图方法中的以下代码。

android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas);
androidCanvas.save();
Float px = (float) canvas.getWidth()/2;
Float py = (float) canvas.getHeight()/2;
androidCanvas.rotate(degree, px, py);
canvas.drawBitmap(bitmap, left, top);
androidCanvas.restore();

enter image description here

然而,当拖动地图时,标记的位置会偏离GPS位置的前一个点。

enter image description here

如何计算px和py值,使标记保持在地图上GPS定位的精确位置,即使地图正在旋转,标记也指向设备标题。

1 个答案:

答案 0 :(得分:1)

我知道它有点旧,但是对于未来的研究,我找到了一个解决方案:

  • 首先扩展mapsforge Marker并覆盖其draw()方法
  • 从Marker
  • 复制粘贴绘制方法的内容
  • 然后在最后一个条件中添加以下内容:

替换它:

if(canvasRectangle.intersects(bitmapRectangle)) {
    canvas.drawBitmap(bitmap, left, top);
}

这个:

if(canvasRectangle.intersects(bitmapRectangle)) {
    // Rotate the marker based on bearing for example (or whatever angle you want)
    android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas);
    androidCanvas.save();

    float px = (right + left) / 2f;
    float py = (bottom + top) / 2f;

    androidCanvas.rotate(bearing, px, py);
    canvas.drawBitmap(bitmap, left, top);
    androidCanvas.restore();
}

在我的情况下"承载"是我的类扩展标记的成员变量,我在代码(gps位置)之前的2个不同位置设置。您可以用任何适合您需要的角度更换它。