android 如何在osmdroid中根据Map调整指南针

rks48beu  于 2022-12-09  发布在  Android
关注(0)|答案(2)|浏览(199)

如何将指南针的方向捕捉到Map的方向?
我将指南针添加到MapView并启用Map旋转,如下所示:

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

现在,当Map不旋转时,向上是北,向右是东等,指南针工作正常。但当我用手势旋转Map时,指南针并不随之移动。因此,当设备面向北,Map处于默认旋转时,指南针根据Map显示北,这是正确的。但当我顺时针旋转Map90°时,指南针仍然指向上方而不是顺时针转动90°。
我尝试使用compassOverlay.setPointerMode(true);,但这只改变了指南针的外观。

cygmwpex

cygmwpex1#

我修改了我之前的回答:指南针似乎只能在实际的硬件上工作。
请参阅:Adding Compass to Rotate MapView

dsekswqp

dsekswqp2#

这篇文章https://github.com/osmdroid/osmdroid/issues/1647有解决方案。从那里复制,轻编辑...
1.创建新类:MapAlignedCompassOverlay.java,它只是类www.example.com的副本/重命名CompassOverlay.java,更改包名以匹配您的包,并将类名更改为MapAlignedCompassOverlay
1.将函数drawCompass()中的一行从mCompassMatrix.setRotate(-bearing, mCompassRoseCenterX, mCompassRoseCenterY);更改为mCompassMatrix.setRotate(proj.getOrientation(), mCompassRoseCenterX, mCompassRoseCenterY);
1.在设置代码中(例如onCreate,如果您在Activity中),使用MapAlignedCompassOverlay替换我的应用中的CompassOverlay,并且只给予它一个假的OrientationProvider来使它满意。例如(Kotlin):

val fakeOrientationProvider = object: IOrientationProvider{
    override fun startOrientationProvider(orientationConsumer: IOrientationConsumer?) = true
    override fun stopOrientationProvider() = Unit
    override fun getLastKnownOrientation(): Float = 0f
    override fun destroy() = Unit
}
mapView.overlays.add(MapAlignedCompassOverlay(context, fakeOrientationProvider, mapView).apply {
    enableCompass()
    onOrientationChanged(0f, fakeOrientationProvider)  // Magically makes it show up.
})

现在你有了一个与Map匹配的指南针。注意为了演示这一点,你可以用

mapView.overlays.add(RotationGestureOverlay(mapView))

并观察旋转时指南针是否仍指向(真)北。

相关问题