Solución:
Hay dos problemas con el uso de la altitud del GPS de un teléfono inteligente / tableta:
- 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 se puede corregir; 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.
- La altitud GPS es terriblemente inexacta para 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 inexactitud es filtrar los datos de altitud. Usé una estructura de datos de matriz circular para recordar las últimas lecturas de altitud (usé 4) y calcular el promedio. Esto fue suficiente para obtener una lectura relativamente precisa de la velocidad vertical para mi aplicación.
Otra forma sería analizar cadenas NMEA. La oración $ GPGGA ya contiene los datos de altitud corregidos sobre el nivel del mar.
Entonces, simplemente cree un oyente para cadenas NMEA para su LocationManager y analice 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 detector de ubicación o analizar toda la nueva ubicación a través de NMEA.
Otro enfoque es medir la altitud con el barómetro.
Utilizando la presión puede calcular la altitud del usuario. No estoy seguro del nivel de precisión de esto y si es más preciso que el enfoque de la otra respuesta.
Mediante el uso de la fórmula hipsométrica puede calcular la altitud:
Definición de variable:
P0: Sea-level pressure
P: Atmospheric pressure
T: Temperature
Puede obtener la presión en Android de los sensores ambientales
SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,pressure)