2010-05-07 26 views
7

HICome funziona getAltitude() di Android GPS Location Works

Ho provato a implementare un semplice localizzatore GPS. Quindi è usato

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this); 

poi ho usato il metodo

public void onLocationChanged(Location location) { 

a leggere l'altitudine dalla mia posizione attuale.

Ma non so davvero cosa restituisca Location.getAltitude(). Il documento dice che restituisce l'altitudine. Ma è in metri? o piedi? se metto il telefono sulla scrivania accanto a me, questo valore cambia tra 500 e -500 ??

Come funziona davvero ???

+8

Tuttavia, questo non è qualcosa che è meglio lasciare a supporre (sappiamo tutti dove assumere ci mette in programmazione). Soprattutto perché il paese di cui parli è dove google ha sede. Accettiamo solo che la documentazione potrebbe essere migliorata. – snapfractalpop

risposta

23

Il valore di altitudine ottenuto è in metri da the gps (WGS84)reference ellipsoid e non dallo geoid.

Dalla mia esperienza personale i valori di altitudine del GPS sono davvero pessimi.

ho letto questo sul GPS Status FAQ:

GPS non riporta l'altezza al di sopra del livello medio del mare, piuttosto il sistema GPS confronta l'altezza per l'ellissoide di riferimento WGS84 che può essere al di sopra o al di sotto del reale livello del mare. In diverse parti della terra può essere spento di oltre 200 metri (a seconda della distribuzione di massa della Terra). Ad esempio, la superficie del geoide intorno alla Florida è al di sopra del livello medio del mare di ben 30-40 metri, il che significa che stare in piedi ti mostrerà -30 metri come altitudine. Questo è normale, e non un errore, e causato dal fatto che l'altitudine è relativa a una superficie di riferimento artificiale e non al livello del mare. Se sei interessato a questo argomento, ti consiglio di leggere Mean Sea Level, GPS, and the Geoid.

+0

È corretto dire che le misurazioni sono "precise ma non accurate" in un'impostazione abbastanza localizzata? In altre parole, è possibile utilizzare il GPS per misurare con precisione l'altitudine relativa tra i punti vicini? – snapfractalpop

+0

@snapfractalpop: No, il GPS non è adatto all'altitudine. Dovresti usare un barometro per misurare l'altitudine, i nuovi telefoni Android hanno quello, ad es. Galaxy Nexus. – Jonas

+0

grazie, buono a sapersi. un barometro sarebbe problematico a causa di disturbi meteorologici? – snapfractalpop

1

Immagino che la vostra scrivania si trovi all'interno di un edificio. Se si ottiene una correzione GPS in un edificio, non ci si deve aspettare che la precisione sia molto alta. È necessario provare a ottenere l'accuratezza della correzione chiamando getAccuracy()?

+0

sì si trova in un edificio ma l'ho messo sul telaio della finestra;) grazie per il suggerimento getAccuracy – RoflcoptrException

5

vecchio post, credo, ma qualcuno potrebbe essere ancora interessato. durante l'ascolto del GPS, è possibile analizzare la frase NMEA GPGGA (http://aprs.gids.nl/nmea/#gga), in cui è presente l'altezza del geoide (altezza del geoide sopra l'ellissoide WGS84). appena sottrarre questa altezza dal valore restituito getAltitude, una e avrai un valore di elevazione più preciso.

Modifica dopo diversi mesi di utilizzo e il feedback ricevuto da parte degli utenti della mia app

Una soluzione migliore è quello di ottenere direttamente il valore di elevazione nella frase GPGGA:

double GGA_ALTITUDE = 0d; 
private static final String NMEA_GGA = "$GPGGA";  
private static final int altitude_element_id = 9; 

@Override 
public void onNmeaReceived(long timestamp, String nmea) { 
    foundSats = true; 
    // check that this is an RMC string 
    if (nmea.startsWith(NMEA_GGA)) { 
     String[] tokens = nmea.split(","); 
     try { 
      // get orthometric elevation 
      String elevation = tokens[altitude_element_id];    
      if (!elevation.equals("")) { 
       Log.d("NMEA", "ortho elev: " + ortho); 
       GGA_ALTITUDE = Double.parseDouble(elevation);     
      } 
     } catch (Exception ex) { 
      Log.e("NMEA", "onNmeaReceived: " 
        + ex.getMessage()); 

      onNmeaException(ex.getMessage());    
      ex.printStackTrace(); 
     } 
    } 
} 
+0

** Se ** il campo è pieno, che non deve essere, e ** se ** la frase è uscita, che non deve essere né e ** se ** c'è uscita NMEA a tutti; dispositivi Android più economici non ce l'hanno affatto. –

+0

Ciao Jan, naturalmente come puoi vedere nel mio codice, alcuni controlli devono essere fatti prima di leggere quel valore. Immagino che nei dispositivi più economici, l'evento onNmeaReceived non venga mai attivato;) – edestrero

+0

Esistono infatti molti dispositivi che non restituiscono affatto NMEA o restituiscono solo informazioni limitate. –

1

Gps misura semplicemente la tempo viene inviato un segnale noto da diversi satelliti. Più satelliti sono in vista del tuo ricevitore GPS, più precisa sarà la tua posizione rispetto a quei satelliti.Mentre il sistema è soggetto ad alcuni disturbi di fondo (il segnale del satellite è relativamente debole e lo spazio è relativamente rumoroso), tempo di precisione basso nel ricevitore, GDOP: dillution geometrico di precisione (tutti i satelliti raggruppati in un angolo di cielo), rifrazione del segnale dovuta al cambiamento delle altezze della ionosfera, - nel complesso è molto preciso nel determinare la distanza da un satellite. Geometricamente hai bisogno di almeno 3 satelliti in vista per ottenere una posizione e un 4 per ottenere l'altitudine. Più satelliti contribuiscono a una maggiore accuratezza e in alcuni ricevitori più complessi (non i nostri telefoni ma specificamente applicazioni aeronautiche) RAIM: il monitoraggio di integrità autonomo del ricevitore è fornito per prevedere l'accuratezza in un'area e in un tempo prima che un aeromobile ...

L'altitudine è problematica per il sistema GPS perché la terra non curva alla costante matematica. Quindi, mentre il sistema sa dove sei rispetto al satellite, deve ora sovrapporlo a un modello matematico della terra. In aviazione i ricevitori Gps più precisi devono avere altitudine integrata con i barometri e in alcuni ricevitori posizione migliorata a causa di un confronto di punti rilevati noto (WAAS e LAAS).

0

Ciò si verifica quando si utilizza LocationManager.NETWORK_PROVIDER come provider di posizione, assicurarsi di utilizzare LocationManager.GPS_PROVIDER come il proprio provider di GPS preferito.