0

I want to rotate map while user navigation based on his direction/heading and and his current segment(current location to next). I have route drawn on map and i am calculating bearing between two points using method current.bearingTo(destination). I have followed this link but results are not as i was expecting. What i want to achieve is that when user starts route navigation app should take current segment's (start and end point) and calculate bearing between two points, also get heading/direction from sensor and rotate the map. Then on segment completion when user takes turn (left or right) now again calculate new bearing(of next segment's start/end point) and heading direction and rotate map accordingly. Here is my onSensorChanged method;

@Override
public void onSensorChanged( SensorEvent event ) {

    Location LocationObj = LocationService.mLocation;
    // If we don't have a Location, we break out
    if ( LocationObj == null ) return;

    float azimuth = event.values[0];
    float baseAzimuth = azimuth;

    GeomagneticField geoField = new GeomagneticField( Double
            .valueOf( LocationObj.getLatitude() ).floatValue(), Double
            .valueOf( LocationObj.getLongitude() ).floatValue(),
            Double.valueOf( LocationObj.getAltitude() ).floatValue(),
            System.currentTimeMillis() );

    azimuth -= geoField.getDeclination(); // converts magnetic north into true north

    Location destinationObj = new Location("");
    destinationObj.setLongitude(33.521398);
    destinationObj.setLatitude(73.090826);
    // Store the bearingTo in the bearTo variable
    float bearTo = LocationObj.bearingTo( destinationObj );

    // If the bearTo is smaller than 0, add 360 to get the rotation clockwise.
    if (bearTo < 0) {
        bearTo = bearTo + 360;
    }

    //This is where we choose to point it
    float direction = bearTo - azimuth;

    // If the direction is smaller than 0, add 360 to get the rotation clockwise.
    if (direction < 0) {
        direction = direction + 360;
    }

    //Log.i(TAG, "rotation sensor angle : " + direction);
    //mapController.setMapRotation((float) Math.toRadians(direction));
    //rotateImageView( arrow, R.drawable.arrow, direction );

    //Set the field
    String bearingText = "N";

    if ( (360 >= baseAzimuth && baseAzimuth >= 337.5) || (0 <= baseAzimuth && baseAzimuth <= 22.5) ) bearingText = "N";
    else if (baseAzimuth > 22.5 && baseAzimuth < 67.5) bearingText = "NE";
    else if (baseAzimuth >= 67.5 && baseAzimuth <= 112.5) bearingText = "E";
    else if (baseAzimuth > 112.5 && baseAzimuth < 157.5) bearingText = "SE";
    else if (baseAzimuth >= 157.5 && baseAzimuth <= 202.5) bearingText = "S";
    else if (baseAzimuth > 202.5 && baseAzimuth < 247.5) bearingText = "SW";
    else if (baseAzimuth >= 247.5 && baseAzimuth <= 292.5) bearingText = "W";
    else if (baseAzimuth > 292.5 && baseAzimuth < 337.5) bearingText = "NW";
    else bearingText = "?";

    //fieldBearing.setText(bearingText);
    Log.i(TAG, "rotation sensor azimuth : " + bearingText);

}
Community
  • 1
  • 1
Nouman Bhatti
  • 1,777
  • 4
  • 28
  • 55

0 Answers0