2013-04-01 15 views
2

我已经计算了两个纬度和经度坐标之间的角度,如下面的代码。它以弧度返回角度3,度数为193。我想根据此角度在地图上显示箭头标记。如何根据此角度显示移动的对象方向?如何根据以度为单位的计算角度显示地图上的方向

public static double getAngle(double lat1, double lon1, double lat2, double lon2) 
    { 
     //Formulas 

    //θ = atan2( sin(Δlong).cos(lat2),cos(lat1).sin(lat2) − sin(lat1).cos(lat2).cos(Δlong)) 
    // Δlong = long2 - long1 
    Log.i("angle", "Inside getAngle"); 
    double latitude1 = Math.toRadians(lat1); 
    double longitude1 = Math.toRadians(lon1); 
    double latitude2 = Math.toRadians(lat2); 
    double longitude2 = Math.toRadians(lon2); 


    double dlong = Math.toRadians(longitude2-longitude1); 

    double y = Math.sin(dlong) * Math.cos(latitude2); 
    double x = Math.cos(latitude1)*Math.sin(latitude2) - Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(dlong); 
    double angle= Math.atan2(y, x); 


    if (angle < 0) 
     angle = Math.abs(angle); 
    else 
     angle = 2*Math.PI - angle; 

    Log.i("angle", String.valueOf(angle)+" in radians"); 

    angle=Math.toDegrees(angle); 
    Log.i("angle", String.valueOf(angle)+" in degrees"); 

    return angle; 
} 
+0

所以试试像这样Uri.parse(“http://maps.google.com/maps?f=d&daddr=51.448,-0.972”));得到两点之间的方向.. – Janmejoy

+0

不,我不想使用Google路线API和路线。我已经有了路线位置。我只想用折线连接箭头。 – Ramprasad

回答

2

我角和相同的角度旋转箭头图像上Map.This使得像路线的方向。

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 

/* inside for loop of all Latitude Longitude values */ 
float angle=(float)finalBearing(previousLocationLatitude, previousLocationLongitude, currentLocationLatitude, currentLocationLongitude); 

Bitmap sprite = BitmapFactory.decodeResource(this.getResources(),R.drawable.dir_green_image); 

Matrix mat = new Matrix(); 
mat.preRotate(angle);///in degree 
Bitmap mBitmap = Bitmap.createBitmap(sprite, 0, 0, sprite.getWidth(), sprite.getHeight(), mat, true); 

mMap.addMarker(new MarkerOptions().position(new LatLng(currentLocationLatitude, currentLocationLongitude)).icon(BitmapDescriptorFactory.fromBitmap(mBitmap)).anchor((float)0.5, (float)0.5)); 
/* inside for loop of all Latitude Longitude values */ 


static public double initialBearing (double lat1, double long1, double lat2, double long2) 
{ 
    return (_bearing(lat1, long1, lat2, long2) + 360.0) % 360; 
} 

static public double finalBearing(double lat1, double long1, double lat2, double long2) 
{ 
    return (_bearing(lat2, long2, lat1, long1) + 180.0) % 360; 
} 

static private double _bearing(double lat1, double long1, double lat2, double long2) 
{ 
    double degToRad = Math.PI/180.0; 
    double phi1 = lat1 * degToRad; 
    double phi2 = lat2 * degToRad; 
    double lam1 = long1 * degToRad; 
    double lam2 = long2 * degToRad; 

    return Math.atan2(Math.sin(lam2-lam1)*Math.cos(phi2), 
     Math.cos(phi1)*Math.sin(phi2) - Math.sin(phi1)*Math.cos(phi2)*Math.cos(lam2-lam1) 
    ) * 180/Math.PI; 
} 
+1

你可以请你保持清醒吗?我也需要实现它。 – Sharmilee

+1

@Sharmilee看到我更新的答案。 – Ramprasad