2013-04-01 2 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 Directions API 및 길 찾기를 사용하고 싶지 않습니다. 경로 위치가 이미 있습니다. 화살표로 폴리 라인으로 연결하고 싶습니다. – Ramprasad

답변

2

지도에서 동일한 각도로 화살표 이미지를 회전하고 회전시킵니다. 경로 방향과 같습니다.

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

관련 문제