【问题标题】:Rotate marker to the device heading at precise location when map is rotating.地图旋转时,将标记旋转到精确位置的设备航向。
【发布时间】:2016-04-14 17:50:16
【问题描述】:

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

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();

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

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

【问题讨论】:

    标签: android openstreetmap mapsforge


    【解决方案1】:

    我知道它有点老了,但为了未来的研究我找到了一个解决方案:

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

    替换这个:

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

    在我的例子中,“轴承”是我的类扩展标记的成员变量,我在代码中从 2 个不同的位置(gps 位置)设置它。您可以将其替换为适合您需要的任何角度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多