2011-10-10 3 views
2

나침반에서 일반적인 북쪽 위치 대신 특정 위도 경도 위치를 가리 키도록 Android 애플리케이션을 개발 중입니다. 아무도 이것을 구현하는 방법을 제안 할 수 있습니다. 북쪽 방향을 가리키는 응용 프로그램을 개발했습니다.
미리 구현해 주셔서 감사합니다. 이 작업을 수행하는 데모 응용 프로그램은 큰 도움이 될 것입니다.나침반을 현재 위치를 기준으로 특정 위도 경도 위치를 가리키는 방법은 무엇입니까?

답변

1

이 자습서를 확인하십시오. 그것은 당신이 또한 여기에 올바른 방향 Compass Tutorial 에서 시작해야하는 또 다른 좋은 일 Second Compass tutorial

+6

이러한 예는 질문에 대한 대답이 아닌 것 같습니다. 이것들은 사용자 지정 위치가 아닌 북쪽을 가리키는 단순히 나침반을 만듭니다. – rodi

1

당신은 here에서 간단한 나침반을 구현할 수있다. 분명히 북쪽을 가리키고 있지만, 나침반을 특정 위치 나 좌표로 가리 키기 위해 이런 식으로 할 수 있습니다.

이 방법을 작업에 추가하면 두 좌표 사이에 방위가 있습니다.

protected double bearing(double startLat, double startLng, double endLat, double endLng){ 
     double longitude1 = startLng; 
     double longitude2 = endLng; 
     double latitude1 = Math.toRadians(startLat); 
     double latitude2 = Math.toRadians(endLat); 
     double longDiff= Math.toRadians(longitude2-longitude1); 
     double y= Math.sin(longDiff)*Math.cos(latitude2); 
     double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff); 

    return (Math.toDegrees(Math.atan2(y, x))+360)%360; 
} 

나침반 클래스에서 onSensorChanged 방법,이

azimuth -= bearing(yourlatitude, yourlongitude, latWhereToPoint, lngWhereToPoint); 

위도, 경도을 -> 현재 위도, 경도 latWhereToPoint, lngWheretoPoint -> 당신이 가리 키도록 원하는 위치.

끝 부분에서 onSensorChanged는 다음과 같이됩니다.

@Override 
public void onSensorChanged(SensorEvent event) { 
    final float alpha = 0.97f; 

    synchronized (this) { 
     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

      mGravity[0] = alpha * mGravity[0] + (1 - alpha) 
        * event.values[0]; 
      mGravity[1] = alpha * mGravity[1] + (1 - alpha) 
        * event.values[1]; 
      mGravity[2] = alpha * mGravity[2] + (1 - alpha) 
        * event.values[2]; 

      // mGravity = event.values; 

      // Log.e(TAG, Float.toString(mGravity[0])); 
     } 

     if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 
      // mGeomagnetic = event.values; 

      mGeomagnetic[0] = alpha * mGeomagnetic[0] + (1 - alpha) 
        * event.values[0]; 
      mGeomagnetic[1] = alpha * mGeomagnetic[1] + (1 - alpha) 
        * event.values[1]; 
      mGeomagnetic[2] = alpha * mGeomagnetic[2] + (1 - alpha) 
        * event.values[2]; 
      // Log.e(TAG, Float.toString(event.values[0])); 

     } 

     float R[] = new float[9]; 
     float I[] = new float[9]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, 
       mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      // Log.d(TAG, "azimuth (rad): " + azimuth); 
      azimuth = (float) Math.toDegrees(orientation[0]); // orientation 
      azimuth = (azimuth + 360) % 360; 

      azimuth -= bearing(yourlatitude, yourlongitude, latWhereToPoint, lngWhereToPoint); 
      // Log.d(TAG, "azimuth (deg): " + azimuth); 
      adjustArrow(); 
     } 
    } 
}