【问题标题】:How does getAltitude() of Android GPS Location WorksAndroid GPS定位的getAltitude()如何工作
【发布时间】:2010-05-07 22:01:12
【问题描述】:

我尝试实现一个简单的 GPS 跟踪器。因此使用

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);  

然后我用了

public void onLocationChanged(Location location) {

读取我当前位置高度的方法。

但我真的不知道 Location.getAltitude() 返回什么。该文件说它返回高度。但这是以米为单位吗?还是脚?如果我把手机放在我旁边的桌子上,这个值会在 500 到 -500 之间变化??

这到底是如何工作的???

【问题讨论】:

  • 不过,这不是最好的假设(我们都知道假设在编程中的作用)。特别是因为你所说的国家是谷歌的总部所在地。让我们同意可以改进文档。

标签: android gps locationmanager wgs84


【解决方案1】:

您获得的高度值是以米为单位的 the gps (WGS84) reference ellipsoid 而不是 geoid

根据我自己的经验,GPS 在高度值方面确实很差。

我在GPS Status 常见问题解答中看到了这篇文章:

GPS 不报告平均海平面以上的高度,而是 GPS 系统将高度与可能高于或低于实际海平面的 WGS84 参考椭球体进行比较。在地球的不同地方,它可以偏离 200 多米(取决于地球的质量分布)。例如,佛罗里达州周围的大地水准面表面比平均海平面高出 30-40 米,这意味着站在岸边会显示 -30m 的高度。这是正常的,而不是错误,并且是由于高度是相对于人工参考表面而不是相对于海平面这一事实造成的。如果你对这个话题感兴趣,我推荐阅读Mean Sea Level, GPS, and the Geoid

【讨论】:

  • 在相当本地化的环境中,可以说测量是“精确但不准确”吗?换句话说,GPS可以用来精确测量附近点之间的相对高度吗?
  • @snapfractalpop:不,GPS 不适合海拔高度。您应该使用气压计来测量高度,较新的 Android 手机有,例如Nexus Galaxy。
  • 谢谢,很高兴知道。由于天气干扰,气压计会出现问题吗?
【解决方案2】:

旧帖子,我想,但有人可能仍然感兴趣。 在听 GPS 的时候,你可以解析 NMEA GPGGA 语句(http://aprs.gids.nl/nmea/#gga),其中有大地水准面高度(WGS84 椭球上方的大地水准面高度)。 只需从 getAltitude 返回值中减去此高度,您将获得更准确的高度值。

经过几个月的使用和我的应用用户收到的反馈后进行编辑

更好的办法是直接获取GPGGA语句中的高程值:

double GGA_ALTITUDE = 0d;
private static final String NMEA_GGA = "$GPGGA";    
private static final int altitude_element_id = 9;

@Override
public void onNmeaReceived(long timestamp, String nmea) {
    foundSats = true;
    // check that this is an RMC string
    if (nmea.startsWith(NMEA_GGA)) {
        String[] tokens = nmea.split(",");
        try {
            // get orthometric elevation
            String elevation = tokens[altitude_element_id];             
            if (!elevation.equals("")) {
                Log.d("NMEA", "ortho elev: " + ortho);
                GGA_ALTITUDE = Double.parseDouble(elevation);                   
            }
        } catch (Exception ex) {
            Log.e("NMEA", "onNmeaReceived: "
                    + ex.getMessage());

            onNmeaException(ex.getMessage());               
            ex.printStackTrace();
        }
    } 
}

【讨论】:

  • If 字段被填充,它不必是,并且 if 句子甚至是输出,它不必要么是并且如果根本没有NMEA输出;便宜的 Android 设备根本没有。
  • 嗨 Jan,当然,正如您在我的代码中看到的那样,在读取该值之前需要进行一些检查。我猜在更便宜的设备中,永远不会触发 onNmeaReceived 事件;)
  • 确实有很多设备根本不返回NMEA或者只返回有限的信息。
  • 如何找到从安卓手机到放置在桌子上的物体的距离?我可以使用这种方法还是我们有其他选择?
【解决方案3】:

我假设您的办公桌位于建筑物内。 如果您在建筑物中获得 GPS 定位,您不应该期望精度非常高。 是否必须尝试通过调用 getAccuracy() 来获得修复的准确性?

【讨论】:

  • 是的,它位于一栋建筑物中,但我把它放在窗框上;)感谢 getAccuracy 提示
【解决方案4】:

Gps 只是测量一个已知信号从几颗卫星发出的时间。您的 Gps 接收器中的卫星越多,您相对于这些卫星的位置就越准确。虽然系统容易出现一些误差 - 背景噪声(卫星信号相对较弱,空间相对嘈杂),接收器中的低精度时间片段,GDOP:精度的几何稀释(所有卫星都集中在天空的一个角落),由于电离层高度变化导致的信号折射 - 总体而言,它在确定您与卫星的距离时非常准确。在几何上,您至少需要 3 颗卫星才能获得位置,而第 4 颗卫星才能获得高度。更多的卫星有助于提高准确性,并且在一些更复杂的接收器(不是我们的手机,而是特别是航空应用)中提供 RAIM:接收器自主完整性监控,用于预测某个区域和时间的准确性,即在飞机着陆之前......

高度对于 GPS 系统来说是个问题,因为地球不会以数学常数弯曲。因此,虽然系统知道您相对于卫星的位置,但它现在必须将其覆盖在地球的数学模型上。在航空领域,更准确的 Gps 接收器必须具有高度并辅以气压计,并且在某些接收器中,由于已知的测量点比较(WAAS 和 LAAS),因此必须具有增强的位置。

【讨论】:

    【解决方案5】:

    这发生在您使用 LocationManager.NETWORK_PROVIDER 之类的位置提供程序时,请确保您使用 LocationManager.GPS_PROVIDER 之类的您最喜欢的 Gps 提供程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      相关资源
      最近更新 更多