อัลกอริทึมการบีบอัดวิถี
คำอธิบายฉาก
เมื่อได้รับไฟล์บันทึกข้อมูล GPS แต่ละระเบียนมีสองเขตการประสานงานลองจิจูดและมิติและบีบอัดบันทึกตามเกณฑ์ระยะทางและสร้างแทร็กด้วยพิกัดละติจูดและลองจิจูดของระเบียนที่กรองทั้งหมด
คำอธิบายอัลกอริทึม
อัลกอริทึมนี้มีการใช้งานที่หลากหลาย
อัลกอริธึมการบีบอัดวิถีแบ่งออกเป็นสองประเภทคือการบีบอัดที่ไม่สูญเสียและการบีบอัดที่สูญเสีย อัลกอริทึมการบีบอัดแบบไม่สูญเสียส่วนใหญ่รวมถึงการเข้ารหัส Huffman และอัลกอริทึมการบีบอัดที่สูญเสียจะแบ่งออกเป็นวิธีการประมวลผลแบบแบตช์และวิธีการบีบอัดข้อมูลออนไลน์ วิธีการประมวลผลแบบแบทช์ประกอบด้วยอัลกอริทึม DP (Douglas-Peucker), อัลกอริทึม TD-TR (อัตราส่วนเวลาจากบนลงล่าง) และอัลกอริทึม Bellman วิธีการบีบอัดข้อมูลออนไลน์รวมถึงหน้าต่างเลื่อน, เปิดหน้าต่าง, วิธีการที่ใช้พื้นที่ปลอดภัย ฯลฯ
นอกจากนี้คุณยังสามารถอ้างถึงบทความนี้: " รหัสรายละเอียดของอัลกอริทึม Douglas-Peucker สำหรับการเขียนโปรแกรม Java ใช้การบีบอัดวิถีการบีบอัด "
การใช้รหัส
นำเข้า java.awt.color; นำเข้า java.awt.graphics; นำเข้า java.awt.point; นำเข้า java.awt.toolkit; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า Java.io.fileinputstream; java.text.decimalformat; นำเข้า java.util.arraylist; นำเข้า java.util.iterator; นำเข้า javax.swing.jframe; นำเข้า Javax.swing.jpanel; trajectorycom ระดับสาธารณะ รายการจุดตำแหน่งที่อ่านจากไฟล์ arrayList <enpoint> enplist = new ArrayList <enpoint> (); // สร้างวัตถุไฟล์ของที่อยู่ของไฟล์ข้อมูลต้นฉบับ // นี่คือที่ที่คุณต้องการเปลี่ยนที่อยู่ที่เก็บข้อมูลของไฟล์แหล่งที่มาของคุณ โปรดจำไว้ว่าที่อยู่มี "/" อย่าลืมเพิ่มอีก "/" เหตุผล "/" เป็นสัญลักษณ์การหลบหนี // สิ่งนี้สามารถเขียนได้เป็น c: /users/administrator/desktop/11.6/2007-10-14-gps.logfile SourceFile = ไฟล์ใหม่ getEnpointFromFile (SourceFile); // นี่คือการทดสอบว่าคุณได้อ่านข้อมูลในรายการและตรวจสอบจำนวนข้อมูลในรายการหรือไม่ อย่าลืมแสดงความคิดเห็น System.out.println (enplist.size ());/** การประมวลผลข้อมูล* วิธีการ: เปิดหน้าต่างวิธีการบีบอัดแทร็ก*** //// ชุดของการจัดเก็บจุดเป้าหมาย arraylist <enpoint> repointList = new ArrayList <enpoint> (); repointList = repointList = OpenWindowtra (enplist, maxdistanceError); system.out.println (repointlist.size ());/ * * เขียนไปยังไฟล์เป้าหมาย * */ไฟล์ targetFile = ไฟล์ใหม่ ("./ 2007-10-14-gpsresult.log"); writetestPointTofile (TargetFile, repointList);/ * * การคำนวณอัตราขนาดกะทัดรัด */double cpl = (double) repointlist.size ()/(double) enplist.size () * 100; decimalformat df = decimalformat ใหม่ ("0.000000"); คำนวณข้อผิดพลาดระยะทางเฉลี่ย**/double avediserr = getMeandisterror (enplist, repointlist); system.out.println (avediserr);/** วาดเส้นเพื่อสร้างแผนภูมิเปรียบเทียบ* /// generateimage (enplist, repointlist); คอลเลกชันของคะแนนตำแหน่งทั้งหมด*/arrayList แบบคงที่ <Enpoint> getEnpointFromFile (ไฟล์ fgps) พ่นข้อยกเว้น {arraylist <enpoint> pgpsarray = new ArrayList <enpoint> () ถ้า (fgps.exists (new -reads) && fgps.isfile () การเริ่มต้น bufferedReader breader = new bufferedReader (อ่าน); // แคชอ่านเริ่มต้นสตริง str; string [] strgps; int i = 0; ในขณะที่ ((str = breader.readline ())! (dftodu (strgps [3])); p.pn = (dftodu (strgps [5])); pgpsarray.add (p);} breader.close ();} ส่งคืน pgpsarray;}/** ฟังก์ชันฟังก์ชั่น str) {int indexd = str.indexof ('.'); // get ตำแหน่งของสตริงอักขระ strm = str.substring (0, indexd-2); // จำนวนเต็มสตริงชิ้นส่วน strn = str.substring (indexd-2); // ส่วนทศนิยม double d = double.parsedouble (strm)+double.parsedouble (strn)/60; อัลกอริทึมคำอธิบาย: * จุดเริ่มต้นและจุดลอยตัวคำนวณจุดฉาย, ตัดสินระยะห่างระหว่างจุดฉายและจุดวิถีและค่าเกณฑ์ หากระยะทางมากกว่าค่าเกณฑ์*จุดเริ่มต้นจะถูกวางไว้ในรายการเป้าหมายจุดลอยตัวจะค้นหาไปข้างหน้าเป็นจุดเริ่มต้นใหม่และจุดเริ่มต้นใหม่จะค้นหาย้อนกลับเป็นจุดที่สองเป็นจุดลอยตัวใหม่ ที่นี่มีการตัดสินว่าตำแหน่งจุดเริ่มต้นใหม่ +1 เท่ากับความยาวของรายการหรือไม่ สิ่งนี้จะกำหนดการเลือกจุดลอยตัว* นี่คือการจัดการไปยังจุดสิ้นสุด**/อาร์เรย์สแตติกสาธารณะ <Point> OpenWindowTra (ArrayList <Enpoint> sourcelist, double maxdis) {arraylist <enpoint> targetList = new ArrayList <enpoint> (จุดเริ่มต้นจุดเริ่มต้นของจุดเริ่มต้น ตำแหน่ง 2int floatpoint = 2; // กำหนดตำแหน่งจุดเริ่มต้นของตำแหน่งจุดแทร็กปัจจุบันเป็น 1int nowpoint = 1; int len = sourcelist.size (); // การจัดเก็บชุดข้อมูลของจุดในทุก windows arraylist <enpoint> listpoint = arrayList <enpoint> () ควบคุมว่าจะอัปเดตจุดติดตามในธงบูลีนหน้าต่าง = false; // คำนวณและตัดสินว่าระยะห่างระหว่างจุดทั้งหมดในหน้าต่างและจุดฉายมากกว่าเกณฑ์สำหรับ (จุด Enpoint: listpoint) {double disoftwo = getdistance if (disoftwo> = 30) {flag = true; break;}} ถ้า (ธง) {// ระยะทางของจุดในหน้าต่างมากกว่าเกณฑ์ // จุดเริ่มต้นจะถูกเพิ่มลงในรายการเป้าหมาย targetList.add if (floatpoint> = len) {targetList.add (sourcelist.get (floatpoint-1)); break;} // จุดในหน้าต่างเปลี่ยน listpoint.clear (); // system.out.println (listpoint.size ()); listpoint.add (sourcelist.get (startpoint +1));} else {// ระยะทางน้อยกว่าขีด จำกัด // จุดเริ่มต้นยังคงไม่เปลี่ยนแปลง // การรวบรวมหน้าต่างปัจจุบันเพิ่มจุดลอยตัวในปัจจุบัน Threshold, ละเว้นจุดหน้าต่างและเพิ่มจุดสิ้นสุดโดยตรงไปยังชุดจุดเป้าหมายถ้า (floatpoint> = len) {targetList.add (sourcelist.get.get (จุดเริ่มต้น)); targetList.add (sourcelist.get (floatpoint-1)) จุดเริ่มต้น B และจุดติดตามปัจจุบัน C * สูตรพื้นที่สามเหลี่ยม */GetDistance คู่คงที่ (enpoint A, enpoint B, enpoint c) {double distance = 0; double a = math.abs (Geodist (a, b)); double b = math.abs (geodist (b, c); double c = math.abs s = math.sqrt (p * (pa) * (pb) * (pc)); ระยะทาง = s * 2.0/a; ระยะทางกลับ;}/ * * ฟังก์ชั่นสำเนา arraylist * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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.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.atan2 (ด้านบน, ด้านล่าง); ระยะทางสองเท่า = delta_sigma * 6378137.0; ระยะทางกลับ;} สาธารณะคงที่ double rad (double d) {return d * math.pi/180.0;}/ * * เขียนตำแหน่งจุดต่อไป ข้อยกเว้น {iterator <enpoint> ifilter = pgpspointfilter.iterator (); randomaccessfile rfilter = new RandomaccessFile (outgpsfile, "rw"); ในขณะที่ (ifilter.hasnext ()) {enpoint p = ifilter.next sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();}/*** ฟังก์ชั่นฟังก์ชั่น: ค้นหาข้อผิดพลาดระยะทางเฉลี่ย* ส่งคืนระยะทางเฉลี่ย*/public double getmeandisterror (arraylist <enpoint> pgpsarray i = 1; i <pgpsarrayre.size (); i ++) {double = "" end = "pgpsarrayre.get (i) .id;" int = "" j = "start+1; j <end; j ++) {" หมายถึง = "sumdist/(pgpsarray.size ());" pre = "" return = "" start = "pgpsarrayre.get (i-1) .id;" sumdist = ""> <pre> นำเข้า java.text.decimalformat; คลาสสาธารณะ enpoint ใช้การเปรียบเทียบ <enpoint> {public int id; // point idpublic double pe; // longitude public double pn; // mimension public enpoint () {} // structor structor สาธารณะ getResultString () {decimalformat df = ใหม่ decimalformat ("0.000000"); return.id+"#"+df.format (this.pe)+","+df.format (this.pn)+" /n"; this.id = ""> other.id) ส่งคืน 1; return return 0;}}สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับรหัสอินสแตนซ์ของหน้าต่างเปิดของอัลกอริทึมการบีบอัดวิถีการเขียนโปรแกรม Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น