Вы можете получить приблизительную оценку (технически это необработанное значение) значений DOP от объектов GpsSatell в объекте GpsStatus. Это позволяет вам не анализировать строки NMEA, и вы можете не только получить H (орбитальный), V (вертикальный) и P (опционный) DOP; Вы также можете получить DOP (N (orth), E (ast), T (ime) и G (eometric)).
Для каждого из объектов GpsSatell вы хотите получить высоту, азимут, usedInFix и snr.
Сначала отфильтруйте все спутники, оставив только тот спутник, где snr> 0 и usedInFix == true.
Для каждого спутника создайте матрицу, где каждый спутник представляет строку в матрице (представленной в виде массива двойных чисел), чтобы создать матрицу, которую мы назовем A :
Примечание: для правильной работы вам нужно как минимум 4 спутника
el = высота в радианах
az = азимут в радианах
Зв = коллекция спутников Gps
A [n] = {sin (Sv [n] .az) * cos (Sv [n] .el), cos (Sv [n] .az) * cos (Sv [n] .el), грех (Sv [n] .el), 1d}
самое интересное
Матричное уравнение DOP выглядит следующим образом
At = транспонированная матрица A
(At * A) ^ - 1 = обратный (транспонировать (A) .times (A)) =
EDOP^2 x x x
x NDOP^2 x x
x x VDOP^2 x
x x x 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)