2012-06-23 7 views
5

Estoy probando una aplicación de Android que registra la ubicación (lat/long/alt). Estoy corriendo la aplicación en un teléfono Samsung con Android 2.2.1 GTS5830¿La altitud del GPS de Android es incorrecta debido a que no incluye la altura del geoide?

he leído aquí y allá que la altitud del GPS es a menudo incorrecto debido a que la tierra no es perfectamente esférica. En mi ubicación, por ejemplo, the geoid's height es de 52 metros.

Mi entendimiento es que esta altura se sustrajo desde una altitud de GPS "pura". Esto tendría sentido para mi ubicación como:

- altitude from GPS phone: 535 m 
- geoid altitude: 52 m 
- altitude from phone's GPS minus geoid height: 482m 

- correct atlitude: 478 m 

482 es lo suficientemente cerca de la cosa real para mí para hacer un seguimiento de elevación durante las travesías

  1. es la fórmula más arriba de la altura del GPS, menos la altura del geoide correcta ?
  2. ¿Estoy en lo cierto al suponer que Android no está teniendo en cuenta la altura del geoide al devolver la altitud del GPS?
  3. Si lo anterior es cierto, ¿es válido para todas las versiones de Android?

Este es el código que utilizo para obtener las coordenadas GPS:

public class HelloAndroid extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d("main", "onCreate"); 
     setupGps(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    LocationListener locationListener; 
    LocationManager lm; 

    void setupGps() { 
     Log.d("gps", "Setting up GPS..."); 
     locationListener = new MyLocationListener(); 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 5, 
       locationListener); 

     Log.d("gps", 
       "GPS supports altitude: " 
         + lm.getProvider(LocationManager.GPS_PROVIDER) 
           .supportsAltitude()); 
     Log.d("gps", "Finished setting up GPS."); 
    } 

    static class MyLocationListener implements LocationListener { 

     public void onLocationChanged(Location location) { 
      Log.d("gps", "long: " + location.getLongitude() + ", lat: " 
        + location.getLatitude() + ", alt: " 
        + location.getAltitude()); 
     } 
    } 
} 

Respuesta

6

Las respuestas a las tres preguntas son afirmativas.

La altitud que obtienes del GPS es la altura sobre el elipsoide WGS84 en metros, que es una aproximación de la superficie de la tierra. Lo sé porque he estado desarrollando un programa Android para usarlo.

Una corrección se tiene que aplicar para convertir la cifra de altura media sobre el nivel del mar, o la altitud, ya que es generalmente conocido. Tenga en cuenta que esto puede diferir de la altitud reportada por un altímetro configurado a la presión actual a nivel medio del mar porque un altímetro realmente mide la presión del aire, pero la presión del aire no es solo una función de la altura; también es una función de la densidad del aire y la temperatura, por lo que un altímetro muestra una aproximación. Este efecto no se ve con GPS.

El modelo gravitacional de la Tierra 2008 (EGM2008) mapea la diferencia en el nivel medio del mar con el elipsoide en función de la longitud y la latitud. Los detalles están aquí:

http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html

Un modelo menos preciso que utiliza menos datos llamados EGM96 también está disponible. Busca ambos en Google para entenderlos mejor.

+0

Además, las respuestas a las tres preguntas son sí. – davtom

+0

ponga ese comentario en su respuesta y marcaré esto como la respuesta aceptada. –

+0

Lo he hecho, gracias. – davtom

4

Los errores en la altitud, así que no pueden ser hasta el GPS y la separación altura del geoide.

El valor de altitud devuelto por cualquier receptor GPS es siempre el valor menos preciso. A menudo he visto que mi edificio de oficinas informa que se está moviendo en altitud entre -200 y +750 metros. Una razón fundamental es que es imposible obtener una distribución uniforme de los satélites en la dirección de la altitud; siempre estarán por encima de ti, y si hay algún oscurecimiento del cielo a elevaciones bajas, se ubicarán en un cono sobre ti. En las direcciones X e Y siempre, asumiendo una buena vista del cielo, los satélites se extenderán a izquierda y derecha; delante y detrás del receptor. Esta extensión mejora la precisión de la solución de posición.

+0

"-200 a +750 metros": No creo por un segundo que los receptores de GPS sean tan imprecisos con la altitud a menos que tales variaciones se ajusten a la precisión de la medición, pero incluso eso suena inverosímil. –

+0

Para una antena montada en la pared (oscurecida por más del 50% del cielo), en ciertos momentos del día cuando la constelación visible tiene una geometría desfavorable y un arranque en frío (es decir, condiciones de operación hostiles) estos son los extremos típicos que han visto. Estos valores se han visto con SiRFStar-2, SiRFStar-3, Ublox 5 y Ublox 6. En general, la altitud se reducirá a +/- 75 metros después de unos minutos de funcionamiento continuo. –

5

No es tan simple: el Android API ha cambiado o tiene errores. Tengo dos dispositivos Android: un teléfono "genérico" (Android 2.3.6) y un Nexus 7 (Android 4.x).

En el teléfono, getAltitude() da una respuesta consistente con mi altitud real AMSL (es decir, corregido para geoid). En el Nexus 7, la altitud devuelta no está corregida. La documentación del API no especifica cuál se devuelve, por lo que en cierto sentido ambos son "correctos".

Ambos dispositivos parecen tener un número decente GPS modules - el mensaje $GPGGA NMEA muestra tanto la corrección correcta del altitute como la del geoide. Entonces parece que uno tiene que analizar los mensajes uno mismo para obtener la altitud correcta, y el método getAltitude() no es confiable.

Cuestiones relacionadas