Question

Je dois obtenir une mesure précise de l'altitude en utilisant uniquement GPS.

J'ai essayé Location.getAltitude(), mais qui est terriblement inexacte. Un conseil?

Était-ce utile?

La solution

Il y a deux questions à l'utilisation d'altitude d'un smartphone / tablette GPS:

  1. L'altitude est l'altitude au-dessus du ellipsoïde de référence WGS84. Il n'est pas l'altitude au-dessus du niveau du sol ou du niveau de la mer. Voici plus en détail sur ce point: http://www.gpspassion.com/forumsen/ topic.asp? topic_id = 10915 . Cette erreur peut être corrigée; voici une description comment faire la main: http://www.unavco.org/ edu_outreach / tutorial / geoidcorr.html . L'article Web des liens vers une calculatrice pour obtenir la hauteur géoïde pour la correction; Je ne sais pas s'il y a aussi un service Web disponible pour ce calcul.
  2. L'altitude GPS est terriblement imprécis pour les récepteurs GPS relativement bon marché. Voici un article sur ce point: http://gpsinformation.net/main/altitude.htm . Une méthode pour faire face à ce genre d'inexactitude est de filtrer les données d'altitude. J'utilisé une structure de données de réseau circulaire pour rappeler la dernière peu (je 4) les mesures d'altitude et de calculer la moyenne. Cela suffisait pour obtenir une lecture relativement précise de la vitesse verticale pour mon application.

Autres conseils

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

Alors, créez simplement un écouteur à cordes-NMEA pour votre LocationManager et analyser 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 Lieu reçu par un écouteur d'emplacement, ou analyser l'ensemble nouvel emplacement via NMEA.

Il existe d'autres façons d'obtenir l'altitude que par GPS. Vous pouvez utiliser le baromètre, mais comme il n'y a pas que de nombreux appareils avec un des capteurs barométriques encore (seuls les nouveaux). Je recommande d'utiliser un service Web pour acquérir les données souhaitées.

Voici une question qui devrait vous aider à travers: Get altitude par la longitude et latitude dans les applications

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

En utilisant la pression, vous pouvez calculer l'altitude de l'utilisateur. Je suis incertain du niveau de précision de cela et si elle est plus précise que l'approche de l'autre réponse.

En utilisant le formule hypsométrique vous pouvez calculer l'altitude:

Définition de la variable:

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

Vous pouvez obtenir la pression dans Android de l'environnement capteurs

SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,pressure)

Pour les nouveaux arrivants, je fait une bibliothèque qui enveloppent LocationManager dans rxjava et observables ajouter des aides observables pour obtenir le niveau de la mer Hauteurs de Nmea / GPGGA info mre ici

Il existe des bibliothèques, telles que l'open-source CS-Map qui fournissent une API qui font ces recherches dans les grandes tables. Vous spécifiez les coordonnées, et il vous dira la hauteur du décalage qui doit être appliqué à la hauteur ellipsoïdale à cet endroit pour obtenir le « monde réel » hauteur orthométrique.

Note: Après avoir utilisé CS-Map avant, il est pas exactement l'emploi straight-forward 5 minutes de le brancher pour vous avertir à l'avance qu'il est plus compliqué que d'appeler une API unique avec un ensemble de lat long. les coordonnées et les reprendre une hauteur. Je ne fonctionnent plus dans l'entreprise où nous faisions ce genre de travail, ne peut donc malheureusement pas rechercher le code de dire exactement qui API à l'appel.

Faire une recherche google pour elle en ce moment (2019), il semble CS-Map a été fusionné MetaCRS dans OSGeo, le " Open Source Geospatial Foundation " projet. Cette même recherche m'a conduit à ce vieux CS-Map WIKI ainsi que la page GitHub PROJ , où PROJ semble être projet similaire à CS-Map.

Je vous recommande d'utiliser NmeaListener , comme sladstaetter suggéré dans sa réponse . Toutefois, selon documentation NMEA , « $ GPGGA » est pas la seule phrase que vous pouvez obtenir . Vous devriez chercher une phrase "GGA" (de $ - GGA).

Les expressions régulières sont grandes pour que, par exemple:.

@Override
public void onNmeaReceived(final long timestamp, final String nmea) {
    final Pattern pattern = Pattern.compile("\\$..GGA,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([+-]?\\d+(.\\d+)?),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$");
    final Matcher matcher = pattern.matcher(nmea);
    if (matcher.find()) {
        final float altitude = Float.parseFloat(matcher.group(1));
        // ...enjoy the altitude!
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top