由于不包括大地水准面高度,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 高度是不是不正确?的主要内容,如果未能解决你的问题,请参考以下文章