最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程實(shí)現(xiàn)軌跡壓縮算法開放窗口實(shí)例代碼

 更新時(shí)間:2017年11月28日 09:24:28   作者:wzw_ice  
這篇文章主要介紹了Java編程實(shí)現(xiàn)軌跡壓縮算法開放窗口實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。

軌跡壓縮算法

場景描述

給定一個(gè)GPS數(shù)據(jù)記錄文件,每條記錄包含經(jīng)度和維度兩個(gè)坐標(biāo)字段,根據(jù)距離閾值壓縮記錄,將過濾后的所有記錄的經(jīng)緯度坐標(biāo)構(gòu)成一條軌跡

算法描述

這種算法的用處還是相當(dāng)廣泛的。

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

大家也可參考這篇文章:Java編程實(shí)現(xiàn)軌跡壓縮之Douglas-Peucker算法詳細(xì)代碼

代碼實(shí)現(xiàn)

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;
		/*
  * 文件讀取
  * */
		//存放從文件讀取的位置點(diǎn)的信息列表
		ArrayList<enpoint> ENPList = new ArrayList<enpoint>();
		//源數(shù)據(jù)文件的地址 建立文件對象
		//這里是需要更改的地方 改你源文件的存放地址 記住如果地址中含"\",記得再加一個(gè)"\",原因"\"是轉(zhuǎn)義符號 
		//這里可以寫成C:/Users/Administrator/Desktop/11.6/2007-10-14-GPS.log
		File sourceFile = new File("./2007-10-14-GPS.log");
		//調(diào)用文件讀取函數(shù) 讀取文件數(shù)據(jù)
		ENPList = getENPointFromFile(sourceFile);
		//這里是測試 有沒有讀到里面 看看列表里的數(shù)據(jù)個(gè)數(shù) 交作業(yè)的時(shí)候記得注釋掉
		System.out.println(ENPList.size());
		/*
  * 數(shù)據(jù)處理
  * 方法:開放窗口軌跡壓縮法
  * */
		//存放目標(biāo)點(diǎn)的集合
		ArrayList<enpoint> rePointList = new ArrayList<enpoint>();
		rePointList = openWindowTra(ENPList,maxDistanceError);
		System.out.println(rePointList.size());
		/*
  * 寫入目標(biāo)文件
  * */
		File targetFile = new File("./2007-10-14-GPSResult.log");
		writeTestPointToFile(targetFile,rePointList);
		/*
  * 壓縮率計(jì)算
  */
		double cpL = (double)rePointList.size() / (double)ENPList.size() * 100;
		DecimalFormat df = new DecimalFormat("0.000000");
		System.out.println("壓縮率:"+ df.format(cpL) + "%");
		/*
  * 計(jì)算平均距離誤差
  * */
		double aveDisErr = getMeanDistError(ENPList,rePointList);
		System.out.println(aveDisErr);
		/*
  * 畫線形成對比圖
  * */
		//generateImage(ENPList,rePointList);
	}
	/*
 * 從提供的文件信息里提取位置點(diǎn)
 * 并將每個(gè)點(diǎn)的坐標(biāo)數(shù)值調(diào)用轉(zhuǎn)換函數(shù)存到列表里
 * 函數(shù)返回一個(gè) 存放所有位置點(diǎn) 的集合
 */
	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;
	}
	/**
 * 函數(shù)功能:將原始經(jīng)緯度坐標(biāo)數(shù)據(jù)轉(zhuǎn)換成度
 * 獲取的經(jīng)緯度數(shù)據(jù)為一個(gè)字符串
 */
	public static double dfTodu(String str){
		int indexD = str.indexOf('.');
		//獲取 . 字符所在的位置
		String strM = str.substring(0,indexD-2);
		//整數(shù)部分
		String strN = str.substring(indexD-2);
		//小數(shù)部分
		double d = double.parsedouble(strM)+double.parsedouble(strN)/60;
		return d;
	}
	/*
 * 開放窗口方法實(shí)現(xiàn)
 * 返回一個(gè)壓縮后的位置列表
 * 列表每條數(shù)據(jù)存放ID、點(diǎn)的坐標(biāo)
 * 
 * 算法描述:
 * 初始點(diǎn)和浮動點(diǎn)計(jì)算出投影點(diǎn),判斷投影點(diǎn)和軌跡點(diǎn)的距離與閾值 若存在距離大于閾值 
 * 則初始點(diǎn)放入targetList,浮動點(diǎn)向前檢索一點(diǎn)作為新的初始點(diǎn),新的初始點(diǎn)向后檢索第二個(gè)作為新的浮動點(diǎn) 這里存在判斷 即新的初始點(diǎn)位置+1是不是等于列表長度 這里決定了浮動點(diǎn)的選取
 * 如此處理至終點(diǎn)
 * */
	public static ArrayList<enpoint> openWindowTra(ArrayList<enpoint> sourceList,double maxDis){
		ArrayList<enpoint> targetList = new ArrayList<enpoint>();
		//定義初始點(diǎn)位置 最開始初始點(diǎn)位置為0 
		int startPoint = 0;
		//定義浮動點(diǎn)位置 最開始初始點(diǎn)位置2
		int floatPoint = 2;
		//定義當(dāng)前軌跡點(diǎn)位置 最開始初始點(diǎn)位置為1
		int nowPoint = 1;
		int len = sourceList.size();
		//存放所有窗口內(nèi)的點(diǎn)的信息集合 
		ArrayList<enpoint> listPoint = new ArrayList<enpoint>();
		listPoint.add(sourceList.get(nowPoint));
		//浮動點(diǎn)位置決定循環(huán)
		while(true){
			//標(biāo)志 用來控制判斷是否進(jìn)行窗口內(nèi)軌跡點(diǎn)更新
			Boolean flag = false;
			//計(jì)算并判斷窗口內(nèi)所有點(diǎn)和投影點(diǎn)的距離是否大于閾值
			for (ENPoint point:listPoint){
				double disOfTwo = getDistance(sourceList.get(startPoint),sourceList.get(floatPoint),point);
				if(disOfTwo >= 30){
					flag = true;
					break;
				}
			}
			if(flag){
				//窗口內(nèi)點(diǎn)距離都大于閾值
				//初始點(diǎn)加到目標(biāo)列表
				targetList.add(sourceList.get(startPoint));
				//初始點(diǎn)變化
				startPoint = floatPoint - 1;
				//浮動點(diǎn)變化
				floatPoint += 1;
				if(floatPoint >= len){
					targetList.add(sourceList.get(floatPoint-1));
					break;
				}
				//窗口內(nèi)點(diǎn)變化
				listPoint.clear();
				//System.out.println(listPoint.size());
				listPoint.add(sourceList.get(startPoint+1));
			} else{
				//距離小于閾值的情況
				//初始點(diǎn)不變
				//當(dāng)前窗口集合加入當(dāng)前浮動點(diǎn)
				listPoint.add(sourceList.get(floatPoint));
				//浮動點(diǎn)后移一位
				floatPoint += 1;
				//如果浮動點(diǎn)是終點(diǎn) 且當(dāng)前窗口點(diǎn)距離都小于閾值 就直接忽略窗口點(diǎn) 直接將終點(diǎn)加入目標(biāo)點(diǎn)集合
				if(floatPoint >= len){
					targetList.add(sourceList.get(startPoint));
					targetList.add(sourceList.get(floatPoint-1));
					break;
				}
			}
			flag = false;
		}
		return targetList;
	}
	/*計(jì)算投影點(diǎn)到軌跡點(diǎn)的距離
 * 入口是初始點(diǎn)A、浮動點(diǎn)B、當(dāng)前軌跡點(diǎn)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 拷貝函數(shù)
 * */
	/*提供的函數(shù)
 * 其中計(jì)算距離的函數(shù) 經(jīng)過改造得到下面的距離計(jì)算方法
 * 具體是怎么計(jì)算距離的 我也沒研究了
 * */
	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;
	}
	/*
 * 將壓縮后的位置點(diǎn)信息寫入到文件中
 * */
	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();
	}
	/**
 * 函數(shù)功能:求平均距離誤差
 * 返回平均距離
 */
	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;
			//點(diǎn)ID
			public double pe;
			//經(jīng)度
			public double pn;
			//維度
			public ENPoint(){
			}
			//空構(gòu)造函數(shù)
			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;
			}
		}

