Android:如何获得准确的海拔高度?

ask*_*ask 52 gps android location altitude

我需要仅使用GPS获得准确的海拔测量值.

我试过了Location.getAltitude(),但这非常不准确.有什么建议?

Ste*_*fan 57

使用智能手机/平板电脑GPS的高度有两个问题:

  1. 海拔高度是WGS84参考椭球上方的海拔高度.它不是高于地面或海平面的高度.以下是更多细节:http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID = 10915.这个错误可以纠正; 以下是如何手动执行此操作的说明:http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html.网络文章链接到计算器以获得大地水准面高度进行校正; 我不知道是否还有可用于此计算的Web服务.
  2. 对于相对便宜的GPS接收器,GPS高度非常不准确.这是一篇关于此的文章:http://gpsinformation.net/main/altitude.htm.处理这种不准确性的一种方法是过滤高度数据.我使用圆形阵列数据结构来记住最后几个(我使用4个)高度读数并计算平均值.这足以为我的应用程序获得相对准确的垂直速度读数.

  • 你可以离线进行。您只需要计算椭球体和海平面之间的差异。这是不平凡的。看到这个答案:/sf/answers/896803491/ (2认同)

sla*_*ter 7

另一种方法是解析 NMEA 字符串。在$ GPGGA句话已经包含海拔修正高度数据。

因此,只需为 LocationManager 为 NMEA 字符串创建一个侦听器并解析消息:

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]);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以替换通过位置侦听器接收到的最后一个 Location 对象的高度,也可以通过 NMEA 解析整个新位置。

  • `NmeaListener` 已弃用。请改用“OnNmeaMessageListener”。 (2认同)

Jon*_*aem 5

另一种方法是通过气压计测量高度。

通过使用压力,您可以计算用户的海拔高度。我不确定它的精度水平以及它是否比其他答案的方法更准确。

通过使用测高公式,您可以计算海拔高度:

测压公式

变量定义:

P0: Sea-level pressure 
P: Atmospheric pressure 
T: Temperature 
Run Code Online (Sandbox Code Playgroud)

你可以从环境传感器获取android中的压力

SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,pressure)
Run Code Online (Sandbox Code Playgroud)