前言
发现做动态轨迹纠偏还是有点用的,记录一下
实现
LoucsCleanUtil.java
//数据荡涤 public static List<LocusCoordinate> dataCleanWGS84(List<LocusCoordinate> data) { //工夫距离(工夫距离) double T = 1.0 / 900; //经度方差(程度地位) double JDFX = 5.8; //纬度方差(垂直地位) double WDFX = 1.3; //状态矩阵(初始值不重要,会主动更正) double[][] X_ARRAY = { {Double.parseDouble(data.get(0).getLon())}, {0}, {Double.parseDouble(data.get(0).getLat())}, {0} }; AtomicReference<Matrix> X = new AtomicReference<>(new Matrix(X_ARRAY)); //状态协方差矩阵(初始值不重要,会主动更正) double[][] P_ARRAY = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; AtomicReference<Matrix> P = new AtomicReference<>(new Matrix(P_ARRAY)); //状态转移矩阵 double[][] F_ARRAY = { {1, T, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, T}, {0, 0, 0, 1} }; Matrix F = new Matrix(F_ARRAY); //状态转移协方差矩阵(对偏差忽略不计) double[][] Q_ARRAY = { {0.0001, 0, 0, 0}, {0, 0.0001, 0, 0}, {0, 0, 0.0001, 0}, {0, 0, 0, 0.0001} }; Matrix Q = new Matrix(Q_ARRAY); //观测矩阵(观测经度纬度) double[][] H_ARRAY = { {1, 0, 0, 0}, {0, 0, 1, 0} }; Matrix H = new Matrix(H_ARRAY); //观测噪声方差(对角线为各维度方差) double[][] R_ARRAY = { {JDFX, 0}, {0, WDFX}, }; Matrix R = new Matrix(R_ARRAY); //I 维度为4 double[][] I_ARRAY = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; Matrix I = new Matrix(I_ARRAY);// List<LocusCoordinate> removeShipList = new ArrayList<>(); AtomicInteger i = new AtomicInteger(); List<LocusCoordinate> tgList = new ArrayList<>(); data.forEach(ship -> { try { i.getAndIncrement(); //==============第1条式子============== Matrix X_ = F.times(X.get()); //==============第2条式子============== Matrix P_ = F.times(P.get()).times(F.transpose()).plus(Q); //==============第3条式子============== Matrix K = P_.times(H.transpose()).times(H.times(P_).times(H.transpose()).plus(R).inverse()); //==============第4条式子============== //程度地位 double Px_tt = Double.parseDouble(ship.getLon()); //垂直地位 double Py_tt = Double.parseDouble(ship.getLat()); double[][] Z_ARRAY = { {Px_tt}, {Py_tt} }; Matrix Z = new Matrix(Z_ARRAY); X.set(X_.plus(K.times(Z.minus(H.times(X_))))); //==============第5条式子============== P.set(I.minus(K.times(H)).times(P_)); //==============数据荡涤============== double abs = Math.abs(Double.parseDouble(ship.getLat()) - X.get().get(2, 0)); double abs1 = Math.abs(Double.parseDouble(ship.getLon()) - X.get().get(0, 0)); //革除噪声 if (abs1 >= 0.8 || abs >= 0.8) {// removeShipList.add(ship); System.out.println(); System.out.println("\033[32;4m" + "======================================《《filter start》》 ===================================================" + "\033[0m"); System.out.println("序号: " + i.get() + " old-JD:" + Px_tt + " old-WD:" + Py_tt + " new-JD:" + X.get().get(0, 0) + " new-WD:" + X.get().get(2, 0)); System.out.println("\033[32;4m" + "=============================================================================================================" + "\033[0m"); System.out.println(); } else { Double[] wgs84 = GCJ02ToWGS84Util.GCJ02ToWGS84(X.get().get(0, 0), X.get().get(2, 0)); ship.setLon(String.valueOf(wgs84[0])); ship.setLat(String.valueOf(wgs84[1])); tgList.add(ship); System.out.println("序号: " + i.get() + " old-JD:" + Px_tt + " old-WD:" + Py_tt + " new-JD:" + X.get().get(0, 0) + " new-WD:" + X.get().get(2, 0)); } } catch (Exception e) { e.printStackTrace(); } });// System.out.println("count :" + removeShipList.size());// data.removeAll(removeShipList); return tgList; } public static List<LocusCoordinate> dataCleanGCJ02(List<LocusCoordinate> data) { //工夫距离(工夫距离) double T = 1.0 / 900; //经度方差(程度地位) double JDFX = 5.8; //纬度方差(垂直地位) double WDFX = 1.3; //状态矩阵(初始值不重要,会主动更正) double[][] X_ARRAY = { {Double.parseDouble(data.get(0).getLon())}, {0}, {Double.parseDouble(data.get(0).getLat())}, {0} }; AtomicReference<Matrix> X = new AtomicReference<>(new Matrix(X_ARRAY)); //状态协方差矩阵(初始值不重要,会主动更正) double[][] P_ARRAY = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; AtomicReference<Matrix> P = new AtomicReference<>(new Matrix(P_ARRAY)); //状态转移矩阵 double[][] F_ARRAY = { {1, T, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, T}, {0, 0, 0, 1} }; Matrix F = new Matrix(F_ARRAY); //状态转移协方差矩阵(对偏差忽略不计) double[][] Q_ARRAY = { {0.0001, 0, 0, 0}, {0, 0.0001, 0, 0}, {0, 0, 0.0001, 0}, {0, 0, 0, 0.0001} }; Matrix Q = new Matrix(Q_ARRAY); //观测矩阵(观测经度纬度) double[][] H_ARRAY = { {1, 0, 0, 0}, {0, 0, 1, 0} }; Matrix H = new Matrix(H_ARRAY); //观测噪声方差(对角线为各维度方差) double[][] R_ARRAY = { {JDFX, 0}, {0, WDFX}, }; Matrix R = new Matrix(R_ARRAY); //I 维度为4 double[][] I_ARRAY = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }; Matrix I = new Matrix(I_ARRAY);// List<LocusCoordinate> removeShipList = new ArrayList<>(); AtomicInteger i = new AtomicInteger(); List<LocusCoordinate> tgList = new ArrayList<>(); data.forEach(ship -> { try { i.getAndIncrement(); //==============第1条式子============== Matrix X_ = F.times(X.get()); //==============第2条式子============== Matrix P_ = F.times(P.get()).times(F.transpose()).plus(Q); //==============第3条式子============== Matrix K = P_.times(H.transpose()).times(H.times(P_).times(H.transpose()).plus(R).inverse()); //==============第4条式子============== //程度地位 double Px_tt = Double.parseDouble(ship.getLon()); //垂直地位 double Py_tt = Double.parseDouble(ship.getLat()); double[][] Z_ARRAY = { {Px_tt}, {Py_tt} }; Matrix Z = new Matrix(Z_ARRAY); X.set(X_.plus(K.times(Z.minus(H.times(X_))))); //==============第5条式子============== P.set(I.minus(K.times(H)).times(P_)); //==============数据荡涤============== double abs = Math.abs(Double.parseDouble(ship.getLat()) - X.get().get(2, 0)); double abs1 = Math.abs(Double.parseDouble(ship.getLon()) - X.get().get(0, 0)); //革除噪声 if (abs1 >= 0.8 || abs >= 0.8) {// removeShipList.add(ship); System.out.println(); System.out.println("\033[32;4m" + "======================================《《filter start》》 ===================================================" + "\033[0m"); System.out.println("序号: " + i.get() + " old-JD:" + Px_tt + " old-WD:" + Py_tt + " new-JD:" + X.get().get(0, 0) + " new-WD:" + X.get().get(2, 0)); System.out.println("\033[32;4m" + "=============================================================================================================" + "\033[0m"); System.out.println(); } else { ship.setLon(String.valueOf(X.get().get(0, 0))); ship.setLat(String.valueOf(X.get().get(2, 0))); tgList.add(ship); System.out.println("序号: " + i.get() + " old-JD:" + Px_tt + " old-WD:" + Py_tt + " new-JD:" + X.get().get(0, 0) + " new-WD:" + X.get().get(2, 0)); } } catch (Exception e) { e.printStackTrace(); } });// System.out.println("count :" + removeShipList.size());// data.removeAll(removeShipList); return tgList; }