GPS のみを使用して高度を正確に測定する必要があります。
試してみLocation.getAltitude()
ましたが、それはひどく不正確です。何かアドバイス?
There are two issues with using altitude of a smartphone / tablet GPS:
別の方法は、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]);
}
}
}
}
位置リスナーを介して受信した最後の Location オブジェクトの高度を置き換えるか、NMEA を介して新しい位置全体を解析できます。
GPS 以外にも高度を取得する方法はあります。気圧計を使用できますが、気圧センサーを備えたデバイスはまだそれほど多くないため (新しいもののみ)。必要なデータを取得するには、Web サービスを使用することをお勧めします。
Androidで経度と緯度で高度を取得するのに役立つ質問があります
sladstaetter が回答で提案したように、 NmeaListenerを使用することをお勧めします。ただし、NMEA のドキュメントによると、取得できる文は「$GPGGA」だけではありません。「GGA」文 ($--GGA) を探す必要があります。
正規表現はそのために最適です。たとえば、次のようになります。
@Override
public void onNmeaReceived(final long timestamp, final String nmea) {
final Pattern pattern = Pattern.compile("\\$..GGA,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([+-]?\\d+(.\\d+)?),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$");
final Matcher matcher = pattern.matcher(nmea);
if (matcher.find()) {
final float altitude = Float.parseFloat(matcher.group(1));
// ...enjoy the altitude!
}
}