Algoritma kompresi lintasan
Deskripsi adegan
Dengan file catatan data GPS, setiap catatan berisi dua bidang koordinat, bujur dan dimensi, dan mengompres catatan sesuai dengan ambang jarak, dan membentuk trek dengan koordinat garis lintang dan bujur dari semua catatan yang difilter.
Deskripsi Algoritma
Algoritma ini memiliki berbagai macam kegunaan.
Algoritma kompresi lintasan dibagi menjadi dua kategori, yaitu kompresi lossless dan kompresi lossy. Algoritma kompresi lossless terutama termasuk pengkodean Huffman, dan algoritma kompresi lossy dibagi menjadi metode pemrosesan batch dan metode kompresi data online. Metode pemrosesan batch mencakup algoritma DP (Douglas-Peucker), algoritma TD-TR (rasio waktu top-down) dan algoritma Bellman. Metode kompresi data online termasuk jendela geser, jendela terbuka, metode berbasis area yang aman, dll.
Anda juga dapat merujuk pada artikel ini: " Kode terperinci algoritma Douglas-Peucker untuk pemrograman Java yang menerapkan kompresi lintasan "
Implementasi Kode
Impor java.awt.color; impor java.awt.graphics; impor java.awt.point; impor java.awt.toolkit; impor java.io.bufferedreader; impor java.ioCrile; impor java.fileinputStream; impor java.io.inputrute.inputstream; java.text.decimalformat; import java.util.arraylist; import java.util.iterator; import javax.swing.jframe; javax.swing.jpanel; pembaasan kelas * * double (string [] args) lemparan pengecualian {/{public static double (string [] args) Lemparan Pengecualian {//Definisi Public Double (String [] Args) Lempar Pengecuali Daftar Informasi Poin Posisi Dibaca dari ArrayList File <EnPoint> enplist = ArrayList baru <Spoint> (); // Buat objek file dari alamat file data sumber // Di sinilah Anda perlu mengubah alamat penyimpanan file sumber Anda. Ingat jika alamat tersebut berisi "/", ingatlah untuk menambahkan "/", alasan "/" adalah simbol pelarian // ini dapat ditulis sebagai c: /users/administrator/desktop/11.6/2007-10-14-gps.logfile sourceFile = file baru. geteNpointFromFile (SourceFile); // Ini untuk menguji apakah Anda telah membaca data dalam daftar dan memeriksa jumlah data dalam daftar. Ingatlah untuk mengomentari System.out.println (enplist.size ());/** Metode Pemrosesan Data*: Buka metode kompresi trek jendela** //// set penyimpanan poin target ArrayList <Enpoint> RepointList = ArrayList baru <Enpoint> (); RepointList = OpenWindowtra (Enplist, MaxDistanceError); System.out.println (repointList.size ());/ * * Tulis ke file target * */file targetFile = file baru ("./ 2007-10-14-gpsResult.log"); writeTestPointToFile(targetFile,rePointList);/* * Compact rate calculation*/double cpL = (double)rePointList.size() / (double)ENPList.size() * 100;DecimalFormat df = new DecimalFormat("0.000000");System.out.println("Compression rate: "+ df.format(cpL) + "%");/* * Hitung kesalahan jarak rata -rata**/double avediserr = getMeandisterror (enplist, repointlist); System.out.println (avediserr);/** garis untuk membentuk bagan perbandingan** /// Menghasilkan Fungsi (Enllist, RepointList);}/* Ekstrak Point Points Ekstrak dari Fungsi A Function* POINT POINT* POINT POINT* POINT POINT A FUNTORDION* of all position points*/public static ArrayList<enpoint> getENPointFromFile(File fGPS)throws Exception{ArrayList<enpoint> pGPSArray = new ArrayList<enpoint>();if(fGPS.exists()&&fGPS.isFile()){InputStreamReader read = new InputStreamReader(new FileInputStream (FGPS)); // Inputal Inisialisasi Inisialisasi BufferedReader Breader = BufferedReader baru (baca); // Dibaca inisialisasi string string; string [] strgps; int i = 0; while ((str = breader.readline ())! = Null) {// baris dibaca per baris per strgps =. i; i ++; p.pe = (dftodu (strgps [3])); p.pn = (dftodu (strgps [5])); pgpsarray.add (p);} breader.close ();} koordinat koordinat* public;} function degray; Double dftodu (string str) {int indexd = str.indexof ('.'); // dapatkan. The position of the character String strM = str.substring(0,indexD-2);//Integer part String strN = str.substring(indexD-2);//Decimal part double d = double.parsedouble(strM)+double.parsedouble(strN)/60;return d;}/* * Open window method implementation* Return a compressed position list* List of data stored ID and point coordinates* * Deskripsi Algoritma: * Titik awal dan titik mengambang menghitung titik proyeksi, menilai jarak antara titik proyeksi dan titik lintasan dan nilai ambang batas. Jika jarak lebih besar dari nilai ambang*, titik awal ditempatkan di daftar target, titik mengambang mencari ke depan sebagai titik awal baru, dan titik awal baru mencari ke belakang sebagai yang kedua sebagai titik mengambang baru. Di sini ada penilaian yang adalah apakah posisi titik awal baru +1 sama dengan panjang daftar. Ini menentukan pemilihan titik mengambang* Ini ditangani ke titik akhir**/Public Static ArrayList <Enpoint> OpenWindowtra (ArrayList <Enpoint> Sourcelist, Maxdis Ganda) {ArrayList <Enpoint> Titik Target = POINT ATRAYLIST 0 INT <enpoint> ();/ 2int floatpoint = 2; // Tentukan posisi titik awal dari posisi titik trek saat ini sebagai 1int nowpoint = 1; int len = sourcelist.size (); // penyimpanan set informasi di semua windows arraylist <enpoint> listpoint = new arraylist <enpoint> (); listpoint.add (soclist.get (nowpoint); Untuk memperbarui titik trek di window boolean flag = false; // Hitung dan menilai apakah jarak antara semua titik di jendela dan titik proyeksi lebih besar dari ambang batas untuk (titik enpoint: listpoint) {double disoftwo = getDistance (sourcelist.get (startpoint), sourcelis.get (floatpoint), point); if (disoftwo> = 30) {flag = true; break;}} if (flag) {// Jarak titik di jendela lebih besar dari ambang batas // titik awal ditambahkan ke daftar target target targetlist.add (sourcelist.get (startpoint)); // titik awal perubahan startpoint = floatpoint - 1; // sourcelist.get (startpoint))); if (floatpoint> = len) {targetlist.add (sourcelist.get (floatpoint-1)); break;} // titik di jendela mengubah listpoint.clear (); // system.out.println (listpoint.size ()); listpoint.add (sourcelist.get (startpoint +1));} else {// jaraknya kurang dari ambang batas // titik awal tetap tidak berubah // koleksi jendela saat ini menambahkan titik floating poin saat ini. Threshold, abaikan titik jendela dan langsung tambahkan titik akhir ke titik target yang ditetapkan IF (floatpoint> = len) {targetList.add (sourcelist.get (startpoint)); targetlist.add (sourcelist.get (floatpoint-1); break;} bendera = false;} return targetlist;}/* Hitung jarak antara poin floating dan poin founde; false;} return targetList;}/* Hitung jarak antara poin floating dan poin founde;} return targetList;}/* Hitung jarak antara poin floating dan point false;} return targetList;}/* Hitung jarak antara poin floating dan false = false;} return targetList;}/* Hitung jarak antara poin floating dan false = fale; Titik lintasan saat ini C * Formula Area Segitiga */GetDistance ganda statis publik (Enpoint A, Enpoint B, Enpoint C) {Jarak Ganda = 0; Double A = Math.Abs (Geodist (A, B)); Double B = Math.Abs (Geodist (B, C)); Double C = Math.ABS (Geodist (A, C); Math.sqrt (p * (pa) * (pb) * (pc)); jarak = s * 2.0/a; jarak pengembalian;}/ * * Fungsi salinan arraylist * * // * Fungsi yang disediakan * fungsi yang menghitung jarak pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa, pa. Rad (pa.pn); double radlat2 = rad (pb.pn); double delta_lon = rad (pb.pe - pa.pe); top ganda_1 = math.cos (radlat2) * math.sin (delta_lon); double top_2 = math.cos (radlat1) * math.sin (delta); top ganda) (math.cos (radlat1) * math.sin 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.sin (radlat2) + math.cos (radlat1) * math.cos (radlat2) (radlat2) + math.cos (radlat1) * math.cos (radlat2) (radlat2) + math.cos (radlat1) * math.cos (radlat2) + math.cos (radlat1) * math.cos2 (radlat2) + math.cos (radlat1) * math.cos2 (radlat2) + matematika Math.atan2 (atas, bawah); jarak ganda = delta_sigma * 6378137.0; jarak pengembalian;} public static rad ganda (ganda d) {return d * math.pi/180.0;}/ * * Tulis Posisi Kompresi ke File */Public Static Void WriteTestoPoile (File Outgps) POSIE TERMINKSI, PUBLIK PUBLIC POBLOPTOPLE (PUBLIK PUBLIK MOVETOPILE ( Exception{Iterator<enpoint> iFilter = pGPSPointFilter.iterator();RandomAccessFile rFilter = new RandomAccessFile(outGPSFile,"rw");while(iFilter.hasNext()){ENPoint p = iFilter.next();String sFilter = p.getResultString();byte[] bFilter = sFilter.getBytes();rFilter.write(bFilter);}rFilter.close();}/** * Function function: Find the average distance error* Return the average distance*/public static double getMeanDistError(ArrayList<enpoint> pGPSArray,ArrayList<enpoint> 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 ++) {" berarti = "sumdist/(pgpsarray.size ());" pre = "" return = "" start = "pgpsarrayre.get (i-1) .id;" sumdist = ""> <pr Pre> impor java.text.decimalformat; Enpoint kelas publik mengimplementasikan yang sebanding dengan <spoint> {public int id; // point idpublic double pe; // longitude public double pn; // dimensi public enpoint () {} // string public constructor public toString () {return ini. getResultString () {decimalformat df = new decimalformat ("0.000000"); return this.id+"#"+df.format (this.pe)+","+df.format (this.pn)+" /n";}@override public int compareTo (enpoint {ife) " /n";}@"" "" "" "" "" "" "" " this.id = ""> Other.id) kembali 1; lain return 0;}}Meringkaskan
Di atas adalah seluruh konten artikel ini tentang kode instance jendela terbuka dari algoritma kompresi lintasan implementasi pemrograman java. Saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya.