Android:如何获得准确的高度?
我只需要使用GPS进行精确的高度测量。
我尝试了Location.getAltitude(),但这是非常不准确的。 有什么build议?
使用智能手机/平板电脑GPS的高度有两个问题:
- 高度是WGS84参考椭球面以上的高度。 这不是地平线或海平面以上的高度。 这里有更多的细节: http : //www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915 。 这个错误可以纠正; 这里是一个描述如何做到这一点: http : //www.unavco.org/edu_outreach/tutorial/geoidcorr.html 。 networking文章链接到一个计算器,以获得大地水准器的高度进行校正; 我不知道是否也有一个可用于此计算的Web服务。
- 相对便宜的GPS接收机,GPS高度非常不准确。 这里是一篇文章: http : //gpsinformation.net/main/altitude.htm 。 应对这种不准确的一种方法是过滤高度数据。 我用一个圆形arrays数据结构来记住最后几个(我使用4个)高度读数并计算平均值。 这足以让我的应用程序获得相对准确的垂直速度读数。
还有其他的方法来获取高度比GPS。 你可以使用气压计,但因为没有那么多气压传感器(只有新的气压传感器)。 我会build议使用Web服务来获取所需的数据。
下面是一个可以帮助你的问题: 在Android中获取经度和纬度的高度
另一种方法是parsingNMEAstring。 $ GPGGA句子已包含海平面以上的修正高度数据。
所以,只需为您的LocationManager创build一个NMEAstring监听器并parsing消息:
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]); } } } }
您可以更换通过位置监听器接收的最后一个位置对象的高度,也可以通过NMEAparsing整个新位置。