如何从 GPS LocationManager获取HDOP 或 VDOP 值?
5 回答
GPS_Location:
double lo=gps_loc.getLongitude();
double la=gps_loc.getLatitude();
水平精度:
int horiAcc=(int)(gps_loc.getAccuracy());
HDOP:
int hd= (int) (horiAcc/5);
要获取 HDOP、VDOP、PDOP、DGPSID 和 AGEOFDGPSDATA 使用GpsStatus.NmeaListener并实现onNmeaReceived()
protected String latestHdop;
protected String latestPdop;
protected String latestVdop;
protected String geoIdHeight;
protected String ageOfDgpsData;
protected String dgpsId;
@Override
public void onNmeaReceived(long timestamp, String nmeaSentence) {
loggingService.OnNmeaSentence(timestamp, nmeaSentence);
if(Utilities.IsNullOrEmpty(nmeaSentence)){
return;
}
String[] nmeaParts = nmeaSentence.split(",");
if (nmeaParts[0].equalsIgnoreCase("$GPGSA")) {
if (nmeaParts.length > 15 && !Utilities.IsNullOrEmpty(nmeaParts[15])) {
this.latestPdop = nmeaParts[15];
}
if (nmeaParts.length > 16 &&!Utilities.IsNullOrEmpty(nmeaParts[16])) {
this.latestHdop = nmeaParts[16];
}
if (nmeaParts.length > 17 &&!Utilities.IsNullOrEmpty(nmeaParts[17]) && !nmeaParts[17].startsWith("*")) {
this.latestVdop = nmeaParts[17].split("\\*")[0];
}
}
if (nmeaParts[0].equalsIgnoreCase("$GPGGA")) {
if (nmeaParts.length > 8 &&!Utilities.IsNullOrEmpty(nmeaParts[8])) {
this.latestHdop = nmeaParts[8];
}
if (nmeaParts.length > 11 &&!Utilities.IsNullOrEmpty(nmeaParts[11])) {
this.geoIdHeight = nmeaParts[11];
}
if (nmeaParts.length > 13 &&!Utilities.IsNullOrEmpty(nmeaParts[13])) {
this.ageOfDgpsData = nmeaParts[13];
}
if (nmeaParts.length > 14 &&!Utilities.IsNullOrEmpty(nmeaParts[14]) && !nmeaParts[14].startsWith("*")) {
this.dgpsId = nmeaParts[14].split("\\*")[0];
}
}
}
您可以从 GpsStatus 对象中的 GpsSatellite 对象中获得 DOP 值的粗略估计(技术上它是原始值)。这使得您无需解析 NMEA 字符串,您不仅可以获得 H(水平)、V(垂直)和 P(位置)DOP;您还可以获得 N(orth)、E(ast)、T(ime) 和 G(eometric) DOP。
对于每个 GpsSatellite 对象,您需要获取仰角、方位角、usedInFix 和 snr。首先过滤掉所有的卫星,只保留snr>0和usedInFix==true的卫星。
为每个卫星创建一个矩阵,其中每个卫星代表矩阵中的一行(表示为双精度数组)以创建我们将调用的矩阵A:
注意:要使其正常工作,您至少需要 4 颗卫星
el = 以弧度表示的高程
az=方位角,单位为弧度
Sv=GpsSatellite 的集合
A[n]={sin(Sv[n].az)*cos(Sv[n].el), cos(Sv[n].az)*cos(Sv[n].el), sin(Sv[ n].el), 1d}
有趣的部分来了
DOP矩阵方程如下
At = 转置矩阵 A
(At*A)^-1 = 逆(转置(A).times(A)) =
EDOP^2 xxx x NDOP^2 xx xx VDOP^2 x xxx TDOP^2
明显的 DOP:
EDOP = sqrt(EDOP^2)
NDOP = sqrt(NDOP^2)
VDOP = sqrt(VDOP^2)
TDOP = sqrt(TDOP^2)
派生的 DOP:
GDOP = sqrt(EDOP^2+NDOP^2+VDOP^2+TDOP^2)
HDOP = sqrt(EDOP^2+NDOP^2)
PDOP = sqrt(EDOP^2+NDOP^2+VDOP^2)
精度通常是指位置类中 GPS 的 HDOP。但是,如果您想要两者,您可以尝试使用 NmeaListener获取原始 NMEA 字符串并对其进行解析以获取 HDOP 和 VDOP。
您需要注册一个NMEAListener
并尝试解析GSA
句子(包含 HDOP、VDOP 和 PDOP)或GGA
句子(包含用于修复的 HDOP)。
有关详细信息,请参阅 NMEA 0183 标准。