خوارزمية ضغط المسار
وصف المشهد
بالنظر إلى ملف سجل بيانات GPS ، يحتوي كل سجل على حقلين للإحداثيين ، خط الطول والبعد ، ويضغط السجلات وفقًا لعتبة المسافة ، ويشكل مسارًا مع إحداثيات خطوط الطول وخط الطول لجميع السجلات المصفاة.
وصف الخوارزمية
هذه الخوارزمية لديها مجموعة واسعة من الاستخدامات.
تنقسم خوارزميات ضغط المسار إلى فئتين ، وهما الضغط بدون فقدان وضغط ضياع. تتضمن خوارزميات الضغط غير المفقودة بشكل رئيسي ترميز Huffman ، وتتم تقسيم خوارزميات الضغط المفقودة إلى طريقة معالجة الدُفعات وطريقة ضغط البيانات عبر الإنترنت. تتضمن طريقة معالجة الدُفعات خوارزمية DP (Douglas-Peucker) ، وخوارزمية TD-TR (من أعلى إلى أسفل) خوارزمية Bellman. تتضمن طرق ضغط البيانات عبر الإنترنت النوافذ المنزلق ، والنوافذ المفتوحة ، والطرق الآمنة القائمة على المنطقة ، وما إلى ذلك.
يمكنك أيضًا الرجوع إلى هذه المقالة: " مدونة مفصلة لخوارزمية Douglas-Peucker لضغط مسار Programming Programming 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 ؛ public class rajectorycom {public static void main (string) args {// thershold definivity * * * * قائمة نقاط الموضع القراءة من ملف ArrayList <enpoint> enplist = جديد ArrayList <Enpoint> () ؛ // إنشاء كائن ملف لعنوان ملف البيانات المصدر // هذا هو المكان الذي تحتاج إلى تغيير عنوان التخزين في ملف المصدر الخاص بك. تذكر ما إذا كان العنوان يحتوي على "/" ، تذكر أن تضيف "/" السبب "/" هو رمز الهروب // يمكن كتابة هذا كـ C: /users/administrator/desktop/11.6/2007-10-14-gps.logfile sourcefile = new file ("./ 2007-14 gps.log" getEnpointFromFile (SourceFile) ؛ // هذا هو اختبار ما إذا كنت قد قرأت البيانات في القائمة والتحقق من عدد البيانات في القائمة. تذكر أن التعليق على system.out.println (enplist.size ()) ؛/**** معالجة البيانات* الطريقة: فتح طريقة ضغط النافذة** //// اكتب إلى الملف الهدف * */file targetfile = ملف جديد ("./ 2007-10-14-gpsresult.log") ؛ OrbeTestPointTofile (targetfile ، repointlist) ؛/ * * * حساب معدل مضغوط */مزدوج cpl = (double) repointlist.size ()/(double) enplist.size () * 100 ؛ decimalformat df = new decimalformat ("0.000000") خطأ في المسافة**/double avediserr = getMeAndisterRor (enplist ، repointlist) ؛ system.out.println (Avediserr) ؛/****** نقاط*/arraylist ثابتة عامة <Enpoint> getEnPointFromFile (ملف FGPs) يلقي استثناء {ArrayList <Enpoint> pgpsarray = new ArrayList <Enpoint> () ؛ if (fgps.exists () bufferedReader Quarer = جديد bufferedReader (قراءة) ؛ // مخزنة القراءة string string str ؛ string [] strgps ؛ int i = 0 ؛ (dftodu (strgps [3]))) ؛ p.pn = (dftodu (strgps [5])) ؛ pgpsarray.add (p) str) {int indexd = str.indexof ('.') ؛ // get. موضع سلسلة الأحرف strm = str.substring (0 ، indexd-2) ؛ // integer part strn strn = str.subString (indexd-2) ؛ // part double d double d = double.parsedouble (strm)+double.parsedouble (strn)/60 ؛ return d ؛ وصف الخوارزمية: * النقطة الأولية والنقطة العائمة تحسب نقطة الإسقاط ، تحكم على المسافة بين نقطة الإسقاط ونقطة المسار وقيمة العتبة. إذا كانت المسافة أكبر من قيمة العتبة*، فسيتم وضع النقطة الأولية في قائمة الهدف ، وتبحث النقطة العائمة إلى الأمام كنقطة أولية جديدة ، وتبحث النقطة الأولية الجديدة للخلف باعتبارها الثانية كنقطة عائمة جديدة. هنا هناك حكم هو ما إذا كان موضع النقطة الأولية الجديدة +1 يساوي طول القائمة. هذا يحدد اختيار النقطة العائمة* يتم التعامل مع هذا إلى نقطة النهاية**//arraylist ثابتة عامة <Enpoint> OpenWindowtra (ArrayList <Enpoint> sourcelist ، double maxdis) {ArrayList <Enpoint> targetlist = new arraylist <enpoint> () floatpoint = 2 ؛ // تحديد موضع النقطة الأولية لموضع نقطة المسار الحالية على أنه 1Int nowpoint = 1 ؛ int len = sourcelist.size () ؛ نقطة المسار في العلم المنطقي النافذة = false ؛ // حساب والحكم على ما إذا كانت المسافة بين جميع النقاط في النافذة ونقطة الإسقاط أكبر من العتبة (Enpoint Point: ListPoint) {double disoftwo = getDistance (sourcelist.get (startpoint) ، sourcelist.get (floatpoint) ، point) ؛ إذا كانت (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)) ؛} آخر {// المسافة أقل من العتبة // تظل النقطة الأولية دون تغيير // مجموعة النوافذ الحالية تضيف نقطة قائمة عائمة التيار. من العتبة ، تجاهل نقطة النافذة وأضف بشكل مباشر نقطة النهاية إلى مجموعة النقطة المستهدفة إذا كان (floatpoint> = len) {targetlist.add (sourcelist.get (startpoint)) ؛ targetlist.add (sourcelist.get (floatpoint-1) ؛ break ؛}} flag = false ؛ ونقطة المسار الحالية C * triangular arey formula */public static getDistance (enpoint a ، enpoint b ، enpoint c) {double distane = 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)) ؛ المسافة = s * 2.0/a ؛ مسافة الإرجاع ؛}/ * * * وظيفة نسخ ArrayList * * // * الوظائف المتوفرة * تم حساب الوظيفة التي تحسب المسافة الزائدة (enpoint pa pa ، unoint pb) 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 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 ؛ مسافة الإرجاع ؛} rad static double static (double d) {return d * math.pi/180.0 ؛}/ * * اكتب معلومات نقطة الضغط المضغوطة إلى الملف * استثناء {iterator <Enpoint> ifilter = pgpspointfilter.iterator () ؛ randomaccessfile rfilter = new randomaccessfile (outgpsfile ، "rw") ؛ sfilter.getbytes () ؛ rfilter.write (bfilter) ؛} rfilter.close () ؛}/*** وظيفة الوظيفة: أوجد متوسط خطأ المسافة* إرجاع المسافة المتوسطة*/public static double getMaNdisterror (arraylist <enpoint> pgpsarray ، araylist <enpoint> pgpsarrayre {doubledist = 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 ؛ getResultString () {decimalformat df = new decimalformat ("0.000000") ؛ إرجاع this.id+"#"+df.format (this.pe)+"،"+df.format (this.pn)+" /n" ؛}@override public intinto (enpoint) this.id = ""> other.id) return 1 ؛ عودة أخرى 0 ؛}}لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول رمز مثيل النافذة المفتوحة لخوارزمية ضغط تنفيذ برمجة Java. آمل أن يكون ذلك مفيدًا للجميع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها.