私は、コンパスが通常の北の位置ではなく、特定の緯度の経度の位置を指すようにするAndroidアプリケーションを開発しています。誰かがこれを実装する方法を提案できますか?北方向を指すアプリケーションを開発しました。
これを実装する方法を事前に感謝します。これを行うデモアプリケーションは非常に役立ちます。
6563 次
2 に答える
3
ここから簡単なコンパスを実装できます。それは明らかに北を指していますが、コンパスが特定の場所または座標を指すようにするために、このようなことを行うことができます。
このメソッドをアクティビティに追加すると、2つの座標間の方位が検出されます。
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();
}
}
}
于 2015-08-30T09:37:29.177 に答える
-1
このチュートリアルをチェックしてください。それはあなたが正しい方向に始めるのに役立つはずですコンパスチュートリアル またここにもう一つの良い1秒のコンパスチュートリアルがあります
于 2011-10-10T15:28:14.847 に答える