2010-05-07 10 views
7

HIWie funktioniert getAltitude() von Android GPS Standort funktioniert

Ich habe versucht, einen einfachen GPS-Tracker zu implementieren. Daher wird

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

Dann habe ich die

public void onLocationChanged(Location location) { 

Methode, um die Höhe meiner aktuellen Position zu lesen.

Aber ich weiß nicht wirklich, was Location.getAltitude() zurückgibt. Das Dokument sagt, dass es die Höhe zurückgibt. Aber ist das in Metern? oder Füße? Wenn ich das Telefon neben mich auf den Schreibtisch stelle, ändert sich dieser Wert zwischen 500 und -500?

Wie funktioniert das wirklich ???

+8

Dennoch ist dies nicht etwas, das am besten angenommen wird (wir wissen alle, wo uns die Annahme in die Programmierung versetzt). Vor allem, da das Land, von dem Sie sprechen, der Hauptsitz von Google ist. Lasst uns einfach zustimmen, dass die Dokumentation verbessert werden könnte. – snapfractalpop

Antwort

23

Der Höhenwert, den Sie erhalten, ist in Metern von the gps (WGS84)reference ellipsoid und nicht von der geoid.

Aus meiner eigenen Erfahrung sind die GPS in Höhenwerten wirklich schlecht.

Ich lese diese auf dem GPS Status FAQ:

GPS berichten nicht die Höhe über dem Meeresspiegel, sondern das GPS-System die Höhe der WGS84 Bezugsellipsoid vergleicht, die oberhalb oder unterhalb der tatsächlichen sein kann Meereshöhe. In verschiedenen Teilen der Erde kann es um mehr als 200 Meter abweichen (abhängig von der Massenverteilung der Erde). Zum Beispiel liegt die Geoidoberfläche um Florida über dem mittleren Meeresspiegel um gut 30-40 Meter, was bedeutet, dass das Stehen an der Küste -30m als Höhe anzeigen würde. Dies ist normal und kein Fehler und wird dadurch verursacht, dass die Höhe relativ zu einer künstlichen Referenzfläche und nicht zum Meeresspiegel ist. Wenn Sie an diesem Thema interessiert sind, empfehle ich, Mean Sea Level, GPS, and the Geoid zu lesen.

+0

Ist es fair zu sagen, dass die Messungen "präzise, ​​aber nicht genau" in einer ziemlich lokalisierten Umgebung sind? Mit anderen Worten, kann GPS verwendet werden, um die relative Höhe zwischen benachbarten Punkten genau zu messen? – snapfractalpop

+0

@snapfractalpop: Nein, GPS ist nicht gut für die Höhe. Sie sollten ein Barometer verwenden, um die Höhe zu messen, neuere Android-Handys haben, z. Nexus-Galaxie. – Jonas

+0

danke, gut zu wissen. wäre ein Barometer aufgrund von Wetterstörungen problematisch? – snapfractalpop

1

Ich nehme an, dass sich Ihr Schreibtisch in einem Gebäude befindet. Wenn Sie ein GPS-Fix in einem Gebäude erhalten, sollten Sie nicht erwarten, dass die Genauigkeit sehr hoch ist. Haben Sie versucht, die Genauigkeit der Korrektur durch Aufruf von getAccuracy() zu bekommen?

+0

ja es ist in einem Gebäude, aber ich lege es auf den Fensterrahmen;) danke für die getAccuracy Tipp – RoflcoptrException

5

alte Post, ich Rekon, aber jemand könnte noch interessiert sein. während Sie GPS hören, können Sie NMEA GPGGA Satz (http://aprs.gids.nl/nmea/#gga) analysieren, in dem die Geoidhöhe (Höhe des Geoid über WGS84 Ellipsoid) ist. subtrahieren Sie diese Höhe von dem Rückgabewert getAltitude, und Sie erhalten einen genaueren Höhenwert.

Bearbeiten nach mehreren Monaten der Nutzung und Feedback von Benutzern meiner App

Eine bessere Lösung direkt auf den Höhenwert im GPGGA Satz zu erhalten ist:

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

** Wenn ** das Feld gefüllt ist, was es nicht sein muss, und ** wenn ** der Satz gerade ausgegeben wird, muss es auch nicht sein und ** wenn ** es gibt NMEA-Ausgabe bei alle; billiger Android-Geräte haben es überhaupt nicht. –

+0

Hallo Jan, natürlich, wie du in meinem Code sehen kannst, sind einige Überprüfungen vor dem Lesen dieses Wertes zu machen. Ich nehme an, dass bei billigeren Geräten das onNmeaReceived-Ereignis nie ausgelöst wird;) – edestrero

+0

Es gibt tatsächlich viele Geräte, die NMEA überhaupt nicht zurückgeben oder nur begrenzte Informationen zurückliefern. –

1

GPS einfach misst die Zeit wird ein bekanntes Signal von mehreren Satelliten gesendet. Je mehr Satelliten in Sichtweite Ihres GPS-Empfängers, desto genauer wird Ihre Position im Verhältnis zu diesen Satelliten bestimmt.Während das System anfällig für einige Fehler ist - Hintergrundrauschen (das Satellitensignal ist relativ schwach und der Raum ist relativ laut), niedrige Präzision Zeitstück in Ihrem Empfänger, GDOP: geometrische Auflösung der Präzision (alle Satelliten in einer Ecke des Himmels gruppiert), Brechung des Signals aufgrund der Ionosphäre, die Höhen ändert, - insgesamt ist es sehr genau bei der Bestimmung Ihrer Entfernung von einem Satelliten. Geometrisch benötigt man mindestens 3 Satelliten, um eine Position zu erhalten, und einen vierten um die Höhe zu erhalten. Mehr Satelliten tragen zu größerer Genauigkeit bei und in einigen komplexeren Empfängern (nicht unseren Telefonen, sondern speziell in der Luftfahrt) RAIM: Empfängerautonomes Integritätsmonitoring wird bereitgestellt, um die Genauigkeit in einem Gebiet und in einer Zeit zu prognostizieren, dh bevor ein Flugzeug landet ...

Die Höhe ist für das GPS-System problematisch, weil die Erde nicht mit einer mathematischen Konstante krümmt. Während also das System weiß, wo Sie sich relativ zum Satelliten befinden, muss es das jetzt auf einem mathematischen Modell der Erde überlagern. In der Luftfahrt müssen die genaueren Gps-Empfänger eine Höhe aufweisen, die durch Barometer und in einigen Empfängern eine verbesserte Position aufgrund eines bekannten Vermessungspunkt-Vergleichs (WAAS und LAAS) ergänzt wird.

0

Dies kommt vor, wenn Sie den Standortanbieter LocationManager.NETWORK_PROVIDER verwenden. Stellen Sie sicher, dass Sie LocationManager.GPS_PROVIDER wie Ihren bevorzugten GPS-Provider verwenden.