11

当用户改变他的方向时,我试图旋转地图视图,即如果用户左转和右转,它应该相应地旋转。我正在根据当前位置旋转地图视图,轴承旋转正确但抖动。这是代码我用于旋转

   public void onGPSUpdate(Location location) 
{
     boolean check=isBetterLocation(location, tempLoc);
    tempLoc=location;

     if(check){
        showLocation(location);

     }

}
isBetterLocation method is copied from google docs for better location.

private void showLocation(Location loc){
   mRotateView.rotate(-loc.getBearing());             
   }

我注册了一个时间间隔为 0 且最小距离为 10 的位置更新以进行频繁更新。这里我的问题是地图视图总是抖动,谁能告诉我如何像 waze 地图这样的其他应用程序一样平滑地旋转地图视图。谢谢。 ..

4

4 回答 4

4

您是在尝试以平滑的方式旋转地图,例如一次旋转一度,还是在位置更新时将其从 A 度转到 B 度?

就像是

while (oldAngle != newAngle)
{
mapView.rotate(newAngle);
// this is where you would decied to add or subtract; 
newAngle ++ or -- ; 
}

不确定这是否会完全像循环运行得很快那样工作,所以可以将其作为 asynctask 执行,并在其中添加暂停以模拟平滑旋转。

Double angle = Math.atan2((userstartPoint.getX() - userendPoint.getX()), userstartPoint.getY() - userendPoint.getY());
            angle = Math.toDegrees(angle);
            map.setRotationAngle(angle);

所以基本上我得到起点(新位置),然后是终点(旧位置),并在其上执行 Math.atan2,如您所见。然后将其转换为度数并将其设置为我的地图旋转。现在它不会进行平滑旋转,但我不需要。在这里您可以设置自己的步进器以实现平滑旋转。除非谷歌地图已经有一个。

于 2012-09-17T13:38:31.443 回答
3

由于 Location 的方位值不是很精确,并且往往会稍微跳跃,因此您应该对方位使用过滤器。例如,将最后 5 个方位值保留在一个数组中,并使用这些值的平均值作为将地图旋转到的方位。或者使用SensorEvent 文档中解释的过滤器- 它更易于使用并且可以更好地调整。

这将平滑地图的旋转。保持更稳定。

编辑:

低通滤波器的一个版本:

public static float exponentialSmoothing(float input, float output, float alpha) {
    output = output + alpha * (input - output);
    return output;
}

像这样使用它:

final static float ALPHA = 0.33; // values between 0 and 1
float bearing;

// on location/bearing changed:

bearing = exponentialSmoothing(bearing, newBearing, ALPHA);

bearing将是用于实际旋转地图的值,newBearing将是您从每个事件中获得的方位,并且ALPHA您可以通过加权新旧方位的多少来控制旋转对新方向的速度或速度考虑到结果。较小的值对旧值的权重较高,较高的值对新值的权重较高。

我希望效果更好。

于 2012-09-21T19:13:03.040 回答
1

要更改地图的方位,请使用Camera该类。您可以CameraPosition使用新方位定义新方位,并告诉相机随其中一个移动,GoogleMap.moveCamera或者GoogleMap.animateCamera如果您想要平滑移动。

于 2014-09-15T18:13:43.623 回答
0

我已经在我的应用程序中实现了这一点。我基本上所做的是,我采用了路径的最后一个和倒数第二个 LatLng 并通过使用计算方位

public static float getRotationAngle(LatLng secondLastLatLng, LatLng lastLatLng)
{
    double x1 = secondLastLatLng.latitude;
    double y1 = secondLastLatLng.longitude;
    double x2 = lastLatLng.latitude;
    double y2 = lastLatLng.longitude;

    float xDiff = (float) (x2 - x1);
    float yDiff = (float) (y2 - y1);

    return (float) (Math.atan2(yDiff, xDiff) * 180.0 / Math.PI);

}

将此角度设置为相机位置的方位角。

注意:有时(很少)它会将地图旋转到相反的方向。我正在寻找它,但如果有人有理由请回复。

于 2015-08-28T06:21:24.043 回答