由于不包括大地水准面高度,Android 的 GPS 高度是不是不正确?

Posted

技术标签:

【中文标题】由于不包括大地水准面高度,Android 的 GPS 高度是不是不正确?【英文标题】:Is Android's GPS altitude incorrect due to not including geoid height?由于不包括大地水准面高度,Android 的 GPS 高度是否不正确? 【发布时间】:2012-06-25 11:12:48 【问题描述】:

我正在测试一个记录位置 (lat/long/alt) 的 android 应用。我正在运行 Android 2.2.1 的三星 GTS5830 手机上运行该应用程序

我在这里和那里读到 GPS 高度通常是不正确的,因为地球不是完美的球形。例如,在我的位置,the geoid's height 是 52 米。

我的理解是,这个高度会从“纯”GPS 高度中减去。这对我的位置是有意义的:

 - altitude from GPS phone: 535 m
 - geoid altitude: 52 m 
 - altitude from phone's GPS minus geoid height: 482m

 - correct atlitude: 478 m 

482 足够接近真实的东西,我可以在徒步旅行时跟踪海拔

    上面的GPS高度减去大地水准面高度的公式是否正确? 我是否正确假设在返回 GPS 高度时 android 没有考虑大地水准面的高度? 如果上述情况属实,是否适用于所有版本的 Android?

这是我用来获取 GPS 坐标的代码:

public class HelloAndroid extends Activity 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        Log.d("main", "onCreate");
        setupGps();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    

    LocationListener locationListener;
    LocationManager lm;

    void setupGps() 
        Log.d("gps", "Setting up GPS...");
        locationListener = new MyLocationListener();
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 5,
                locationListener);

        Log.d("gps",
                "GPS supports altitude: "
                        + lm.getProvider(LocationManager.GPS_PROVIDER)
                                .supportsAltitude());
        Log.d("gps", "Finished setting up GPS.");
    

    static class MyLocationListener implements LocationListener 

        public void onLocationChanged(Location location) 
            Log.d("gps", "long: " + location.getLongitude() + ", lat: "
                    + location.getLatitude() + ", alt: "
                    + location.getAltitude());
        
    

【问题讨论】:

【参考方案1】:

所有三个问题的答案都是肯定的。

您从 GPS 获得的高度是 WGS84 椭球上方的高度(以米为单位),这是地球表面的近似值。我知道这一点,因为我一直在开发 Android 软件来使用它。

必须进行校正才能将数字转换为高于平均海平面的高度,或通常已知的高度。请注意,这可能与设置为平均海平面当前压力的高度计报告的高度不同,因为高度计实际上测量的是气压,但气压不仅仅是高度的函数;它也是空气密度和温度的函数,因此高度计显示的是近似值。 GPS 看不到这种效果。

Earth Gravitational Model 2008 (EGM2008) 将平均海平面的差异与椭球映射为经度和纬度的函数。详情在这里:

http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html

还提供了一种使用较少数据的不太准确的模型,称为 EGM96。谷歌这两个以更好地理解这些。

【讨论】:

另外,您的三个问题的答案都是肯定的。【参考方案2】:

事情没那么简单——Android API 要么发生了变化,要么存在错误。我有两部 Android 设备——一部“通用”手机 (Android 2.3.6) 和一部 Nexus 7 (Android 4.x)。

在电话中,getAltitude() 给出的答案与我的实际高度 AMSL 一致(即更正为 geoid)。在Nexus 7 上,返回的高度未校正。 API 的文档没有指定返回哪个 - 所以在某种意义上两者都是“正确的”。

这两种设备似乎都有不错的GPS modules——$GPGGA NMEA 消息显示正确的高度和大地水准面校正。所以看起来好像必须自己解析消息才能得到正确的高度,getAltitude() 方法是不可信的。

【讨论】:

【参考方案3】:

高度误差很可能不归咎于 GPS 和大地水准面高度分离。

任何 GPS 接收器返回的高度值始终是最不准确的值。我经常看到我的办公楼报告说它的高度在 -200 到 +750 米之间移动。一个根本原因是不可能在高度方向上均匀分布卫星。它们将始终在您上方,如果在低海拔地区有任何遮蔽天空,它们将位于您上方的锥形中。在 X 和 Y 方向上,假设天空视野良好,总会有左右散布的卫星;在接收器的前面和后面。这种扩展提高了位置解决方案的准确性。

【讨论】:

“-200 到 +750 米”:我不相信 GPS 接收器对高度的精确度,除非这种变化符合测量的准确性,但即使这样听起来也不可信。 对于壁挂式天线(遮蔽超过 50% 的天空),在一天中的特定时间,当可见星座具有不利的几何形状,并执行冷启动(即恶劣的操作条件)这些是我见过的典型极端情况。这些值已在 SiRFStar-2、SiRFStar-3、Ublox 5 和 Ublox 6 上观察到。通常,连续运行几分钟后,海拔高度会下降到 +/-75 米。

以上是关于由于不包括大地水准面高度,Android 的 GPS 高度是不是不正确?的主要内容,如果未能解决你的问题,请参考以下文章

海拔高大地高

地理坐标系和球面极坐标系的区别和联系

Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键

第九章

Android获取状态栏和标题栏的高度

由于宽度和高度,未找到 Android 资源