Trajektorienkomprimierungsalgorithmus
Szenenbeschreibung
Bei einer GPS -Datendatensatzdatei enthält jeder Datensatz zwei Koordinatenfelder, Längengrad und Dimension, und komprimiert die Datensätze gemäß dem Abstandsschwellenwert und bildet eine Spur mit den Koordinaten von Breitengraden und Längengrad aller gefilterten Datensätze.
Algorithmus Beschreibung
Dieser Algorithmus hat eine Vielzahl von Verwendungsmöglichkeiten.
Trajektorienkomprimierungsalgorithmen sind in zwei Kategorien unterteilt, nämlich verlustfreie Komprimierung und verlustige Komprimierung. Verlustlose Komprimierungsalgorithmen umfassen hauptsächlich die Huffman -Codierung, und Verlustkomprimierungsalgorithmen werden in die Batch -Verarbeitungsmethode und die Online -Datenkomprimierungsmethode unterteilt. Die Batch-Verarbeitungsmethode umfasst den DP (Douglas-Peucker) -Algorithmus, den TD-TR (Top-Down-Zeitrate) -Algorithmus und der Bellman-Algorithmus. Zu den Online-Datenkomprimierungsmethoden gehören Gleitfenster, geöffnete Fenster, sichere ödenbasierte Methoden usw.
Sie können sich auch auf diesen Artikel beziehen: " Detaillierter Code des Douglas-Peucker-Algorithmus für die Java-Programmierung zur Implementierung der Trajektorienkomprimierung "
Code -Implementierung
Import Java.awt.Color; Import Java.awt.graphics; Import Java.awt. java.text.decimalformat; import Java.util.ArrayList; Import Java.util.iterator; import Javax.swing.jframe; Liste der Positionspunkte, die aus der Datei ArrayList <Chinspoint> eNPLIST = New ArrayList <Enpoint> (); // Erstellen Sie das Dateiobjekt der Adresse der Quelldatendatei //. Hier müssen Sie die Speicheradresse Ihrer Quelldatei ändern. Denken Sie daran, wenn die Adresse "/" enthält, denken Sie daran, einen weiteren "/" hinzuzufügen, der Grund "/" ist ein Escape-Symbol // Dies kann als c: /users/administrator/desktop/11.6/2007-10-14-gps.logfile Quellfile = neue Datei ("./ 2007-14-14-gps.log") geschrieben werden. GetenPointFromFile (SourceFile); // Dies soll testen, ob Sie die Daten in der Liste gelesen haben, und die Anzahl der Daten in der Liste zu überprüfen. Denken Sie daran, system.out.println (enplist.size ()) zu kommentieren;/** Datenverarbeitung* Methode: Öffnen Sie die Fenster -Track -Komprimierungsmethode** //// Set von Zielpunkten ArrayList <enpoint> repointlist = new ArrayList <Enpoint> (); RepointList = OpenWindWowTra (enPlist, maxDistance); Schreiben Sie in die Zieldatei * */Datei targetFile = neue Datei ("./ 2007-10-14-Gpsresult.log"); WriteTestPointToFile (TargetFile, RepointList);/ * * Kompaktrate -Berechnung */double cpl = (doppelte) Repointlist.SIZE ()/(doppelte) enPlist.SIZE () * 100; DecimalFormat df = new DecimalFormat ("0,000000"); Durchschnittlicher Entfernungsfehler**/double avediserr = getMeandisterRor (Enplist, RepointList); System.out.println (Avediserr);/* Zeichnen Sie Zeilen, um ein Vergleichsdiagramm zu bilden Punkte*/public static ArrayList <Conpoint> GetenPointfromFile (Datei fGPS) löst eine Ausnahme aus {ArrayList <Enpoint> pgpsarray = new ArrayList <enPoint> (); if (fgps.exists () && fgps.isfile ()) {InputStreamReader Read = InputStreamStream -Streaming -Streaming -Streaming -Streaming -Streaming -Streaming -StreamStream -StreamStream (new FileInIntoring). breader = neuer bufferedReader (read); // zwischengespeicherte Leseinitialisierung String str; String [] strgps; int i = 0; while (st = breader.readline ()! (dftodu (strgps [3]); p.pn = (dftodu (strgps [5]); str) {int indexd = str.Indexof ('.'); // get. Die Position der Zeichenfolge String strm = str.Substring (0, indexd-2); // Integer Part String Strn = Str.Substring (INDEXD-2); // Dezimales Teil doppelte d = double.ParSeDoUn Algorithmus Beschreibung: * Anfangspunkt und schwimmender Punkt Berechnen Sie den Projektionspunkt, beurteilen Sie den Abstand zwischen dem Projektionspunkt und dem Trajektorienpunkt und dem Schwellenwert. Wenn der Abstand größer als der Schwellenwert*ist, wird der Anfangspunkt in die Zielliste platziert, der schwimmende Punkt sucht nach dem neuen Anfangspunkt und der neue Anfangspunkt nach rückwärts als zweiter als neuer Schwimmpunkt. Hier gibt es ein Urteil, ob die neue Ausgangsposition +1 gleich der Listenlänge ist. Dies bestimmt die Auswahl des schwimmenden Punktes*, der bis zum Endpunkt gehandhabt wird 2Int floatpoint = 2; // Definieren Sie die Anfangsposition der aktuellen Spurpunktposition als 1Int Nowpoint = 1; int len = Sourcelist.size (); // Speichern Sie den Informationssatz von Punkten in allen Windows ArrayList <Enpoint> listPoint = new Arraylist <Noint> (); ob der Spurpunkt im Fenster boolean flag = false; // Berechnen Sie und beurteilen Sie, ob der Abstand zwischen allen Punkten im Fenster und dem Projektionspunkt größer ist als der Schwellenwert für (Endepoint -Punkt: ListPoint) {double disoftwo = getDistance (Sourcelist.get (Startpoint), Sourzelist.get.get (Flohpoint), Punkt); if (disoftwo> = 30) {flag = true; break;}} if (flag) {// Die Abstände der Punkte im Fenster sind größer als der Schwellenwert // Der Anfangspunkt wird zur Zielliste TargetList.add (Sourcelist) hinzugefügt. if (floatpoint> = len) {targetList.add (Sourcelist.get (floatpoint-1)); break;} // Der Punkt im Fenster ändert listpoint.clear (); // system.out.println (listPoint.size ()); listPoint.add (Sourzelist.get (Startpoint +1));} else {// Die Entfernung ist geringer als der Schwellenwert // Der Anfangspunkt bleibt unverändert // Die aktuelle Fenstersammlung fügt den aktuellen schwimmenden Punktlistenliste. Der Schwellenwert, ignorieren Sie den Fensterpunkt und fügen Sie den Endpunkt direkt zum Zielpunkt hinzu, wenn (floatpoint> = len) {targetList.add (Sourzelist.get (Startpoint)); TargetList.Add (Sourzelist.Get (Floatpoint-1)); Break;}} Flag = False; Der aktuelle Spurpunkt c * Triangular Area Formel */public static double getDistance (enpoint a, enpoint b, enpoint c) {Doppelabstand = 0; Doppel a = math.abs (Geodist (a, b)); Double B = Math.abs (Geodist (B, C)); Double C = math.abs (Geodist (a); Math.sqrt (p * (pa) * (pb) * (pc)); distanz = s * 2.0/a; Rückstand;}/ * * ArrayList -Kopie -Funktion * * // * Funktionen bereitgestellt * Die Funktion, die den Abstand modifiziert wurde, um die folgende Entfernungsberechnung zu erhalten. 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. Math.cos(radLat2) * Math.cos(delta_lon);double top = Math.sqrt(top_1 * top_1 + top_2 * top_2);double bottom = Math.sin(radLat1) * Math.sin(radLat2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.cos(delta_lon);double delta_sigma = Math.atan2 (oben, unten); Doppelentfernung = Delta_Sigma * 6378137.0; Rückstand;} öffentliches statisches Doppel -Rad (doppelte d) {return d * math.pi/180.0;}/ * * komprimierte Positionspunktinformationen in die Datei * */öffentlich statische void -schriftstellige thropppointopunkt (Datei outgpsfile, arraylist <enPointSpointaToToToToToNefile), Arraylist <EnpointPointoToToTofile, (Datei -Outgpsfile, Arraylist <EnpointPpointaToToToToToToToToToToToToToToToToTFile, Arraylist <Enpleppoint> pgsppotzile (Datei) (Datei outgpsfile, arraylist; Ausnahme {Iterator <Enpoint> ifilter = pgppointfilter.iterator (); randomAccessfile rfilter = new randomAccessfile (OutgpsFile, "rw"); while (ifilter.hasnext ()) {enpoint p = ifilter.next (); sFilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();}/*** Funktion Funktion: Finden Sie den durchschnittlichen Abstandsfehler* RECHEN SIE DIE DEMAHNEN Distanz*/public static double getMeandIsror (ArrayList <enpoint> pgpsarray, pgpsarray. i = 1; i <pgpsarrayre.size (); i ++) {double = "" end = "pgpsArrayre.get (i) .id;" int = "" j = "start+1; j <end; j ++) {" messine = "sumdist/(pgpsArray.size ());" pre = "" return = "" start = "pgpsarrayre.get (i-1) .id;" sumdist=""><pre>import java.text.DecimalFormat;public class ENPoint implements Comparable<enpoint>{ public int id;//Point IDpublic double pe;//Longitude public double pn;//Dimension public ENPoint(){}//Empty constructor public String toString(){return this.id+"#"+this.pn+","+this.pe;}public String GetResultstring () {DecimalFormat df = new DecimalFormat ("0,000000"); return this.id+"#"+df.format (this.pe)+","+df.format (this.pn)+" /n";}@überschritt public into (enpoint user). this.id = ""> other.id) return 1; sonst return 0;}}Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels zum Open -Fenster -Instanzcode des Java -Programmier -Implementierungs -Trajektorienkomprimierungsalgorithmus. Ich hoffe, es wird für alle hilfreich sein. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen.