4

GPS のみに基づいた Android コンパスを作成したいと思います。私が開発しているデバイスには、加速度計や磁場センサーがありません。そのため、android.location クラスのみに依存する必要があります。

これまでのところ、現在の GPS 座標を表示するために LocationManager にアクセスすることはうまくいきます (以下を参照)。どうするのが一番良いのか悩んでいます。現在の座標と地理的な北座標を既知の値として使用して、方向を計算します。

このアプローチが理にかなっているのか、コードを共有しているのか、誰にでもアドバイスできますか?

これまでに得たコードは次のとおりです。

public class CompassActivity extends Activity implements LocationListener {


Compass myCompass;
private TextView mInfoText;
private LocationManager mLoc;

private static final Integer MINIMUM_UPDATE_INTERVAL = 5000; //update every 5s
private static final Integer MINIMUM_UPDATE_DISTANCE = 5; //update every 5m

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_compass);
    myCompass = (Compass)findViewById(R.id.mycompass);

    mInfoText = (TextView) findViewById(R.id.infotext);
    mLoc = (LocationManager) getSystemService(LOCATION_SERVICE);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.compass, menu);
    return true;
}

@Override
protected void onResume() {
    mLoc.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_UPDATE_INTERVAL, MINIMUM_UPDATE_DISTANCE, this);
    super.onResume();

}

@Override
protected void onPause() {
    mLoc.removeUpdates(this);
    super.onPause();
}

@Override
protected void onStop() {
    finish();
    super.onStop();
}

@Override
public void onLocationChanged(Location loc) { //display coordinates
    System.out.println(loc.toString());
    String title = "Current location: ";
    final StringBuilder sb = new StringBuilder(title);
    sb.append("Longitude: ");
    sb.append(loc.getLongitude());
    sb.append("Latitude: ");
    sb.append(loc.getLatitude());
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            mInfoText.setText(sb.toString());
        }
    });
}

@Override
public void onProviderDisabled(String provider){ // message if GPS is disabled
    Toast.makeText(this, "GPS disabled", Toast.LENGTH_LONG).show();
    AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
    alertbox.setMessage("Please activate GPS!");
    alertbox.setNeutralButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            finish();
        }
    }
    );
    alertbox.show();
}


@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "GPS enabled", Toast.LENGTH_LONG).show();
}


@Override
public void onStatusChanged(String provider, int status, Bundle b) { // called upon GPS status changes
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        Toast.makeText(this, "Status changed: out of service", Toast.LENGTH_LONG).show();
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        Toast.makeText(this, "Status changed: temporarily unavailable", Toast.LENGTH_LONG).show();
        break;
    case LocationProvider.AVAILABLE:
        Toast.makeText(this, "Status changed: available", Toast.LENGTH_LONG).show();
        break;
    }

}

}

4

1 に答える 1

0

デバイスが現在向いている方向をユーザーに示すことはできません。ただし、デバイスの GPS 提供の位置を取得できる可能性がある場合は、デバイスが移動した方向を示すことができます。

位置の更新を取得する場合、この 2 つの間の方位を計算するには 2 つの位置が必要です。

double x = Math.cos(lat2) * Math.sin(lng1-lng2);
double y = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lng1-lng2);
double bearing = Math.atan2(x, y);

お役に立てれば!

于 2016-08-10T13:23:00.850 に答える