如何根据我当前的位置使罗盘指向我特定的纬度经度位置?

我正在开发一个Android应用程序,我希望指南针指向特定的纬度经度位置,而不是通常的北方位置。 任何人都可以建议如何实现这一点。 我开发了一个指向北方向的应用程序。
在此先感谢如何实现这一点。 任何这样做的演示应用程序都会有很大的帮助。

看看这个教程。 它应该让你开始正确的方向指南针教程这里还有另一个很好的第二指南针教程

你可以从这里实现简单的罗盘。 它显然指向北方,但为了使罗盘指向某个位置或坐标,你可以做这样的事情。

在您的活动中添加此方法,它会在两个坐标之间找到方位。

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; } 

在Compass类中的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(); } } }