總結(jié)

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

相關(guān)文章

  • springmvc中下載中文文件名稱為下劃線的解決方案

    springmvc中下載中文文件名稱為下劃線的解決方案

    這篇文章主要介紹了springmvc中下載中文文件名稱為下劃線的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 寫了兩年代碼之后再來談一談Spring中的Bean

    寫了兩年代碼之后再來談一談Spring中的Bean

    這篇文章主要介紹了寫了兩年代碼之后再來看看Spring中的Bean,這里列出四種常用的添加Bean的方式,介紹最基本的@Bean注解,@Bean注解聲明這個(gè)類是一個(gè)Bean,需要的朋友可以參考下
    2021-10-10
  • java小程序之控制臺字符動畫的實(shí)現(xiàn)

    java小程序之控制臺字符動畫的實(shí)現(xiàn)

    這篇文章主要給大家介紹了java小程序之控制臺字符動畫實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringCloud Gateway 路由配置定位原理分析

    SpringCloud Gateway 路由配置定位原理分析

    本節(jié)主要了解系統(tǒng)中的謂詞與配置的路由信息是如何進(jìn)行初始化關(guān)聯(lián)生成路由對象的。每個(gè)謂詞工廠中的Config對象又是如何被解析配置的
    2021-07-07
  • Spring Boot CLI安裝教程

    Spring Boot CLI安裝教程

    Spring Boot是一個(gè)命令行工具,用于使用Spring進(jìn)行快速原型搭建。本文重點(diǎn)給大家介紹Spring Boot CLI安裝教程,感興趣的朋友參考下吧
    2017-08-08
  • java動態(tài)導(dǎo)出excel壓縮成zip下載的方法

    java動態(tài)導(dǎo)出excel壓縮成zip下載的方法

    這篇文章主要為大家詳細(xì)介紹了java動態(tài)導(dǎo)出excel壓縮成zip下載的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java map存放數(shù)組并取出值代碼詳解

    Java map存放數(shù)組并取出值代碼詳解

    這篇文章主要介紹了Java map存放數(shù)組并取出值代碼詳解的相關(guān)內(nèi)容,小編覺得挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。
    2017-10-10
  • 深入了解java中的逃逸分析

    深入了解java中的逃逸分析

    這篇文章主要介紹了深入了解java中的逃逸分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JAVA類變量及類方法代碼實(shí)例詳解

    JAVA類變量及類方法代碼實(shí)例詳解

    這篇文章主要介紹了JAVA類變量及類方法代碼實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn)

    java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn)

    這篇文章給大家分享java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn),需要獲取要賦值給二維碼的鏈接后綴,通過設(shè)置二維碼的訪問路徑等一系列操作,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2021-06-06

最新評論

景德镇市| 虎林市| 乌兰察布市| 固镇县| 汝州市| 华坪县| 德州市| 合肥市| 香港 | 建昌县| 南投县| 哈巴河县| 中牟县| 奈曼旗| 金塔县| 朝阳县| 长武县| 庐江县| 衢州市| 扶风县| 通河县| 浦城县| 婺源县| 太湖县| 宝兴县| 龙岩市| 广州市| 湖南省| 徐州市| 泽库县| 黄龙县| 西和县| 连城县| 平利县| 新蔡县| 固始县| 大方县| 乐昌市| 南平市| 康保县| 合阳县|