web-dev-qa-db-fra.com

Android: Comment obtenir une altitude précise?

Je dois obtenir une mesure précise de l'altitude à l'aide du GPS uniquement.

J'ai essayé Location.getAltitude(), mais c'est terriblement inexact ..__ Un conseil?

44
ask

L'utilisation de l'altitude d'un smartphone/tablette GPS pose deux problèmes:

  1. L'altitude est l'altitude au-dessus de l'ellipsoïde de référence WGS84. Ce n'est pas l'altitude au-dessus du niveau du sol ou de la mer. Voici plus de détails à ce sujet: http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915 . Cette erreur peut être corrigée. Voici une description de la procédure manuelle: http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html . L'article Web est lié à une calculatrice pour obtenir la hauteur du géoïde à corriger. Je ne sais pas s'il existe également un service Web disponible pour ce calcul.
  2. L'altitude GPS est terriblement inexacte pour les récepteurs GPS relativement bon marché. Voici un article à ce sujet: http://gpsinformation.net/main/altitude.htm . Une méthode pour faire face à ce type d'inexactitude consiste à filtrer les données d'altitude. J'ai utilisé une structure de données de réseau circulaire pour me souvenir des dernières lectures d'altitude (j'ai utilisé 4) et calculer la moyenne. Cela suffisait pour obtenir une lecture relativement précise de la vitesse verticale pour mon application.
50
Stefan

Une autre façon serait d'analyser les chaînes NMEA. La phrase $ GPGGA contient déjà les données d'altitude corrigées au-dessus du niveau de la mer. 

Donc, créez simplement un écouteur pour les chaînes NMEA pour votre LocationManager et analysez les messages: 

private GpsStatus.NmeaListener mNmeaListener = new GpsStatus.NmeaListener() {
    @Override
    public void onNmeaReceived(long timestamp, String nmea) {
        parseNmeaString(nmea);
    }
};

public void registerLocationManager(Context context) {
        mLocationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
        mLocationManager.addNmeaListener(mNmeaListener);
}

private void parseNmeaString(String line) {
        if (line.startsWith("$")) {
            String[] tokens = line.split(",");
            String type = tokens[0];

            // Parse altitude above sea level, Detailed description of NMEA string here http://aprs.gids.nl/nmea/#gga
            if (type.startsWith("$GPGGA")) {
                if (!tokens[9].isEmpty()) {
                    mLastMslAltitude = Double.parseDouble(tokens[9]);
                }
            }
        }
    }

Vous pouvez remplacer l'altitude du dernier objet Location reçu via un écouteur d'emplacement ou analyser le nouvel emplacement complet via NMEA. 

3
sladstaetter

Il existe d'autres moyens d'obtenir l'altitude que par GPS. Vous pouvez utiliser le baromètre, mais comme il n’ya pas encore beaucoup d’appareils dotés de capteurs barométriques (seuls les nouveaux). Je recommanderai d'utiliser un service Web pour acquérir les données souhaitées. 

Voici une question qui devrait vous aider à: Obtenir l'altitude par longitude et latitude dans Android

1
7heViking

Une autre approche consiste à mesurer l'altitude à partir du baromètre. 

En utilisant la pression, vous pouvez calculer l'altitude de l'utilisateur. Je ne suis pas sûr du niveau de précision de ce point et s'il est plus précis que l'approche de l'autre réponse. 

En utilisant la formule hypsometric vous pouvez calculer l’altitude: 

 hypsometric formula

Définition de variable:

P0: Sea-level pressure 
P: Atmospheric pressure 
T: Temperature 

Vous pouvez obtenir la pression dans Android à partir de capteurs d’environnement

SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,pressure)
0
Jonas Praem

Pour les nouveaux arrivants, j'ai créé une bibliothèque qui encapsule LocationManager dans des observables rxjava et ajoute quelques aides observables pour obtenir le niveau de la mer de Nmea/GPGGA mre info ici

0
Samuel Eminet