亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java編程實現軌跡壓縮算法開放窗口實例代碼

2024-07-13 10:13:35
字體:
來源:轉載
供稿:網友

java/281692.html">java/293610.html">軌跡壓縮算法

場景描述

給定一個GPS數據記錄文件,每條記錄包含經度和維度兩個坐標字段,根據距離閾值壓縮記錄,將過濾后的所有記錄的經緯度坐標構成一條軌跡

算法描述

這種算法的用處還是相當廣泛的。

軌跡壓縮算法分為兩大類,分別是無損壓縮和有損壓縮,無損壓縮算法主要包括哈夫曼編碼,有損壓縮算法又分為批處理方式和在線數據壓縮方式,其中批處理方式又包括DP(Douglas-Peucker)算法、TD-TR(Top-Down Time-Ratio)算法和Bellman算法,在線數據壓縮方式又包括滑動窗口、開放窗口、基于安全區域的方法等。

 

代碼實現

import java.awt.Color;import java.awt.Graphics;import java.awt.Point;import java.awt.Toolkit;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.RandomAccessFile;import 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) throws Exception{		//閾值定義		double maxDistanceError = 30;		/*  * 文件讀取  * */		//存放從文件讀取的位置點的信息列表		ArrayList<enpoint> ENPList = new ArrayList<enpoint>();		//源數據文件的地址 建立文件對象		//這里是需要更改的地方 改你源文件的存放地址 記住如果地址中含"/",記得再加一個"/",原因"/"是轉義符號 		//這里可以寫成C:/Users/Administrator/Desktop/11.6/2007-10-14-GPS.log		File sourceFile = new File("./2007-10-14-GPS.log");		//調用文件讀取函數 讀取文件數據		ENPList = getENPointFromFile(sourceFile);		//這里是測試 有沒有讀到里面 看看列表里的數據個數 交作業的時候記得注釋掉		System.out.println(ENPList.size());		/*  * 數據處理  * 方法:開放窗口軌跡壓縮法  * */		//存放目標點的集合		ArrayList<enpoint> rePointList = new ArrayList<enpoint>();		rePointList = openWindowTra(ENPList,maxDistanceError);		System.out.println(rePointList.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);		/*  * 畫線形成對比圖  * */		//generateImage(ENPList,rePointList);	}	/* * 從提供的文件信息里提取位置點 * 并將每個點的坐標數值調用轉換函數存到列表里 * 函數返回一個 存放所有位置點 的集合 */	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));			//輸入流初始化			BufferedReader bReader = new BufferedReader(read);			//緩存讀取初始化			String str;			String[] strGPS;			int i = 0;			while((str = bReader.readLine())!=null){				//每次讀一行				strGPS = str.split(" ");				ENPoint p = new ENPoint();				p.id = i;				i++;				p.pe = (dfTodu(strGPS[3]));				p.pn = (dfTodu(strGPS[5]));				pGPSArray.add(p);			}			bReader.close();		}		return pGPSArray;	}	/** * 函數功能:將原始經緯度坐標數據轉換成度 * 獲取的經緯度數據為一個字符串 */	public static double dfTodu(String str){		int indexD = str.indexOf('.');		//獲取 . 字符所在的位置		String strM = str.substring(0,indexD-2);		//整數部分		String strN = str.substring(indexD-2);		//小數部分		double d = double.parsedouble(strM)+double.parsedouble(strN)/60;		return d;	}	/* * 開放窗口方法實現 * 返回一個壓縮后的位置列表 * 列表每條數據存放ID、點的坐標 *  * 算法描述: * 初始點和浮動點計算出投影點,判斷投影點和軌跡點的距離與閾值 若存在距離大于閾值  * 則初始點放入targetList,浮動點向前檢索一點作為新的初始點,新的初始點向后檢索第二個作為新的浮動點 這里存在判斷 即新的初始點位置+1是不是等于列表長度 這里決定了浮動點的選取 * 如此處理至終點 * */	public static ArrayList<enpoint> openWindowTra(ArrayList<enpoint> sourceList,double maxDis){		ArrayList<enpoint> targetList = new ArrayList<enpoint>();		//定義初始點位置 最開始初始點位置為0 		int startPoint = 0;		//定義浮動點位置 最開始初始點位置2		int floatPoint = 2;		//定義當前軌跡點位置 最開始初始點位置為1		int nowPoint = 1;		int len = sourceList.size();		//存放所有窗口內的點的信息集合 		ArrayList<enpoint> listPoint = new ArrayList<enpoint>();		listPoint.add(sourceList.get(nowPoint));		//浮動點位置決定循環		while(true){			//標志 用來控制判斷是否進行窗口內軌跡點更新			Boolean flag = false;			//計算并判斷窗口內所有點和投影點的距離是否大于閾值			for (ENPoint point:listPoint){				double disOfTwo = getDistance(sourceList.get(startPoint),sourceList.get(floatPoint),point);				if(disOfTwo >= 30){					flag = true;					break;				}			}			if(flag){				//窗口內點距離都大于閾值				//初始點加到目標列表				targetList.add(sourceList.get(startPoint));				//初始點變化				startPoint = floatPoint - 1;				//浮動點變化				floatPoint += 1;				if(floatPoint >= len){					targetList.add(sourceList.get(floatPoint-1));					break;				}				//窗口內點變化				listPoint.clear();				//System.out.println(listPoint.size());				listPoint.add(sourceList.get(startPoint+1));			} else{				//距離小于閾值的情況				//初始點不變				//當前窗口集合加入當前浮動點				listPoint.add(sourceList.get(floatPoint));				//浮動點后移一位				floatPoint += 1;				//如果浮動點是終點 且當前窗口點距離都小于閾值 就直接忽略窗口點 直接將終點加入目標點集合				if(floatPoint >= len){					targetList.add(sourceList.get(startPoint));					targetList.add(sourceList.get(floatPoint-1));					break;				}			}			flag = false;		}		return targetList;	}	/*計算投影點到軌跡點的距離 * 入口是初始點A、浮動點B、當前軌跡點C * 三角形面積公式 */	public static double 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(geoDist(A,C));		double p = (a + b + c)/2.0;		double s = Math.sqrt(p * (p-a) * (p-b) * (p-c));		distance = s * 2.0 / a;		return distance;	}	/* * ArrayList 拷貝函數 * */	/*提供的函數 * 其中計算距離的函數 經過改造得到下面的距離計算方法 * 具體是怎么計算距離的 我也沒研究了 * */	public static double geoDist(ENPoint pA,ENPoint 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(radLat2) - Math.sin(radLat1) * 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.cos(delta_lon);		double delta_sigma = Math.atan2(top, bottom);		double distance = delta_sigma * 6378137.0;		return distance;	}	public static double Rad(double d){		return d * Math.PI / 180.0;	}	/* * 將壓縮后的位置點信息寫入到文件中 * */	public static void writeTestPointToFile(File outGPSFile,ArrayList<enpoint> pGPSPointFilter)throws 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();	}	/** * 函數功能:求平均距離誤差 * 返回平均距離 */	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++){" meandist="sumDist/(pGPSArray.size());" pre="" return="" start="pGPSArrayRe.get(i-1).id;" sumdist=""><pre class="brush:java;">import java.text.DecimalFormat;			public class ENPoint implements Comparable<enpoint>{			 public int id;			//點ID			public double pe;			//經度			public double pn;			//維度			public ENPoint(){			}			//空構造函數			public String toString(){				return 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";			}			@Override			 public int compareTo(ENPoint other) {				if(this.id<other.id) else="" return="" this.id="">other.id) return 1; else				  return 0;			}		}

總結

以上就是本文關于Java編程實現軌跡壓縮算法開放窗口實例代碼的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩国产成人| 97色在线播放视频| 亚洲欧美三级伦理| 欧美成人第一页| 中文字幕日韩精品有码视频| 亚洲欧美国产va在线影院| 欧美—级a级欧美特级ar全黄| 国产精品久久久久久久久粉嫩av| 欧美专区第一页| 亚洲xxxx3d| 国产成人极品视频| 国产精品视频色| 国产日韩精品在线观看| 日韩av电影在线免费播放| 国产精品久久久久不卡| 中国china体内裑精亚洲片| 欧美xxxx做受欧美| 亚洲毛片一区二区| 亚洲成人激情在线观看| 日韩免费看的电影电视剧大全| 色青青草原桃花久久综合| 国产九九精品视频| 欧美最猛性xxxx| 欧美性做爰毛片| 狠狠躁天天躁日日躁欧美| 91国内免费在线视频| 欧美日韩中文在线| 中文字幕国产亚洲| 日韩av在线资源| 国产色婷婷国产综合在线理论片a| 91免费精品国偷自产在线| 久久久久久久国产| 亚洲欧美日韩一区在线| 精品自拍视频在线观看| 欧美日韩国产一区二区| 欧洲午夜精品久久久| 91人成网站www| 精品magnet| 日韩av免费网站| 精品成人av一区| 久久天天躁狠狠躁夜夜躁| 亚洲天堂av高清| 国产精品高清免费在线观看| 欧美性jizz18性欧美| 97精品视频在线播放| 91久久在线视频| 2019中文字幕全在线观看| 国产精品成人va在线观看| 国自产精品手机在线观看视频| 久久久亚洲国产天美传媒修理工| 秋霞av国产精品一区| 国产精品夜间视频香蕉| 欧美性xxxx极品hd欧美风情| 国产成人+综合亚洲+天堂| 欧美日韩激情网| 最近中文字幕2019免费| 亚洲精品国产电影| 成人免费看吃奶视频网站| 中文字幕精品网| 欧美激情视频在线免费观看 欧美视频免费一| 日韩电影中文字幕在线观看| 91精品久久久久久久久久久久久| 成人做爰www免费看视频网站| 亚洲自拍偷拍色片视频| 亚洲女人被黑人巨大进入| 国产精品久久久久久久av大片| 欧美在线视频播放| 亚洲xxxxx电影| 人人澡人人澡人人看欧美| 精品福利一区二区| 国产在线观看91精品一区| 亚洲精品日韩丝袜精品| 国产欧美欧洲在线观看| 97久久精品人人澡人人爽缅北| 一本色道久久88精品综合| 91在线观看免费高清| 亚洲第一黄色网| 久久躁狠狠躁夜夜爽| 日韩电影中文字幕在线| 亚洲男人av在线| 亚洲美女性生活视频| 亚洲经典中文字幕| 久久这里只有精品视频首页| 久久久久久久国产| 日韩av在线网页| 久久精品免费播放| 精品国产1区2区| 26uuu久久噜噜噜噜| 亚洲成年人影院在线| 91国产在线精品| 久热精品视频在线观看| 日韩精品丝袜在线| 亚洲无亚洲人成网站77777| 伊人青青综合网站| 日韩av在线免费观看一区| 欧美激情免费视频| 亚洲成人av片在线观看| 欧美性色xo影院| 亚洲欧美中文字幕在线一区| 69久久夜色精品国产7777| 久久成人亚洲精品| 国产综合在线观看视频| 国产女人18毛片水18精品| 中文字幕久热精品在线视频| 亚洲欧洲一区二区三区久久| 日韩高清免费观看| 久久久久久成人精品| 96国产粉嫩美女| 成人网址在线观看| 亚洲图片在线综合| 中文字幕精品一区二区精品| 狠狠久久五月精品中文字幕| 亚洲国产中文字幕在线观看| 国产日韩欧美在线播放| 欧美成人激情视频免费观看| 日韩中文字幕在线视频| 色综合亚洲精品激情狠狠| 欧美性xxxx极品hd欧美风情| 国产精品日日做人人爱| 国产亚洲激情在线| 久久亚洲春色中文字幕| 日韩欧美一区二区三区| 色妞色视频一区二区三区四区| 热久久视久久精品18亚洲精品| 亚洲a级在线播放观看| 欧美精品激情视频| 成人免费观看网址| 中文字幕自拍vr一区二区三区| 国产精品久久久久久久久男| 久久亚洲电影天堂| 欧美第一淫aaasss性| 亚洲午夜女主播在线直播| 亚洲色图国产精品| 欧美日韩国产区| 欧美精品一本久久男人的天堂| 日韩精品视频在线观看免费| 91av成人在线| 国产一区二区香蕉| 国产精品自产拍在线观看中文| 国产精品久久久91| 国产精品揄拍一区二区| 亚洲视频自拍偷拍| 国产精品欧美激情| 日韩中文字幕欧美| 日日噜噜噜夜夜爽亚洲精品| 性色av一区二区三区| 亚洲精品国精品久久99热一| 中文字幕精品国产| 国产精品av网站| 欧美亚洲国产另类| 波霸ol色综合久久| 日韩中文娱乐网| 亚洲欧美日韩网| 欧美日韩激情视频| 亚洲女人天堂成人av在线| 日本aⅴ大伊香蕉精品视频| 亚洲一区制服诱惑| 中文字幕亚洲欧美日韩高清| 热re91久久精品国99热蜜臀| 国语自产精品视频在线看抢先版图片| 精品国产31久久久久久| 理论片在线不卡免费观看| 色老头一区二区三区| 日韩av电影在线网|