2012-02-20 7 views
35

Necesito obtener una medición precisa de la altitud usando solo GPS.Android: ¿Cómo obtener una altitud precisa?

Probé Location.getAltitude(), pero eso es terriblemente impreciso. ¿Algún consejo?

+0

Posible duplicado de [Obtener altitud por longitud y latitud en Android] (http://stackoverflow.com/questions/1995998/get-altitude-by-longitude-and-latitude-in-android) –

Respuesta

44

Hay dos problemas con el uso de un GPS altitud teléfono inteligente/tableta:

  1. La altitud es la altitud por encima del elipsoide de referencia WGS84. No es la altitud sobre el nivel del suelo o el nivel del mar. Aquí hay más detalles sobre eso: http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915. Este error puede ser corregido; aquí hay una descripción de cómo hacerlo a mano: http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html. El artículo web se vincula a una calculadora para obtener la altura del geoide para su corrección; No sé si también hay un servicio web disponible para este cálculo.
  2. La altitud del GPS es terriblemente inexacta para los receptores GPS relativamente baratos. Aquí hay un artículo sobre eso: http://gpsinformation.net/main/altitude.htm. Un método para hacer frente a este tipo de imprecisión es filtrar los datos de altitud. Utilicé una estructura de datos de matriz circular para recordar las últimas (utilicé 4) lecturas de altitud y calcular el promedio. Esto fue suficiente para obtener una lectura relativamente precisa de la velocidad vertical para mi aplicación.
+0

Gracias. Así que supongo que no puedo obtener una altitud precisa a menos que tenga acceso a Internet en mi aplicación para corregir la altura del geoide. – ask

+0

Puedes hacerlo sin conexión. Solo necesitas calcular la diferencia entre el elipsoide y el nivel del mar. Que no es trivial Ver esta respuesta: https://stackoverflow.com/a/12811478/1561404 –

1

Hay otras maneras de obtener la altitud que por GPS. Puede usar el barómetro, pero todavía no hay muchos dispositivos con sensores barométricos (solo los nuevos). Recomendaré usar un servicio web para adquirir los datos deseados.

Aquí es una pregunta que debe ayudarle a través de: Get altitude by longitude and latitude in Android

2

Otra forma sería procesar las cadenas NMEA. El $GPGGA sentence ya contiene los datos de altitud corregidos sobre el nivel del mar.

Por lo tanto, basta con crear un oyente a NMEA-secuencias para su LocationManager y analizar los mensajes:

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

puede reemplazar la altitud de la última localización de objetos recibido con un detector de localización, o analizar el conjunto nueva ubicación a través de NMEA.

Cuestiones relacionadas