Algoritmo de compressão de trajetória
Descrição da cena
Dado um arquivo de registro de dados GPS, cada registro contém dois campos de coordenadas, longitude e dimensão e comprime os registros de acordo com o limite de distância e forma uma faixa com as coordenadas de latitude e longitude de todos os registros filtrados.
Descrição do algoritmo
Este algoritmo tem uma ampla gama de usos.
Os algoritmos de compressão de trajetória são divididos em duas categorias, a saber, compressão sem perdas e compressão com perdas. Os algoritmos de compressão sem perdas incluem principalmente a codificação de Huffman, e os algoritmos de compressão com perdas são divididos no método de processamento de lote e no método de compactação de dados on -line. O método de processamento em lote inclui o algoritmo DP (Douglas-Peucker), o algoritmo TD-TR (de cima para baixo e tempo) e o algoritmo Bellman. Os métodos de compactação de dados on-line incluem janelas deslizantes, janelas abertas, métodos de área segura, etc.
Você também pode se referir a este artigo: " Código detalhado do algoritmo Douglas-Peucker para a programação Java Implementando compressão de trajetória "
Implementação de código
importar java.awt.color; importar java.awt.Graphics; importar java.awt.point; importar java.awt.toolkit; importar java.io.bufferErader; import java.io.file; import java.io.fileInputStram; java.text.decimalformat; importar java.util.ArrayList; importar java.util.iterator; importar javax.swing.jframe; importar javax.swing.jpanel; public class * storgeStyCom {public static void main (string [] args) excepcione; Lista de informações dos pontos de posição lida no arquivo ArrayList <NePoint> Enplist = new ArrayList <NePoint> (); // Crie o objeto de arquivo do endereço do arquivo de dados de origem // É onde você precisa alterar o endereço de armazenamento do seu arquivo de origem. Lembre-se de que o endereço contém "/", lembre-se de adicionar outro "/", o motivo "/" é um símbolo de fuga // pode ser escrito como c: /users/administrator/desktop/11.6/2007-10-14-gps.logfile fontefile = novo arquivo ("./ 2007-10-14-gps.og"); getenpointFromFile (Sourcefile); // Isso é testar se você leu os dados na lista e verifique o número de dados na lista. Lembre -se de comentar o System.out.println (enplist.size ());/** Processamento de dados* Método: Abra o método de compressão de rastreamento da janela** //// conjunto de pontos de armazenamento de pontos de destino ArrayList <Noint> RepointList = new ArrayList <Noint> (); RepointList = OpenWindowtra (Enplista, MaxDistanceError); System.out.println (REPONTLIST.SIZE ());/ * * * Escreva no arquivo de destino * */File FargetFile = new File ("./ 2007-10-14-gpsresult.log"); writeteTestpointTofile (FergetFile, RepointList);/ * * Cálculo da taxa compacta */CPL duplo = (duplo) RepointList.size ()/(Double) Enplist.size () * 100; DecimalFormat df = new Decimalformat ("0,000000"); Calculate the average distance error* */double aveDisErr = getMeanDistError(ENPList,rePointList);System.out.println(aveDisErr);/* * Draw lines to form a comparison chart* *///generateImage(ENPList,rePointList);}/* * Extract position points from the provided file information* and call the conversion function to store the coordinate value of each point in the list* The function returns Uma coleção de todos os pontos de posição*/public static ArrayList <Neporpo> getenPointFromFile (FIGH FGPS) lança exceção {ArrayList <NoPoint> pgpSarray = new ArrayList <Noint> (); if (fgps.exists () & fgps.isfile ()) {inputreadReReReReReRaDER = Infuter = in Newster = in Newster = Infputer = NewsTer = in Newster = in NewSTer = in Newster = Infputer = NewsTer = in Newster = in NewSter = in Newster = in NewSter = in Newster = in NewSter = in Newster = Infputer = New Infuter = New FgPs.ishile () {inputreadReream FileInputStream (FGPS)); // Fluxo de entrada Buffers BlueRer BlueRer = new BufferredReader (leitura); // Leia em cache String de inicialização str; String [] strgps; int i = 0; while (str = str.split ()! i; i ++; p.pe = (dftodu (strgps [3])); p.pn = (dftodu (strgps [5])); estático duplo dftodu (string str) {int indexd = str.indexOf ('.'); // get. A posição da string de caractere strm = str.substring (0, indexd-2); // parte inteira string strn = str.substring (indexd-2); // parte decimal dupla d = duplo.parsedouble (sTRM)+Double. Descrição do algoritmo: * Ponto inicial e ponto flutuante Calcule o ponto de projeção, julgue a distância entre o ponto de projeção e o ponto de trajetória e o valor limite. Se a distância for maior que o valor limite*, o ponto inicial será colocado na lista de destino, o ponto flutuante pesquisa como o novo ponto inicial e o novo ponto inicial procura para trás como o segundo como o novo ponto flutuante. Aqui há um julgamento que é se a nova posição inicial do ponto +1 é igual ao comprimento da lista. This determines the selection of the floating point* This is handled to the end point* */public static ArrayList<enpoint> openWindowTra(ArrayList<enpoint> sourceList,double maxDis){ArrayList<enpoint> targetList = new ArrayList<enpoint>();//Define the initial point position of the initial point as 0 int startPoint = 0;//Define the initial point position of the floating point Posição 2INT FloatPoint = 2; // Defina a posição inicial do ponto da posição atual da trilha como 1INT nowpoint = 1; int len = Sourcelist.size (); // Armazene o conjunto de informações de pontos em todos os Windows ArrayList <stElcelP) enquanto o sin (sina) o), que o sin), que o snin), o sin). Controle se deve atualizar o ponto de pista na janela bandeira booleana = false; // calcular e julgar se a distância entre todos os pontos da janela e o ponto de projeção é maior que o limite para (ponto de manual: ListPoint) {Double DISOFTWO = getDistance (Sourcelist.get (startpoint), Sourcelist.get (floatpoint), ponto); if (distâncias if (DioftWo> = 30) {flag = true; break;}} if (flag) {// As distâncias dos pontos na janela são maiores que o limiar // o ponto inicial é adicionado ao alvo de meta -alvoList.add (sourcelist.get.get (startpoint); // o ponto inicial startpoint = floatpoint - 1; //; if (floatpoint> = len) {TargetList.add (Sourcelist.get (floatpoint-1)); quebrar;} // O ponto na janela muda de listint.clear (); // System.out.println (listPoint.size ()); listpoint.add (azedelcist.get (startpoint +1));} else {// a distância é menor que o limiar // o ponto inicial permanece inalterado // a coleta de janelas atual adiciona o ponto flutuante e o ponto flutuante. limiar, ignore o ponto da janela e adicione diretamente o ponto final ao conjunto de pontos de destino se (floatPoint> = len) {TargetList.add (Sourcelist.get.get (startpoint)); TargetList.add (SOTRECLIST.GETELTON (* MONTOTILTION); o Ponto de Floats-1); Break;}} sinalizador = False; B e a fórmula de área triangular atual C * Fórmula dupla estática pública (ponto A, ponto B, ponto de ENPOINT C) {DULHE DISTURS = 0; Double a = Math.abs (geodista (a, b)); B) B = Math.abs (geodist (B, C)); duplo duplo C = Math.Abs (geodist; = Math.sqrt (p * (pa) * (pb) * (pc)); distância = s * 2.0/a; distância de retorno;}/ * * função de cópia ArrayList * * // * funções fornecidas * a função que calcula a distância da distância */Publicada para obter o seguinte método de cálculo de distância * não estudou como o ponto de calcular a distância */publicl */Public STATT para obter o seguinte método de cálculo de distância * não estudou como o ponto de calcular a distância */public */Public. Rad (pa.pn); duplo radlat2 = rad (pb.pn); duplo delta_lon = rad (pb.pe - pa.pe); duplo top_1 = math.cos (radlat2) * math.sin (delta_lon); duplo top_2 = math.cos (radlat1) * math.sin (radlat2); Radlat2); Math.cos (radlat2) * math.cos (delta_lon); top duplo = math.sqrt (top_1 * top_1 + top_2 * top_2); inferior duplo = math.sin (radlat1) * math.sin (radlat2) + math.cos (radlat1) * math.cos (radlat2) *. Math.atan2 (superior, inferior); distância dupla = delta_sigma * 6378137.0; distância de retorno;} public static duplo rad (duplo d) {return d * math.pi/180.0;}/ * * escreva informações de ponto de posição para o arquivo */public static anul writeSTPoTTOFILE (FILHATPSFILE Exceção {iterator <NoPoint> ifilter = pgpSpointFilter.iterator (); RandomAccessFile rfilter = new RandomAccessFile (outgpsFile, "rw"); while (ifilter.hasnext ()) {Enpoint p = ifilter.next (); sfilter = sfilter =) {Enpoint P = ifilter.next (); sfilTer = P.Resstr =) {Enpoint P = ifilter.next (); sfilter = P.Resstr =). sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();}/*** Função da função: encontre o erro médio de distância* retornar a distância média*/public static duplo getMeArDististerRor (ArrayList <NePoint> PGPSarray, ArrayList <Noint> PPS (PGATRORRORROR (Arraylist <stint> i = 1; i <pgpSarrayre.size (); i ++) {Double = "" end = "pgpSarrayre.get (i) .id;" int = "" j = "start+1; j <end; j ++) {" significa = "sumdist/(pgpsarray.size ());" pre = "" return = "" start = "pgpSarrayre.get (i-1) .id;" sumdist = ""> <pre> importar java.text.decimalformat; public class ENPOint implementa comparável <Noint> {public int id; // Point iDpublic duplo pE; // longitude public duplo pn; // dimension public Enpoint () {} // Emptor Public String tostring () {Return this.Ir.Ir.InId () {} // Emptor Constructor " getResultString () {decimalformat df = new DecimalFormat ("0,000000"); retorne este.id+"#"+df.format (this.pe)+","+df.format (this.pn)+" /n";}@substituição pública int) (estert) (this.pn)+. this.id = ""> outros.id) retornar 1; caso contrário, retornar 0;}}Resumir
O exposto acima está o conteúdo inteiro deste artigo sobre o código de instância da janela aberta do algoritmo de compactação de trajetória de implementação de programação Java. Espero que seja útil para todos. Se houver alguma falha, deixe uma mensagem para apontá -la.