studio programacion herramientas fundamentos con avanzado aplicaciones android gps location altitude

programacion - manual de android en pdf



Android: ¿cómo obtener una altitud precisa? (3)

Necesito obtener una medición precisa de la altitud usando solo GPS.

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


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

  1. La altitud es la altitud sobre el 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.

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í hay una pregunta que debería ayudarte: Obtener altitud por longitud y latitud en Android


Otra forma sería analizar cadenas NMEA. La sentencia $ GPGGA ya contiene los datos de altitud corregidos sobre el nivel del mar.

Entonces, simplemente crea un oyente para cadenas NMEA para tu LocationManager y analiza 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 del último objeto de ubicación recibido a través de un oyente de ubicación o analizar toda la nueva ubicación a través de NMEA.