Algoritmo de compresión
Descripción de la escena
Dado un archivo de registro de datos GPS, cada registro contiene dos campos de coordenadas, longitud y dimensión, y comprime los registros de acuerdo con el umbral de distancia, y forma una pista con las coordenadas de latitud y longitud de todos los registros filtrados.
Descripción del algoritmo
Este algoritmo tiene una amplia gama de usos.
Los algoritmos de compresión de trayectoria se dividen en dos categorías, a saber, compresión sin pérdidas y compresión con pérdida. Los algoritmos de compresión sin pérdidas incluyen principalmente la codificación de Huffman, y los algoritmos de compresión con pérdida se dividen en el método de procesamiento por lotes y el método de compresión de datos en línea. El método de procesamiento por lotes incluye algoritmo DP (Douglas-Peucker), algoritmo TD-TR (relación de tiempo de arriba hacia abajo) y algoritmo de Bellman. Los métodos de compresión de datos en línea incluyen ventanas deslizantes, ventanas abiertas, métodos seguros basados en área, etc.
También puede consultar este artículo: " Código detallado del algoritmo Douglas-Peucker para la programación Java implementando la compresión de trayectoria "
Implementación del código
import java.awt.color; import java.awt.graphics; import java.awt.point; import java.awt.toolkit; import java.io.bufferedReader; import java.io.file; import java.io.fileinputstream; import java.io.insin java.text.DecimalFormat; import java.util.arrayList; import java.util.iterator; import javax.swing.jframe; import javax.swing.jpanel; public class trayectoryCom {public static void main (string [] args) Exception {// Threshold Double MaxDistanceerRorerRorror = 30; Lista de información de los puntos de posición Lee del archivo ArrayList <NEPOINT> Enplist = new ArrayList <Enpoint> (); // Cree el objeto de archivo de la dirección del archivo de datos de origen // Aquí es donde debe cambiar la dirección de almacenamiento de su archivo fuente. Recuerde si la dirección contiene "/", recuerde agregar otro "/", la razón "/" es un símbolo de escape // esto se puede escribir como c: /users/administrator/desktop/11.6/2007-10-14-gps.logFile SourceFile = nuevo archivo ("./ 2007-10-14-gps.log"); // calculando la función de lectura de archivo para leer archivos de lectura. GetenPointFromFile (SourceFile); // Esto es para probar si ha leído los datos en la lista y verifique el número de datos en la lista. Recuerde comentar System.out.println (enplist.size ());/** Procesamiento de datos* Método: Open Window Track Compression Method** //// Conjunto de puntos de arte de almacenamiento ArrayList <NEPOINT> REPOINTLIST = New ArrayList <NEPOINT> (); REPOINTLIST = OpenWindowtra (Enplist, MaxDistanceError); System.out.println (RepointList.Size ());/ * * Escribir en el archivo de destino * */archivo TargetFile = new File ("./ 2007-10-14-gpsresult.log"); WriteTestPointToFile (TargetFile, RepointList);/ * * Cálculo de velocidad compacta */doble cpl = (double) RepointList.size ()/(double) enplist.size () * 100; decimalFormat df = new DecimalFormat ("0.00000000"); System.Println ("tasa de compresión:" + df.Format (CLEFORT (CLECT (CLEMAT) Calcule el error de distancia promedio**/double avediserr = getMeandisterRor (Enplist, RepointList); System.out.println (avediserr);/** Dibuje líneas para formar una comparación de comparación** /// GenerateImage (Enplist, REPOINTLIST Colección de todos los puntos de posición*/public static ArrayList <NEPOINT> getenPointFromFile (file fgps) lanza la excepción {ArrayList <NOPOINT> PGPSArray = new ArrayList <NEnPoint> (); if (fgps.Exists () && fgps.Isfile ()) {InputStreamReader Read = new InputStreamreader (new FileInputPutream (NEWNPUTS (NEWNPUTS (NEWNPUTS (NEWNPUSTA (NEWNPUSTA (NEWNPUTHEAM); BufferedReader Breader = new BufferedReader (read); // Cacheed Read Initialization String Str; String [] strgps; int i = 0; while ((str = Breader.Readline ())! = NULL) {// Una línea se lee por línea StrGPS = str.split (""); Enpoint p = new Enpoint (); P.ID = I; I ++; P.PE (dftodu (strgps [3]))); p.pn = (dftodu (strgps [5])); pgpsArray.add (p);} breader.close ();} return pGpSArray;}/** Función de función: Convertir el latitud original y la longitud de la longitud en los datos de la cima de la cadena y la larga. str) {int indexd = str.indexof ('.'); // get. La posición de la cadena de caracteres strm = str.substring (0, indexd-2); // string de parte entero strn = str.substring (indexd-2); // decimal piet d = double.parsedouble (strm)+double.parsedubouble (strn)/60; return d;}/** Open Ventraw Method Implementation* Devuelve una lista de posición Comprimida* Lista de datos de datos Estado de datos STATURADA y Punto de punto********* APAR Descripción del algoritmo: * Punto inicial y punto flotante Calculan el punto de proyección, juzga la distancia entre el punto de proyección y el punto de trayectoria y el valor umbral. Si la distancia es mayor que el valor umbral*, el punto inicial se coloca en la lista de destino, el punto flotante busca hacia adelante como el nuevo punto inicial, y el nuevo punto inicial busca hacia atrás como el segundo como el nuevo punto flotante. Aquí hay un juicio que es si la nueva posición de punto inicial +1 es igual a la longitud de la lista. Esto determina la selección del punto flotante* Esto se maneja al punto final**/public static ArrayList <NOPOINT> OpenWindowTra (ArrayList <NEPOINT> SOURCELIST, doble maxDIS) {ArrayList <NoPoint> TargetList = New ArrayList <NOPoPoint> (); // Define el punto inicial de la posición inicial del punto inicial = 0; Posición de punto flotante 2int Floatpoint = 2; // Defina la posición del punto inicial de la posición del punto de seguimiento actual como 1int Nowpoint = 1; int Len = Sourcelist.size (); // Almacenamiento El conjunto de información del conjunto de puntos en todos los puntos de Windows ArrayList <Ender> ListPoint = New ArrayList <NEnpoint> (); mientras (verdadero) {// Flag se utiliza para controlar si se debe actualizar el punto de pista en la ventana Boolean Flag = False; // Calcule y juzga si la distancia entre todos los puntos en la ventana y el punto de proyección es mayor que el umbral para (enppoint Point: Listpoint) {Double Disoftwo = getDistance (Sourcelist.get (punto de partida), Sourcelist.get (FloatPoint), punto); if (disoftwo> = 30) {flag = true; break;}} if (flag) {// Las distancias de los puntos en la ventana son mayores que el umbral // el punto inicial se agrega al Target List TargetList.add (Sourcelist.get (StartPoint)); // El punto de inicio de cambio de punto inicial = FloatPoint - 1; // El cambio de punto de flotación Floatpoint += 1; if (floatpoint> = len) {TargetList.Add (Sourcelist.get (FloatPoint-1)); break;} // El punto en la ventana cambia listpoint.clear (); // system.out.println (listpoint.size ()); listPoint.add(sourceList.get(startPoint+1));} else{//The distance is less than the threshold//The initial point remains unchanged//The current window collection adds the current floating point listPoint.add(sourceList.get(floatPoint));//The floating point moves one by one floatPoint += 1;//If the floating point is the end point and the distance of the current window point is less que el umbral, ignore el punto de la ventana y agregue directamente el punto final al conjunto del punto de destino si (floatpoint> = len) {TargetList.Add (SourCelist.get (StartPoint)); TargetList.Add (SourCelist.get (FloatPoint-1); Break;}} flager = false;} returnlist;}/* calcula la distancia entre el punto de la pista y el punto de seguimiento* el punto de la pista es el punto inicial, el punto inicial, el punto de retorno; punto flotante B, y el punto de pista actual C * Fórmula del área triangular */Public estática doble getDistance (Enpoint A, Enpoint B, Enpoint c) {doble distancia = 0; doble a = Math.abs (geodist (a, b)); doble b = Math.abs (geodist (b, c)); doble c = math.abs (geodist (a, c); c) /2.0 ;Double S = Math.Sqrt (p * (pa) * (pb) * (pc)); distancia = s * 2.0/a; return Distance;}/ * * Función de copia de ArrayList * * // * funciones proporcionadas * La función que calcula la distancia para obtener el siguiente método de cálculo de la distancia * No he estudiado cómo calcular la distancia * */Público Public Statt PA pb) {double radlat1 = rad (pa.pn); double radlat2 = rad (pb.pn); doble 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); doble fondo = math.sin (radlat1) * math.sin (radlat2) + math.cos (radlat1) * math.cos (radlat2) * Math.cos (delta_lon); doble delta_sigma = math.atan2 (top, fondo); doble distancia = delta_sigma * 6378137.0; return Distance;} public static double rad (doble d) {return d * Math.pi/180.0.0;}/ * * Escribir el punto de posición de posición compresada a la información de la posición de archivo */público voides. OUTGPSFILE, ArrayList <FoPoint> PGPSPointFilter) lanza la excepción {iterator <NEPOINT> ifilter = PGPSPointFilter.Iterator (); RandomAccessFile rfilter = new RandomAssFile (OutgpsFile, "RW"); while (ifilter.hasnext ()) {ENPOINT P = ifilter.NEXT (););); p.getResultString (); byte [] bfilter = sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();}/** function function: encuentre el error de distancia promedio* retrocede la distancia promedio*/public static double getmeandisterror (arraylist <enpoutppoins> pgpsarray, arraylist, arraylist. pGpSarrayre) {double sumdist = 0.0; para (int i = 1; i <pgpsarrayre.size (); i ++) {double = "" end = "pgpsarrayre.get (i) .id;" int = "" j = "inicio+1; j <end; j ++) {" medias = "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.00000000"); return this.id+"#"+df.format (this.pe)+","+df.format (this.pn)+" /n";}@anular public int comparando (enoint otro) {if (this.id <otro.id) this.id = ""> otro.id) return 1; else return 0;}}Resumir
Lo anterior es todo el contenido de este artículo sobre el código de instancia de ventana Open de Java Programming Implementación Algoritmo de compresión de trayectoria. Espero que sea útil para todos. Si hay alguna deficiencia, deje un mensaje para señalarlo.