Rotate marker as per user direction on Google Maps V2 Android

Scorpion picture Scorpion · Dec 20, 2013 · Viewed 25.1k times · Source

I want to rotate marker as per bearing or sensor value received from Accelerometer to show the user where actually he is moving. I have set marker icon and flat value to true but its not working as required.

mCurrentLocationMarker.position(new LatLng(
                            LocationUtils.sLatitude, LocationUtils.sLongitude));
                    mCurrentLocationMarker.icon(icon);
                    mCurrentLocationMarker.flat(true);
                    mCurrentLocationMarker.rotation(LocationUtils.sBearing);

                    if (currentMarker != null) {
                        currentMarker.setPosition(new LatLng(
                                LocationUtils.sLatitude,
                                LocationUtils.sLongitude));
                    } else {
                        currentMarker = mGoogleMap
                                .addMarker(mCurrentLocationMarker);
                    }
                    animateCameraTo(true);

I have used this marker as marker.

I don't know why its not rotating as per user's direction. If anyone has any idea please kindly help me where i am making mistake.

LocationUtils.sBearing is the value of Bearing which i received from onLocationChanged or accelerometer.

Basically I want to make my marker same as google maps marker which shows user in which direction they are moving or turning.

Answer

Breavyn picture Breavyn · Nov 13, 2015

This is an old question and it appears the API has changed since then.

I'm assuming you are able to get the devices bearing. If not here is a handy tutorial.

First thing is to create a marker we can use for bearing updates.

private Marker marker;

// Create this marker only once; probably in your onMapReady() method
marker = mGoogleMap.addMarker(new MarkerOptions()
        .position(new LatLng(myLatitude, myLongitude))
        .flat(true));

Note the .flat(true) portion. The ensures our marker is north aligned so that our bearings will work correctly even if the user rotates the map.

Now when you get your bearing updates you can do the following

marker.setRotation(bearing);
// or if following the linked tutorial
// marker.setRotation((float) azimuth);

This assumes your marker icon has the forward direction at the top. If your marker is rotated like the one pictured, you will have to adjust the bearing to compensate before setting it to the marker. Just a simple setRotation(bearing - 45) should do it.