Алгоритм сжатия траектории
Описание сцены
Учитывая файл записи данных GPS, каждая запись содержит два поля координат, долготу и измерение и сжимает записи в соответствии с порогом расстояния и образует трек с координатами широты и долготы всех фильтрованных записей.
Описание алгоритма
Этот алгоритм имеет широкий спектр применений.
Алгоритмы сжатия траектории делятся на две категории, а именно сжатие без потерь и сжатие потерь. Алгоритмы сжатия без потерь в основном включают в себя кодирование Хаффмана, а алгоритмы сжатия потерь делятся на метод пакетной обработки и метод сжатия данных в Интернете. Метод пакетной обработки включает алгоритм DP (Douglas-Pucker), алгоритм TD-TR (сверху вниз) и алгоритм Bellman. Методы сжатия данных в Интернете включают скользящие окна, открытые окна, безопасные методы, основанные на зонах и т. Д.
Вы также можете ссылаться на эту статью: « Подробный код алгоритма Дугласа-Пайкера для реализации траектории программирования Java »
Реализация кода
Импорт java.awt.color; import java.awt.graphics; import java.awt.point; импорт java.awt.toolkit; import java.io.bufferedReader; импорт java.io.file; import java.io.fileinputeReam; import.InputStreameReamer; ImportAm.io.RileInptream; import.InputStreameRearder; 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) throds excament {// doubeld definementcom doubelder information information */ * * * * * * * * * * * * * * * * * * Точки позиции считываются из файла arraylist <enpoint> enplist = new ArrayList <enpoint> (); // Создать объект файла адреса файла исходных данных // Это где вам необходимо изменить адрес хранения вашего исходного файла. Помните, если адрес содержит «/», не забудьте добавить еще один «/», причина «/»-это символ побега // Это можно записать как c: /users/administrator/desktop/11.6/2007-10-14-gps.logfile sourcefile = new файл ("./ 2007-10-14-gps.leg) getenpointfromfile (SourceFile); // Это для проверки, прочитали ли вы данные в списке и проверить количество данных в списке. Не забудьте прокомментировать System.out.println (enplist.size ());/** Обработка данных* Метод: Метод открытия окна. openwindowtra (enplist, maxdistanceerror); system.out.println (prepointlist.size ());/ * * Записать в целевой файл * */file targetfile = new File ("./ 2007-10-14-gpsresult.log"); WritetestPointTofile (TargetFile, RepointList);/ * * Расчет компактной скорости */Double CPL = (Double) RepointList.Size ()/(Double) Enplist.Size () * 100; DecimalFormat DF = new DecimalFormat ("0,000000"); System.out.println ("Компрессия:" + df.format (cpl.); Средняя ошибка расстояния**/double avediserr = getmeandisterror (enplist, RepointList); System.out.println (avediserr);/** Нарисуйте линии, чтобы сформировать диаграмму сравнения** //////////////////////////////////////greny -extrateimage (enplist, репутатор);}/******************************************** Точки позиции*/public Static ArrayList <Enpoint> getEnpointFromFile (файл fgps) Throws Exception {arraylist <enpoint> pgpsArray = new ArrayList <enpoint> (); if (fgps.exists () && fgps.isfile ()) {inputstream Readered streampare newstreameRered (new fileInptream (fG/fgsStream; BufferedReader HATER = New BufferedReader (Read); // Строка инициализации CACHED Read Strt; string [] strgps; int i = 0; while ((str = beader.readline ())! = Null) {// линия считывается на строку strgps = str.split (""); enpoint p = new enpoint (); p.id = i; (dftodu (strgps [3])); p.pn = (dftodu (strgps [5])); pgpsarray.add (p);} beader.close ();} возвращать pgpsarray;}/*** str) {int indexd = str.indexof ('.'); // get. Положение символа строки strm = str.substring (0, indexd-2); // integer part string strn = str.substring (indexd-2); // десятичная часть double d = double.parsedouble (strm)+double.parsedouble (strn)/60; return d;}/* Реализуя Открыть. Описание алгоритма: * Начальная точка и плавающая точка рассчитывают точку проекции, судите расстояние между точкой проекции и точкой траектории и пороговым значением. Если расстояние больше, чем пороговое значение*, начальная точка помещается в лист цели, то плавающая точка ищет вперед как новая начальная точка, а новая начальная точка ищет обратно как второе, как новая плавающая точка. Здесь есть суждение, которое заключается в том, равна ли новая начальная позиция точки +1 длину списка. Это определяет выбор плавающей запятой* Это обрабатывается к конечной точке**/public Static ArrayList <Enpoint> OpenWindowtra (ArrayList <Enpoint> Sourcelist, Double MaxDIS) {ArrayList <Enpoint> TargetList = New ArrayList <Enpoint> (); // определять начальную позицию исходной точки исходной точки int startp = 0; 0; // определять начальную позицию исходной точки исходной точки. Положение 2int floatpoint = 2; // Определите начальную позицию точки текущей позиции точки трека как 1int whypoint = 1; int len = syrcelist.size (); // Хранение информации о точках во всех Windows arraylist <enpoint> listpoint = new Arraylist <Enpoint> (); В то время как (true) {// флаг используется для управления, обновлять ли точку трека в булевом флаге с окном = false; // Рассчитать и судить о том, является ли расстояние между всеми точками в окне и точкой проекции больше, чем порог для (точка Enpoint: Listpoint) {Double DiSoftwo = getDistance (syrcelist.get (startpoint), sourcelist.get (плавает), пункт), пункт); if (disoftwo> = 30) {flag = true; break;}} if (flag) {// Расстояния точек в окне больше, чем пороговое значение // Начальная точка добавляется в целевой список цели. if (floatpoint> = len) {targetlist.add (sourcelist.get (floatpoint-1)); break;} // Точка в изменении окна listpoint.clear (); // system.out.println (listpoint.size ()); ListPoint.Add (sourcelist.get (startpoint +1));} else {// Расстояние меньше, чем пороговое значение // Начальная точка остается неизменной // Текущая коллекция окна добавляет току с плавающей точкой. чем порог, игнорируйте точку оконного окна и непосредственно добавьте конечную точку к набору целевой точки if (floatpoint> = len) {targetlist.add (syrcelist.get (startpoint)); targetlist.add (sourcelist.get (floatpoint-1); Break;} flag = false;} atervice-stipe; B, и текущая точка треугольной точки C * Формула треугольной области */public static doubledistance (enpoint a, enpoint b, enpoint c) {двойное расстояние = 0; двойное a = math.abs (геодист (a, b)); двойной b = математика. c) /2.0; double s = math.sqrt (p * (pa) * (pb) * (pc)); distance = s * 2.0/a; return Distance;}/ * * Функция копирования списка ArrayList * // * Функции, предоставленные функцией, которая рассчитывает расстояние. pb) {double radlat1 = 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 (delta_lon); double top_2 = math.cos (radlat1) Math.sin (Radlat1) * math.cos (Radlat2) * math.cos (delta_lon); двойной верх = мат. Math.cos (delta_lon); double delta_sigma = math.atan2 (вверху, внизу); двойное расстояние = delta_sigma * 6378137.0; return Distance;} public static double Rad (Double d) {return d * math.pi/180.0;}/ * Написать сжато OutGpsFile, ArrayList <Enpoint> pgpSpointFilter) Throws Exception {iterator <enpoint> ifilter = pgpspointfilter.iterator (); randomaccessfile rfilter = new randomaccessfile (outgpsfile, «rw»); sfilter = p.getresultstring (); byte [] bfilter = sfilter.getbytes (); rfilter.write (bfilter);} rfilter.close ();}/** Функция: Найдите среднее расстояние. pgpsarrayre) {double sumdist = 0,0; for (int i = 1; i <pgpsarrayre.size (); i ++) {double = "" end = "pgpsarrayre.get (i) .id;" int = "" j = "start+1; j <end; j ++) {" edge = "sumdist/(pgpsarray.size ());" pre = "" return = "" start = "pgpsarrayre.get (i-1) .id;" sumdist = ""> <pre> import java.text.decimalformat; открытый класс Enpoint реализует сопоставимые <enpoint> {public int id; // point idpublic double pe; // longity public double pn; // dimension public enpoint () {} // Пусто 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"; {if (this.id <ore.id) else = "" return = "" this.id = ""> ore.id) return 1; еще вернуть 0;}}Суммировать
Приведенное выше содержимое этой статьи о коде экземпляра открытого оконного экземпляра Java программирования алгоритма сжатия траектории траектории. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это.