2012-02-20 1 views
35

Мне нужно получить точное измерение высоты, используя только GPS.Android: Как получить точную высоту?

Я попробовал Location.getAltitude(), но это ужасно неточно. Любые советы?

+0

Возможный дубликат [Получить высоту по долготе и широте в Android] (http://stackoverflow.com/questions/1995998/get-altitude-by-longitude-and-latitude-in-android) –

ответ

44

Есть две проблемы, связанные с использованием высоты смартфон/таблетка GPS:

  1. Высота над уровнем моря высота над опорным WGS84 эллипсоида. Это не высота над уровнем земли или уровнем моря. Подробнее об этом: http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915. Эта ошибка может быть исправлена; вот описание, как это сделать вручную: http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html. Веб-статья ссылается на калькулятор, чтобы получить высоту Geoid для коррекции; Я не знаю, есть ли для этого вычисления веб-сервис.
  2. GPS-высота очень неточна для относительно дешевых приемников GPS. Вот статья о том: http://gpsinformation.net/main/altitude.htm. Одним из способов справиться с такой неточностью является фильтрация данных о высоте. Я использовал структуру данных кругового массива, чтобы запомнить последние несколько (я использовал 4) показания высоты и вычислить среднее значение. Этого достаточно, чтобы получить относительно точное чтение вертикальной скорости для моего приложения.
+0

Спасибо. Поэтому, я думаю, я не могу получить точную высоту, если у меня нет доступа к Интернету в моем приложении, чтобы исправить высоту Geoid. – ask

+0

Вы можете сделать это в автономном режиме. Вам просто нужно вычислить разницу между эллипсоидом и уровнем моря. Что нетривиально. См. Этот ответ: https://stackoverflow.com/a/12811478/1561404 –

1

Есть другие способы получить высоту, чем GPS. Вы можете использовать барометр, но пока еще не так много устройств с барометрическими датчиками (только новые). Я рекомендую использовать веб-службу для получения желаемых данных.

Вот вопрос, который должен помочь вам: Get altitude by longitude and latitude in Android

2

Другой способ синтаксического анализа строки NMEA. $GPGGA sentence уже содержит скорректированные данные о высоте над уровнем моря.

Так, просто создать слушатель NMEA-строки для вашего LocationManager и анализировать сообщения:

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

Вы можете либо заменить высоту последнего объекта Location получил через местоположения слушатель, или разобрать все новое местоположение через NMEA.