Algorithme de compression de trajectoire
Description de la scène
Compte tenu d'un fichier d'enregistrement de données GPS, chaque enregistrement contient deux champs de coordonnées, la longitude et la dimension et comprime les enregistrements en fonction du seuil de distance, et forme une piste avec les coordonnées de latitude et de longitude de tous les enregistrements filtrés.
Description de l'algorithme
Cet algorithme a une large gamme d'utilisations.
Les algorithmes de compression de trajectoire sont divisés en deux catégories, à savoir la compression sans perte et la compression avec perte. Les algorithmes de compression sans perte incluent principalement le codage de Huffman, et les algorithmes de compression avec perte sont divisés en méthode de traitement par lots et méthode de compression de données en ligne. La méthode de traitement par lots comprend l'algorithme DP (Douglas-Peucker), l'algorithme TD-T-T-TR (Time-Ratio de haut en bas) et l'algorithme Bellman. Les méthodes de compression de données en ligne incluent les fenêtres coulissantes, les fenêtres ouvertes, les méthodes de sécurité basées sur la zone, etc.
Vous pouvez également vous référer à cet article: " Code détaillé de l'algorithme de Douglas-Peucker pour la programmation Java implémentant la compression de la trajectoire "
Implémentation de code
Importer java.awt.color; Importer java.awt.graphics; import java.awt.point; import java.awt.toolkit; import java.io.buffereDeader; import java.io.inputstreamreader; import java.io.randomaccess; java.text.decimalformat; import java.util.arraylist; import java.util.iterator; import javax.swing.jframe; import javax.swing.jpanel; public class trajectorycom {public static void main (string [] args) lance l'exception {// la liste de stockage de la listes de stockage à double maxDistance = 30; Points de position lus dans le fichier ArrayList <Nepoint> ENPLIST = new ArrayList <Nepoint> (); // Créez l'objet de fichier de l'adresse du fichier de données source // C'est là que vous devez modifier l'adresse de stockage de votre fichier source. Remember if the address contains "/", remember to add another "/", the reason "/" is an escape symbol//This can be written as C:/Users/Administrator/Desktop/11.6/2007-10-14-GPS.logFile sourceFile = new File("./2007-10-14-GPS.log");//Calculating the file reading function to read file data ENPList = GETENPOINTFROMFILE (SourceFile); // Ceci est de tester si vous avez lu les données dans la liste et vérifier le nombre de données dans la liste. N'oubliez pas de commenter System.out.println (enplist.size ()); / * * Traitement de données * Méthode: Open Window Track Track Method * * //// Set of Stocking Points Target ArrayList <Nepoint> RepointList = New ArrayList <Nepoint> (); RepointList = OpenWindowtra (RepointList.Size.Size); dans le fichier cible * * / fichier cibleFile = nouveau fichier ("./ 2007-10-14-gpsresult.log"); WriteTestPointTofile (TargetFile, RepointList); / * * Calcul du taux compact * / Double Cpl = (double) RepointList.Size () / (double) ENPLIST.SIZE () * 100; DECIMALFORMAT DF = NOUVEAU DECIMALFORMAT ("0,000000"); Système. Erreur de distance * * / double avEDiSerr = getMeandisterRor (enplist, RepointList); System.out.println (AveDiRer); / * * Draw Lines pour former un tableau de comparaison * * /// générer la référence (Aplist, RepointList);} / * * Extraire les points de position de la liste des fichiers fournis * et appelez la fonction de conversion pour stocker la valeur de la coordon Points * / public static arrayList <Nepoint> getenpointfromfile (fichier fgps) lève une exception {arrayList <Nepoint> pgpsArray = new ArrayList <Nepoint> (); if (fgps.exists () && fgps.isfile ()) {inputStreamReder read = new InputStreamReader Buffreder (new FileInputStream (fgps)); Breader = new BufferedReader (Read); // Cached Read Initialisation String Str; String [] Strgps; int i = 0; while ((str = Bailer.Readline ())! = null) {// Une ligne est lue par ligne strgps = str.split (""); Enpoint p = new Enpoint (); p.id = i; i ++; (dftodu (strgps [3])); p.pn = (dftodu (strgps [5])); pgpsArray.add (p);} fonction de baignoir.close ();} return pgpsArray;} / ** * fonction de la fonction: convertir la latitude d'origine et les données de coordonnées de longitude est une double dfree * la laine obtenue et la longitude des données est une corde * / piste de la chaîne DRIDE * str) {int indexd = str.indexof ('.'); // get. La position de la chaîne de caractères strm = str.substring (0, indexd-2); // entier partie partie de partie strn = str.substring (indexd-2); // decimal partie double d = double.parsedouble (strm) + double.parsedouble (strn) / 60; return d;} / * window implémentation de la fenêtre ouverte * Retour une liste compressée * liste des données de la liste des données et de la méthode de la fenêtre ouverte * Implémentation de la fenêtre ouverte * Description de l'algorithme: * Point initial et point flottant calculent le point de projection, jugez la distance entre le point de projection et le point de trajectoire et la valeur de seuil. Si la distance est supérieure à la valeur de seuil *, le point initial est placé dans la liste cible, le point flottant fait ses recherches comme le nouveau point initial, et le nouveau point initial recherche vers l'arrière comme le deuxième point flottant. Ici, il y a un jugement qui est de savoir si la nouvelle position de point initiale +1 est égale à la longueur de la liste. Ceci détermine la sélection du point flottant * Ceci est géré au point final * * / public static arrayList <enpoint> openWindowtra (ArrayList <Nepoint> SourceList, Double MaxDis) {ArrayList <Nepoint> TargetList = New ArrayList <Depoint> (); // Définir la position du point initial de la position du point initial 2 int startPoint = 0; // Définir la position du point initial de la position du point initial 2 INT STARTPORT FloatPoint = 2; // Définissez la position du point initial de la position actuelle de ponctuel de piste comme 1Int Nowpoint = 1; int len = sourceList.size (); // Stockage l'ensemble d'informations des points dans tous les Windows ArrayList <Denpoint> listPoint = new ArrayList <NPoint> (); ListPoint.Add (SourceList.get (NowPoint)); // Floating Position détermine la boucle Point de suivi dans la fenêtre booléen drapeau = false; // calculer et juger si la distance entre tous les points de la fenêtre et le point de projection est supérieure au seuil pour (point de point: listpoint) {double dopoftwo = getDistance (SourceList.get (startPoint), SourceList.get (floatpoint), point); if (disoftwo> = 30) {flag = true; briss;}} if (drap) {// Les distances des points dans la fenêtre sont supérieures au seuil // le point initial est ajouté à la liste cible cibleList.add (SourceList.get (startpoint)); // le point initial change startpoint = floatpoint - 1; // le point de flux de flux Flotpoint + = 1; if (floatPoint> = len) {TargetList.add (SourceList.get (FloatPoint-1)); Break;} // Le point dans la fenêtre modifie ListPoint.Clear (); // System.out.println (ListPoint.Size ()); listpoint.add (SourceList.get (startPoint + 1));} else {// La distance est inférieure au seuil // le point initial reste inchangé // La collection de fenêtres actuelle ajoute le point flottant actuel ListPoint.Add (SourceList.get (FloatPoint)); // Le point de flux flottant se déplace un point de vue de la fenêtre + =/ seuil, ignorez le point de fenêtre et ajoutez directement le point d'extrémité au point de point cible set if (floatpoint> = len) {TargetList.Add (SourceList.get (startPoint)); TargetList.Add (SourceList.get (FloatPoint-1)); BREAK Point de piste C * Formule de zone triangulaire * / public statique Double GetDistance (Enpoint A, Enpoint B, Enpoint C) {Double Distance = 0; Double A = Math.Abs (Géodist (A, B)); Double B = Math.Abs (Géodist (B, C)); Double C = Math.Abs (GeoDist (A, C)); Math.sqrt (p * (pa) * (pb) * (pc)); Distance = s * 2.0 / a; retour de distance;} / * * Fonction de copie de l'arrayList * * // * Fonctions fournies * La fonction qui calcule la distance a été modifiée pour obtenir la méthode de calcul de distance suivante * Je n'ai pas étudié comment calculer la distance * * / public static double géodiste (Enrop Rad (pa.pn); double radlat2 = rad (pb.pn); double delta_lon = rad (pb.pe - pa.pe); double top_1 = math.cos (radlat2) * math.sin (delta_lon); double top_2 = math.cos (radlat1) * math.sin (radlat2) - math.sin (radlat1) * Math.cos (radlat2) * math.cos (delta_lon); double top = math.sqrt (top_1 * top_1 + top_2 * top_2); double inférieur = math.sin (radlat1) * math.sin (radlat2) + math.cos (delta_lon) * Math.cos (radlat2) * math.cos (delta_lon); Math.atan2 (en haut, en bas); double distance = delta_sigma * 6378137.0; distance de retour;} public statique double rad (double d) {return d * math.pi / 180.0;} / * * Écrivez des informations de point de position compressées dans le fichier * * / public static vide writeTestPoint) Exception {iterator <npoint> ifilter = pgpspointfilter.iterator (); randomaccessfile rfilter = new randomaccessfile (outgpsfile, "rw"); while (ifilter.hasnext ()) {enpoint p = ifilter.next (); string sfilter = p.getResterString (); byte [] bFilter = sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();} / ** * Fonction Fonction: Trouver l'erreur de distance moyenne * Renvoie la distance moyenne * / public static Double GetmendisterRor (ArrayList <enpoint> pgpsarray, ArrayList <enPoint> pgpsarrayre) {Double SumDist = 0,0; pour (int (int (int. i = 1; i <pgpsArrayre.size (); i ++) {double = "" end = "pgpsArrayre.get (i) .id;" int = "" j = "start + 1; j <end; j ++) {" signifie = "sumdist / (pgpsArray.size ());" pre = "" return = "" start = "pgpsarrayre.get (i-1) .id;" sumdist = ""> <pre> Importer java.text.decimalformat; public class Enpoint implémente comparable <enpoint> {public int id; // point idpublic double pe; // longitude public public pn; // dimension publie enpoint () {} // vide Constructeur public string toString () {return this.id + "#" + this.pn + "," + that. getResultString () {decimalformat df = new decimalformat ("0.000000"); return this.id + "#" + df.format (this.pe) + "," + df.format (this.pn) + "/ n";} @ overtide public int compareTo (enpoint autre) {if (this.id <autre.Id) else = "return =" " this.id = ""> autre.id) retour 1; else return 0;}}Résumer
Ce qui précède est l'intégralité du contenu de cet article sur le code d'instance de fenêtre ouverte de l'algorithme de compression de la trajectoire d'implémentation Java. J'espère que ce sera utile à tout le monde. S'il y a des lacunes, veuillez laisser un message pour le signaler.