2011-10-10 47 views

回答

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(); 
     } 
    } 
} 
相关问题