2012-02-20 11 views
35

Ho bisogno di ottenere una misurazione accurata dell'altitudine usando solo il GPS.Android: come ottenere l'altitudine esatta?

Ho provato Location.getAltitude(), ma è terribilmente inaccurato. Qualche consiglio?

+0

Eventuali duplicati di [Get altitudine da latitudine e longitudine in Android] (http://stackoverflow.com/questions/1995998/get-altitude-by-longitude-and-latitude-in-android) –

risposta

44

Ci sono due problemi con l'utilizzo di altitudine di un GPS smartphone/tablet:

  1. L'altitudine è l'altitudine al di sopra l'ellissoide di riferimento WGS84. Non è l'altitudine sopra il livello del suolo o del livello del mare. Ecco ulteriori dettagli al riguardo: http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915. Questo errore può essere corretto; ecco una descrizione di come farlo a mano: http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html. L'articolo web si collega a un calcolatore per ottenere l'altezza Geoid per la correzione; Non so se ci sia anche un servizio web disponibile per questo calcolo.
  2. L'altitudine GPS è terribilmente inaccurata per i ricevitori GPS relativamente economici. Ecco un articolo al riguardo: http://gpsinformation.net/main/altitude.htm. Un metodo per far fronte a questo tipo di imprecisione consiste nel filtrare i dati di altitudine. Ho usato una struttura di dati di array circolare per ricordare le ultime letture dell'altitudine (ho usato 4) e calcolare la media. Questo è bastato per ottenere una lettura relativamente accurata della velocità verticale per la mia applicazione.
+0

Grazie. Quindi immagino di non poter ottenere l'altitudine esatta a meno che non disponga dell'accesso a Internet nella mia app per correggere l'altezza di Geoid. – ask

+0

Puoi farlo offline. Hai solo bisogno di calcolare la differenza tra l'ellissoide e il livello del mare. Che non è banale. Vedi questa risposta: https://stackoverflow.com/a/12811478/1561404 –

1

Ci sono altri modi per ottenere l'altitudine rispetto al GPS. È possibile utilizzare il barometro ma poiché non ci sono ancora molti dispositivi con sensori barometrici (solo quelli nuovi). Consiglierò di utilizzare un servizio Web per acquisire i dati desiderati.

Ecco una domanda che dovrebbe aiutare l'utente attraverso: Get altitude by longitude and latitude in Android

2

altro modo sarebbe quello di parsing stringhe NMEA. Lo $GPGGA sentence contiene già i dati di altitudine corretti sopra il livello del mare.

Quindi, è sufficiente creare un listener per NMEA-stringhe per il tuo LocationManager e analizzare i messaggi:

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

è possibile sostituire l'altitudine dell'ultimo oggetto posizione ricevuta attraverso un ascoltatore posizione, o analizzare l'intero nuova posizione attraverso NMEA.

Problemi correlati