ส่วนหนึ่งคำอธิบายปัญหาปัญหา
1.1 งานเฉพาะ
งานนี้คือการบีบอัดวิถี เมื่อได้รับไฟล์บันทึกข้อมูล GPS แต่ละระเบียนมีสองเขตข้อมูลพิกัดลองจิจูดและมิติ บันทึกทั้งหมดมีพิกัดละติจูดและลองจิจูดเพื่อสร้างวิถี จำเป็นต้องใช้อัลกอริทึมการบีบอัดที่เหมาะสมเพื่อให้ข้อผิดพลาดระยะทางของวิถีการบีบอัดนั้นน้อยกว่า 30 เมตร
1.2 อินพุตโปรแกรม
อินพุตของโปรแกรมนี้คือไฟล์บันทึกข้อมูล GPS
1.3 เอาต์พุตข้อมูล
แบบฟอร์มเอาต์พุตเป็นไฟล์รวมถึงสามส่วนลำดับ ID และพิกัดของจุดบีบอัดจำนวนคะแนนข้อผิดพลาดระยะทางเฉลี่ยและอัตราการบีบอัด
คำตอบของส่วนที่สอง
ตามคำอธิบายปัญหาเราแก้ปัญหาและการแก้ปัญหาแบ่งออกเป็นขั้นตอนต่อไปนี้:
2.1 การประมวลผลข้อมูลล่วงหน้า
อินพุตโปรแกรมนี้เป็นไฟล์บันทึกข้อมูล GPS ที่มีบันทึกทั้งหมด 3150 บรรทัดและแต่ละบรรทัดของบันทึกแบ่งออกเป็นหลายฟิลด์ ตามคำถามเราจะต้องให้ความสนใจกับลองจิจูดและละติจูดพิกัด บันทึกบางส่วนของไฟล์ข้อมูลต้นฉบับแสดงในรูปที่ 2.1:
รูปที่ 2.1 แผนผังไดอะแกรมของบันทึกบางส่วนของไฟล์ข้อมูลต้นฉบับ
ดังที่แสดงในรูปที่ 2.1 รูปแบบการจัดเก็บของข้อมูลฟิลด์ละติจูดและลองจิจูดในแต่ละระเบียนในไฟล์ข้อมูลต้นฉบับเป็นวิธีการแสดงออกของพิกัด GPS โดยทั่วไปนั่นคือรูปแบบการแบ่งระดับปริญญาแบบฟอร์มคือ dddmm.mmmmmm ที่ DDD แสดงถึงระดับ mmmmm ในการประมวลผลข้อมูลล่วงหน้าเพื่ออำนวยความสะดวกในการคำนวณระยะห่างระหว่างสองจุดพิกัดถัดไปเราจำเป็นต้องแปลงข้อมูลพิกัดละติจูดและลองจิจูดในรูปแบบการแบ่งระดับเป็นรูปแบบของปริญญาวิธีการแปลงคือ DDD+mmmmmmm/60 ที่นี่เราเก็บรักษา 6 หลักหลังจากจุดทศนิยมและรูปแบบที่แปลงคือ ddd.xxxxxx
เราใช้พิกัดละติจูดและลองจิจูดในบันทึกแรก (11628.2491, 3955.6535) เป็นตัวอย่าง ผลการแปลงคือ (116.470818, 39.927558) พิกัดละติจูดและลองจิจูดในบันทึกทั้งหมดดำเนินการโดยใช้วิธีการและสามารถสร้าง ID สำหรับจุดพิกัดที่แปลงแล้วแต่ละจุดและระบุเฉพาะ หลังจากการบีบอัดเราจะต้องส่งออก ID ของคะแนนที่สงวนไว้ทั้งหมด
2.2 อัลกอริทึมการบีบอัดวิถีการเคลื่อนที่ของ Douglas-Peucker
อัลกอริธึมการบีบอัดวิถีแบ่งออกเป็นสองประเภทคือการบีบอัดที่ไม่สูญเสียและการบีบอัดที่สูญเสีย อัลกอริทึมการบีบอัดแบบไม่สูญเสียส่วนใหญ่รวมถึงการเข้ารหัส Huffman และอัลกอริทึมการบีบอัดที่สูญเสียจะแบ่งออกเป็นวิธีการประมวลผลแบบแบตช์และวิธีการบีบอัดข้อมูลออนไลน์ วิธีการประมวลผลแบบแบทช์ประกอบด้วยอัลกอริทึม DP (Douglas-Peucker), อัลกอริทึม TD-TR (อัตราส่วนเวลาจากบนลงล่าง) และอัลกอริทึม Bellman วิธีการบีบอัดข้อมูลออนไลน์รวมถึงหน้าต่างเลื่อน, เปิดหน้าต่าง, วิธีการที่ใช้พื้นที่ปลอดภัย ฯลฯ
เนื่องจากเวลา จำกัด สำหรับการบีบอัดวิถีนี้เราจึงตัดสินใจใช้อัลกอริทึม DP ที่ค่อนข้างง่าย
ขั้นตอนของอัลกอริทึม DP มีดังนี้:
(1) เชื่อมต่อเส้นตรง AB ระหว่างสองจุด A และ B ที่จุดเริ่มต้นและจุดสิ้นสุดของเส้นโค้งและเส้นตรงคือคอร์ดของเส้นโค้ง
(2) สำรวจจุดอื่น ๆ ทั้งหมดบนเส้นโค้งค้นหาระยะทางจากแต่ละจุดไปยังเส้นตรง AB ค้นหาจุด C ที่มีระยะทางสูงสุดและบันทึกระยะทางสูงสุดเป็น DMAX
(3) เปรียบเทียบระยะทาง DMAX กับขนาด DMAX ที่กำหนดไว้ล่วงหน้า ถ้า dmax <dmax จะใช้เส้นตรง AB เป็นการประมาณของส่วนโค้งและส่วนโค้งจะถูกประมวลผล
(4) ถ้า dmax> = dmax จุด C แบ่งเส้นโค้ง Ab ออกเป็นสองส่วน AC และ CB และดำเนินการ (1) ถึง (3) ขั้นตอนของทั้งสองส่วนนี้ตามลำดับ;
(5) เมื่อมีการประมวลผลเส้นโค้งทั้งหมดโพลีไลน์ที่เกิดขึ้นจากแต่ละจุดแบ่งส่วนจะเชื่อมต่อกันนั่นคือเส้นทางของเส้นโค้งดั้งเดิม
2.3 ระยะทางจากจุดหนึ่งไปอีกบรรทัด
ในอัลกอริทึม DP เราต้องหาระยะห่างจากจุดหนึ่งถึงเส้นตรง ระยะทางนี้หมายถึงระยะทางเหมือนยูโรในแนวตั้งนั่นคือระยะทาง d จากจุด C นอกเส้นตรง AB ไปยังเส้น AB ที่นี่คะแนน A, B และ C เป็นพิกัดละติจูดและลองจิจูดทั้งหมด เราใช้วิธีพื้นที่เท่ากันของสามเหลี่ยมเพื่อค้นหาระยะทาง d วิธีการเฉพาะคือ: คะแนน A, B และ C เป็นรูปสามเหลี่ยม มีสองวิธีในการค้นหาพื้นที่ของสามเหลี่ยมนี้คือวิธีธรรมดา (ความสูง x ล่าง/2) และสูตรเฮเลน สูตรเฮเลนมีดังนี้:
สมมติว่ามีรูปสามเหลี่ยมที่มีความยาวด้าน A, B และ C ตามลำดับ พื้นที่ S ของสามเหลี่ยมสามารถรับได้จากสูตรต่อไปนี้:
โดยที่ p คือเส้นรอบวงครึ่ง:
เราสามารถค้นหาพื้นที่ของสามเหลี่ยมผ่านสูตรเฮเลนจากนั้นเราสามารถค้นหาขนาดของความสูงซึ่งความสูงคือระยะทาง d ในการใช้สูตรเฮเลนคุณต้องหาระยะห่างระหว่างสามจุด A, B และ C. สูตรระยะทางจะได้รับจากครูและคุณสามารถเรียกฟังก์ชันระยะทางได้โดยตรง
หมายเหตุ: หลังจากค้นหาระยะทางให้เพิ่มค่าสัมบูรณ์เพื่อป้องกันระยะห่างจากการเป็นลบ
2.4 แก้ข้อผิดพลาดโดยเฉลี่ย
ข้อผิดพลาดเฉลี่ยหมายถึงค่าที่ได้จากการหารผลรวมของระยะทางจากจุดที่ละเว้นระหว่างการบีบอัดไปยังส่วนบรรทัดที่สอดคล้องกันโดยจำนวนคะแนนทั้งหมด
2.5 โซลูชันอัตราการบีบอัด
สูตรการคำนวณอัตราส่วนการบีบอัดมีดังนี้:
2.6 การสร้างไฟล์ผลลัพธ์
หลังจากการประมวลผลและการคำนวณข้างต้นเราเขียน ID ของจุดที่เหลือหลังจากการบีบอัดและจำนวนคะแนนข้อผิดพลาดระยะทางเฉลี่ยอัตราการบีบอัดและพารามิเตอร์อื่น ๆ ลงในไฟล์ผลลัพธ์สุดท้ายและคำตอบของคำถามจะเสร็จสิ้น
ส่วนที่ 3 การใช้รหัส
โปรแกรมนี้เขียนด้วยภาษา Java โดยมีสภาพแวดล้อมการพัฒนาของ Intellij Idea 14.0.2 รหัสแบ่งออกเป็นสองคลาส หนึ่งคือคลาส Enpoint ซึ่งใช้เพื่อบันทึกข้อมูล Latitude และ Longitude Point และอีกคลาสคือคลาส TrajectoryCompressionMain ซึ่งใช้ในการเขียนฟังก์ชั่นเช่นการประมวลผลข้อมูลอัลกอริทึม DP ระยะทางแบบจุดต่อบรรทัดและข้อผิดพลาดโดยเฉลี่ย
3.1 กระบวนการขั้นตอนทั่วไป
การไหลของโปรแกรมทั้งหมดส่วนใหญ่มีขั้นตอนต่อไปนี้:
(1) กำหนดอาร์เรย์ ArrayList ที่เกี่ยวข้องและวัตถุไฟล์ซึ่งมีวัตถุอาร์เรย์อาร์เรย์สามรายการ ได้แก่ อาร์เรย์ละติจูดดั้งเดิมและลองจิจูดอาร์เรย์ PGPSARRYINIT, อาร์เรย์พิกัดจุดที่กรอง PGPSARRAYFILTER มีวัตถุไฟล์ห้าไฟล์คือวัตถุไฟล์ข้อมูลต้นฉบับ FGPs, วัตถุข้อมูลผลลัพธ์ที่บีบอัด ogps, ไฟล์ข้อมูล FinitGpsPoint ที่รักษาจุดละติจูดดั้งเดิมและจุดประสานงานลองจิจูดที่แปลงแล้วไฟล์ทดสอบการจำลอง FTestinitPoint
(2) รับพิกัดของจุดเดิมและเขียนลงในไฟล์ส่วนใหญ่รวมถึงการดำเนินการสองรายการ: อ่านไฟล์และเขียนไฟล์;
(3) ทำการบีบอัดวิถี
(4) เรียงลำดับพิกัดละติจูดและลองจิจูดจุด;
(5) สร้างไฟล์ทดสอบการจำลองและใช้เครื่องมือภาษา R เพื่อวาดกราฟิกเพื่อให้ได้ผลลัพธ์สุดท้าย
(6) ค้นหาข้อผิดพลาดโดยเฉลี่ยและอัตราการบีบอัดข้อผิดพลาดเฉลี่ยจะได้รับผ่านฟังก์ชันและอัตราการบีบอัดจะถูกคำนวณโดยตรง
(7) เขียนผลลัพธ์สุดท้ายลงในไฟล์ผลลัพธ์รวมถึง ID จุดกรองจำนวนคะแนนข้อผิดพลาดเฉลี่ยและอัตราการบีบอัด
3.2 รหัสการใช้งานเฉพาะ
(1) Enpoint.java
แพ็คเกจ cc.xidian.main; นำเข้า java.text.decimalformat;/*** สร้างโดย Hadoop ในปี 2015/12/20.*/คลาสสาธารณะ enpoint ใช้การเปรียบเทียบ <enpoint> {public int id; // point idpublic double pe; // longitude pnid double pn; // dimension enpoint () ใหม่ DecimalFormat ("0.000000"); return.id+"#"+this.pn+","+this.pe;} สตริงสาธารณะ getTestString () {decimalformat df = decimalformat ใหม่ ("0.0000000"); return df.format (this.pn)+" getResultString () {decimalformat df = ใหม่ decimalformat ("0.000000"); return.id+"#"+df.format (this.pn)+","+df.format (this.pe); อื่นถ้า (this.id> other.id) return1; elsereturn0;}}(2) TrajectoryCompressionmain.java
แพ็คเกจ cc.xidian.main; นำเข้า java.io.*; นำเข้า java.text.decimalformat; นำเข้า java.util.*; นำเข้า java.util.list;/*** สร้างโดย Hadoop เมื่อปี 2015/12/19.*/ชั้นเรียนสาธารณะ ข้อยกเว้น {// ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ArrayList <Enpoint> (); // การบันทึกละติจูดและลองจิจูดดั้งเดิม ArrayList <Npoint> PGPSARRAYFILTER = arrayList ใหม่ <Enpoint> (); // ละติจูดที่กรองและ Longitude arrayList arrayList <enpoint> pGPSArrayfiltersort = ไฟล์ใหม่ ("2007-10-14-gps.log"); // ไฟล์ข้อมูลต้นฉบับไฟล์วัตถุไฟล์ OGPS = ไฟล์ใหม่ ("2015-12-25-GPS-result.log"); // กรองผลลัพธ์ไฟล์ข้อมูล // ค่าละติจูดเดิม และเก็บตัวเลข 6 หลักหลังจากไฟล์จุดทศนิยม finitGpsPoint = ไฟล์ใหม่ ("2007-10-14-gps-enpoint.log"); // เก็บไฟล์ข้อมูลที่แปลงแล้วของ Latitude และ Latuditude LATITODED LATITODED ftestFilterPoint = ไฟล์ใหม่ ("2015-12-25-gps-filtertestpoint.log"); // ใช้สำหรับไฟล์ข้อมูลจุดละติจูดและลองจิจูดที่กรอง การจำลอง // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PGPSARRAYINIT); // เขียนข้อมูล Latitude และ Longitude Point ดั้งเดิมที่แปลงแล้วลงในไฟล์ System.out.println (pgpsarrayinit.size ()); // เอาต์พุตจำนวนละติจูดดั้งเดิมและลองจิจูด พิกัด // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 30.0; // ตั้งค่าข้อผิดพลาดระยะทางสูงสุดเกณฑ์ pgpsarrayfilter.add (pgpsarrayinit.get (0)); // รับพิกัดของละติจูดดั้งเดิมและจุดลองจิจูดแรกและเพิ่มลงในอาร์เรย์ที่กรอง pgpsarrayfilter.add (pgpsarrayinit.get Latitude และ Longitude Point สุดท้ายและเพิ่มลงใน enpoint อาร์เรย์ที่กรอง [] enpinit = enpoint ใหม่ [pgpsarrayinit.size ()]; // ใช้อาร์เรย์จุดเพื่อรับพิกัดจุดทั้งหมด jj = 0; ในขณะที่ (iinit.hasnext ()) {enpinit [jj] = iinit.next (); jj ++;} // คัดลอกพิกัดของจุดใน ArrayList ลงในจุดเริ่มต้น = 0; // เริ่มต้น trajcompressc (enpinit, pgpsarrayfilter, start, end, dmax); // dp อัลกอริทึมการบีบอัด System.out.println (pgpsarrayfilter.size ()); // เอาต์พุตบีบอัด คะแนน // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- enpoint [pgpsarrayfilter.size ()]; // ใช้อาร์เรย์ของคะแนนเพื่อรับพิกัดจุดกรองสำหรับการเรียงลำดับต่อไปนี้ <enpoint> ถ้า = pgpsarrayfilter.iterator (); int i = 0; arraylist ไปยังจุดอาร์เรย์อาร์เรย์ (enpfilter); // เรียงลำดับ (int j = 0; j <enpfilter.length; j ++) {pgpsarrayfiltersort.add (enpfilter [j]); Array} // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ PGPSARRAYFILTERSORT); // เขียนจุดละติจูดและลองจิจูดที่กรองลงในไฟล์จำลองรูปแบบคือ "ลองจิจูดมิติ" - - getMeandisterror (PGPSARRAYINIT, PGPSARRAYFILTERSORT); // ค้นหาข้อผิดพลาดโดยเฉลี่ย System.out.println (mderror); // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - (สองครั้ง) pgpsarrayfilter.size ()/pgpsarrayinit.size ()*100; // ค้นหาอัตราการบีบอัด System.out.println (Crate); // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - และอัตราส่วนการบีบอัด WriteFilterPointTofile (OGPS, PGPSARRAYFILTERSORT, MDERROR, CRATE); // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - @Param FGPS: ไฟล์ข้อมูลต้นฉบับ* @return pgpsarrayInit: return arraylist array ที่บันทึกพิกัดจุดทั้งหมด* @throws Exception*/arraylist สาธารณะคงที่ <Enpoint> getEnpointFromFile arrayList <enpoint> (); if (fgps.exists () && fgps.isfile ()) {inputstreamreader read = new InputStreamReader (ใหม่ FileInputStream (FGPS)); bufferederereder Breader = new bufferedReader (อ่าน) str.split ("); enpoint p = new enpoint (); p.id = i; i ++; p.pe = (dftodu (strgps [3])); p.pn = (dftodu (strgps [5]); pgpsarray.add (p); ข้อผิดพลาดระยะทางและอัตราส่วนการบีบอัดของจุดกรองไปยังไฟล์ผลลัพธ์* @param outgpsfile: ไฟล์ผลลัพธ์* @param pgpspointfilter: จุดกรอง* @param mderror: ข้อผิดพลาดระยะทางเฉลี่ย* @param Crate: อัตราส่วนการบีบอัด Mderror, Double Crate) โยนข้อยกเว้น {iterator <enpoint> ifilter = pgpspointfilter.iterator (); randomaccessfile rfilter = new RandomaccessFile (outgpsfile, "rw"); p.getResultString ()+"/n"; byte [] bfilter = sfilter.getBytes (); rfilter.write (bfilter);} string strmc = "#"+integer.toString (PGPSPointFilter.size ())+","+double.toString (mderror)+","+double.toString (Crate)+"%"+"#"+"/n"; ฟังก์ชั่นฟังก์ชั่น: บันทึกจุดละติจูดและลองจิจูดต้นฉบับที่แปลงลงในไฟล์* @param outgpsfile* @param pgpspointfilter* @throws Exception*/void public writeinitpointtofile (ไฟล์ outgpsfile, arraylist <enpoint> pgpspointfilter) rfilter = new randomaccessFile (outgpsfile, "rw"); ในขณะที่ (ifilter.hasnext ()) {enpoint p = ifilter.next (); string sfilter = p.toString ()+"/n"; bfilter = bfilter = sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();}/*** ฟังก์ชั่นฟังก์ชั่น: เขียนข้อมูล Latitude และ Longitude Point ในอาร์เรย์ลงในไฟล์ทดสอบสำหรับการทดสอบภาพ* @param outgpsfile outgpsfile, arraylist <enpoint> pgpspointfilter) พ่นข้อยกเว้น {iterator <enpoint> ifilter = pgpspointfilter.iterator (); randomactfile rfilter = new RandomaccessFile (outgpsfile, "rw"); p.getTestString ()+"/n"; byte [] bfilter = sfilter.getBytes (); rfilter.write (bfilter);} rfilter.close ();} ฟังก์ชั่นฟังก์ชั่น: การแปลงข้อมูลที่มีความยาว dftodu double แบบคงที่ (string str) {int indexd = str.indexof ('.'); String strm = str.substring (0, indexd-2); strn = str.substring (indexd-2); double d = double.parsedouble (strm)+double.parsedouble (strn)/60; หมายเลขคู่ดั้งเดิม*@return ส่งคืนหมายเลขคู่ที่แปลงแล้ว*/public double getPointsix (double d) {decimalformat df = decimalformat ใหม่ ("0.000000"); Helen Formula) px)); double c = math.abs (geodist (pb, px)); double p = (a+b+c) /2.0; Incomprehensible* @param PA: จุดเริ่มต้น* @param PB: จุดสิ้นสุด* @return ระยะทาง: ระยะทาง*/สาธารณะคงที่ double geodist (enpoint PA, enpoint pb) {double radlat1 = rad (pa.pn); double radlat2 = rad (pb.pn); 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 math.sin (radlat2) + math.cos (radlat1)* math.cos (radlat2)* math.cos (delta_lon); double delta_sigma = math.atan2 (ด้านบน, ด้านล่าง); ระยะทางสองครั้ง = delta_sigma* 6378137.0; แบบคงที่ double rad (double d) {return d* math.pi / 180.0;} / *** ฟังก์ชั่นฟังก์ชั่น: ตามขีด จำกัด ระยะทางสูงสุดวิถีการเคลื่อนที่ดั้งเดิมจะถูกสุ่มตัวอย่างซ้ำโดยใช้วิธี DP เพื่อให้ได้จุดเริ่มต้นของการเริ่มต้น ตัวห้อย* @param end: endpoint subscript* @param dmax: ข้อผิดพลาดระยะทางสูงสุดล่วงหน้า*/โมฆะสาธารณะคงที่ trajcompressc (enpoint [] enpinit, arraylist <enpoint> enparrayfilter, int start, int ปลาย, dmax สอง dmax) {ถ้าเริ่มต้น ตัวห้อยสำหรับ (int i = start+1; i <end; i ++) {double curdist = disttosegment (enpinit [start], enpinit [end], enpinit [i]); // ระยะทางจากจุดปัจจุบันไปยังส่วนบรรทัดที่สอดคล้องกัน ระยะทางสูงสุด} // ถ้าระยะทางสูงสุดปัจจุบันมากกว่าข้อผิดพลาดระยะทางสูงสุดถ้า (maxdist> = dmax) {enparrayfilter.add (enpinit [cur_pt]); // เพิ่มจุดปัจจุบันลงในอาเรย์ที่กรอง trajcompressc (enpinit, enparrayfilter, start, cur_pt, dmax); พิกัด* @return: ส่งคืนระยะทางเฉลี่ย*/สาธารณะคงที่ double getMeandisterror (arraylist <enpoint> pgpsarrayInit, arrayList <enpoint> pgpsarrayfiltersort) {double sumdist = 0.0; สำหรับ (int i = 1; pgpsarrayfiltersort.get (i-1) .id; int end = pgpsarrayfiltersort.get (i) .id; สำหรับ (int j = start+1; j <end; j ++) {sumdist+= disttosegment sumdist/(pgpsarrayinit.size ()); return meandist;}}ผลขั้นตอนการขั้นตอน IV
4.1 ผลลัพธ์ผลลัพธ์ของโปรแกรม
ผลลัพธ์บีบอัด:
(1) จำนวนคะแนนทั้งหมด: 140 คะแนน; (2) ข้อผิดพลาดระยะทางเฉลี่ย: 7.943786; (3) อัตราการบีบอัด: 4.4444%
4.2 ผลการจำลอง
หลังจากการบีบอัดวิถีเราจะแปลงคะแนนพิกัดละติจูดและลองจิจูดดั้งเดิมเป็นจุดละติจูดที่ถูกบีบอัดและกรองและจุดประสานงานลองจิจูด เราเขียนจุดสองจุดนี้ประสานข้อมูลเป็นสองไฟล์จากนั้นวาดวิถีก่อนและหลังการบีบอัดตามไฟล์ทั้งสองนี้และเปรียบเทียบ จากผลการเปรียบเทียบเราสามารถดูว่าอัลกอริทึมการบีบอัดวิถีของเรามีประสิทธิภาพหรือไม่ ผลการเปรียบเทียบขั้นสุดท้ายแสดงในรูปที่ 4.1:
สรุปตอนที่ 5
ในระหว่างกระบวนการเขียนของโปรแกรมนี้ฉันพบปัญหาต่าง ๆ และเรียนรู้ประสบการณ์การเขียนโปรแกรมมากมาย ต่อไปนี้เป็นบทสรุปของปัญหาและการแก้ปัญหาที่พบและในที่สุดก็นำเสนอคำแนะนำสำหรับการปรับปรุงข้อบกพร่องของโปรแกรม
5.1 ปัญหาและการแก้ปัญหาที่พบ
คำถามที่ 1: ปัญหาการสั่งซื้อแบบละติจูดและลองจิจูด
การแก้ปัญหา: พารามิเตอร์ในสูตรระยะทางคือละติจูดอยู่ด้านหน้าและลองจิจูดอยู่ด้านหลังและลำดับของละติจูดและจุดพิกัดลองจิจูดจะต้องปรับ
คำถามที่ 2: ระยะทางไม่สามารถลบได้
วิธีแก้ปัญหา: ตรวจสอบให้แน่ใจว่าระยะทางที่พบไม่สามารถเป็นลบเพิ่มฟังก์ชันค่าสัมบูรณ์
คำถามที่ 3: รายละเอียดการใช้อัลกอริทึม DP
วิธีแก้ปัญหา: ฉันเริ่มใช้อาร์เรย์ ArrayList เพื่อแก้ปัญหา Subscript มีข้อผิดพลาดอย่างมากเมื่อแก้ไขซ้ำ ต่อมาฉันเปลี่ยนไปใช้ตัวห้อยอาร์เรย์ทั่วไปสำหรับการเรียกซ้ำและผลลัพธ์ก็ดีขึ้นมาก
5.2 ข้อบกพร่องและโอกาสที่มีอยู่เดิม
(1) เมื่อทำการบีบอัดวิถีวิถีอัลกอริทึม DP เป็นอัลกอริทึมที่ง่ายที่สุดและไม่ดีที่สุด อัลกอริทึมบางอย่างที่มีผลลัพธ์ที่ดีสามารถใช้ในการบีบอัดวิถีการบีบอัดอีกครั้ง;
(2) บันทึกข้อมูลของการทดลองนี้คือ 3,150 และจำนวนข้อมูลไม่ใหญ่ ฉันควรทำอย่างไรถ้ามีข้อมูล 1 พันล้าน? เราสามารถพิจารณาฮาร์ดแวร์กระจายข้อมูลการประมวลผลข้อมูลการแบ่งส่วนข้อมูลและคลังข้อมูลที่มีประสิทธิภาพที่ดี
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับรหัสรายละเอียดของอัลกอริทึม Douglas-Peucker สำหรับการเขียนโปรแกรม Java เพื่อใช้การบีบอัดวิถี ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!