如何将指南针调整为osmdroid中的地图

问题描述 投票:2回答:1

我如何将指南针的方向与地图的方向对齐?

我将罗盘添加到我的MapView并启用地图旋转,如下所示:

 MapView mapView = findViewById(R.id.mapView);

 // Enable & add compass
 CompassOverlay compassOverlay = new CompassOverlay(this, mapView);
 compassOverlay.enableCompass();
 mapView.getOverlays().add(compassOverlay);

 // Enable map rotation with gestures
 mapView.getOverlays().add(new RotationGestureOverlay(mapView));

现在,当地图不旋转时,向上是北方,右边是东方等,指南针可以正常工作。但是,当我用手势旋转地图时,指南针不会相应移动。因此,当设备朝北且地图处于默认旋转位置时,指南针会根据地图向北显示,这是正确的。但是,当我将地图顺时针旋转90°时,指南针仍然指向上方,而不是顺时针旋转90°。

我尝试使用compassOverlay.setPointerMode(true);,但这仅改变了指南针的外观。

android osmdroid compass-geolocation
1个回答
0
投票

旧问题-我将此答案发布给任何有兴趣的读者。我不知道这是否是正确的方法,但是它有效,我找不到更好的方法。您可以修改azimuthOffset,比方说每0.1秒:

    val icop = InternalCompassOrientationProvider(applicationContext)
    val co = CompassOverlay(applicationContext, icop, mapView)
    co.enableCompass()

    mapView.overlays.add(co)

    Timer().scheduleAtFixedRate(object : TimerTask() {
        override fun run() {
            co.azimuthOffset = - mapView.mapOrientation
        }
    }, 0, 100 /*millisecs*/)

((也许您可以根据mapView上的某些旋转事件来更改指南针的方向,而不是在固定的时间间隔,但是我还没有找到方法。)

如果您扩展CompassOverlay,也可以通过按指南针来重置地图的方向。

class MyCompassOverlay(context: Context, icop: InternalCompassOrientationProvider,
        mapView: MapView): CompassOverlay(context, icop, mapView) {

    private lateinit var onSingleTapConfirmedFunction: () -> Unit
    private var rawXYLimit: Float = 0f

    init {
        rawXYLimit = 0.8f /*inches*/ * mCompassRoseBitmap.density /*DPI*/
    }

    override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?): Boolean {
        e?.run {
            if (rawX < rawXYLimit && rawY < rawXYLimit) {
                onSingleTapConfirmedFunction()
            }
        }

        return super.onSingleTapConfirmed(e, mapView)
    }

    fun setOnSingleTapConfirmedFunction(function: () -> Unit) {
        onSingleTapConfirmedFunction = function
    }
}

    val co = MyCompassOverlay(applicationContext, icop, mapView)
    ...
    co.setOnSingleTapConfirmedFunction {
        mapView.mapOrientation = 0f
    }

rawXYLimit字段用于将动作限制在指南针区域。在这里,您当然也可以找到更好的计算方法。

© www.soinside.com 2019 - 2024. All rights reserved.