返回顶部
首页 > 资讯 > 精选 >Java编程如何实现轨迹压缩算法开放窗口
  • 782
分享到

Java编程如何实现轨迹压缩算法开放窗口

java 2023-05-30 20:05:59 782人浏览 薄情痞子
摘要

这篇文章主要介绍了Java编程如何实现轨迹压缩算法开放窗口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。轨迹压缩算法场景描述给定一个GPS数据记录文件,每条记录包含经度和维度

这篇文章主要介绍了Java编程如何实现轨迹压缩算法开放窗口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

轨迹压缩算法

场景描述

给定一个GPS数据记录文件,每条记录包含经度和维度两个坐标字段,根据距离阈值压缩记录,将过滤后的所有记录的经纬度坐标构成一条轨迹

算法描述

这种算法的用处还是相当广泛的。

轨迹压缩算法分为两大类,分别是无损压缩和有损压缩,无损压缩算法主要包括哈夫曼编码,有损压缩算法又分为批处理方式和在线数据压缩方式,其中批处理方式又包括DP(Douglas-Peucker)算法、TD-TR(Top-Down Time-Ratio)算法和Bellman算法,在线数据压缩方式又包括滑动窗口、开放窗口、基于安全区域的方法等。

大家也可参考这篇文章:Java编程实现轨迹压缩之Douglas-Peucker算法详细代码

代码实现

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.logFile 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;}public static ArrayList<enpoint> openWindowTra(ArrayList<enpoint> sourceList,double maxDis){ArrayList<enpoint> targetList = new ArrayList<enpoint>();//定义初始点位置 最开始初始点位置为0 int startPoint = 0;//定义浮动点位置 最开始初始点位置2int floatPoint = 2;//定义当前轨迹点位置 最开始初始点位置为1int 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;}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;}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;//点IDpublic 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编程如何实现轨迹压缩算法开放窗口”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java编程如何实现轨迹压缩算法开放窗口

本文链接: https://lsjlt.com/news/220859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java编程如何实现轨迹压缩算法开放窗口
    这篇文章主要介绍了Java编程如何实现轨迹压缩算法开放窗口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。轨迹压缩算法场景描述给定一个GPS数据记录文件,每条记录包含经度和维度...
    99+
    2023-05-30
    java
  • Java编程实现轨迹压缩之Douglas-Peucker算法详细代码
    第一部分 问题描述1 具体任务  本次作业任务是轨迹压缩,给定一个GPS数据记录文件,每条记录包含经度和维度两个坐标字段,所有记录的经纬度坐标构成一条轨迹,要求采用合适的压缩算法,使得压缩后轨迹的距离误差小于30m。2 程序输入  本程序输...
    99+
    2023-05-30
    java 轨迹压缩 douglas-peucker
  • Pyqt5如何实现窗口缩放,控件在窗口内自动伸缩的操作
    这篇文章给大家分享的是有关Pyqt5如何实现窗口缩放,控件在窗口内自动伸缩的操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Qtdesigner中新建一个主界面如下所示:ctrl+R 预览从预览图中可以看出这...
    99+
    2023-06-08
  • Java 编程中的算法:打包接口如何实现?
    打包接口是Java编程中常见的问题。打包接口是指将多个接口打包成一个新的接口,以便于对外提供更加清晰简洁的接口。在Java编程中,打包接口的实现需要使用到一些常见的算法。本文将介绍如何实现打包接口的算法,并提供一些实用的代码示例。 一、打...
    99+
    2023-10-29
    编程算法 打包 接口
  • Java编程如何实现A*算法
    这篇文章主要介绍了Java编程如何实现A*算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例代码结构:% % % % %&nb...
    99+
    2023-05-30
    java
  • Python 编程算法:如何实现实时接口?
    在计算机科学中,接口是指两个软件系统之间的通信方式。实时接口是指在实时应用程序中使用的接口。Python 是一种高级编程语言,具有许多用于编写实时应用程序的算法。在这篇文章中,我们将探讨如何使用 Python 编写实时接口。 实时接口的...
    99+
    2023-10-02
    编程算法 接口 实时
  • Java接口编程算法:如何在Linux上实现最佳实践?
    Java是一种广泛使用的编程语言,它的强大之处在于它的跨平台性和易学性。Java中的接口是一种重要的编程概念,它允许开发者定义一组方法,这些方法可以被其他类实现,并且可以使代码更加灵活和可维护。本文将介绍如何在Linux上实现Java接口...
    99+
    2023-08-21
    接口 编程算法 linux
  • java如何实现日历窗口小程序
    今天小编给大家分享一下java如何实现日历窗口小程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。标签:java基础功能:按...
    99+
    2023-07-02
  • 如何在 Java 编程中打包接口并实现高效算法?
    Java 是一种非常流行的编程语言,广泛应用于各种领域。在 Java 编程中,打包接口和实现高效算法是非常重要的技能。接下来,我们将介绍如何在 Java 编程中打包接口并实现高效算法。 一、打包接口 在 Java 编程中,打包接口是非常重要...
    99+
    2023-10-29
    编程算法 打包 接口
  • 编程算法:如何使用Java和Bash实现?
    随着计算机技术的不断发展,编程算法成为了计算机领域中的一项重要技能。在现代计算机领域中,编程算法已经成为了一个基础技能,因此熟练掌握编程算法对于计算机从业者来说是非常重要的。 本文将介绍如何使用Java和Bash实现编程算法。Java是一...
    99+
    2023-06-19
    教程 编程算法 bash
  • Java 和 Git 同步编程算法:如何实现?
    在当今软件开发行业中,Java 和 Git 是两个非常重要的工具。Java 是一种高度可移植的编程语言,广泛应用于各种不同的应用程序和系统。Git 是一个强大的版本控制工具,它能够跟踪代码的变化,并帮助开发人员协同工作。在本文中,我们将探...
    99+
    2023-09-25
    git 同步 编程算法
  • 如何用Java编程实现复杂的算法?
    Java是一种广泛使用的编程语言,具有可移植性和强大的功能。它非常适合用于实现各种复杂算法。在本文中,我们将介绍如何使用Java编写复杂的算法。 一、了解算法 在开始编写复杂的算法之前,我们需要先了解算法的概念。算法是一组逐步执行的操作,用...
    99+
    2023-10-27
    编程算法 javascript shell
  • Django接口和Go编程:如何实现高级算法?
    Django和Go是两种常用的编程语言,都被广泛应用于Web开发和后端服务。但是,如何在这两种语言中实现高级算法呢?本文将为您介绍如何使用Django和Go编写高级算法,并提供代码示例。 Django接口实现高级算法 Django是一...
    99+
    2023-08-18
    编程算法 接口 django
  • 从零开始:如何在Java中实现二维码编程算法?
    二维码是一种二维条码,可以存储大量的数据信息。在现代社会中,二维码已经成为了商业、社交、娱乐等领域的重要工具。本文将介绍如何使用Java编程语言实现二维码编程算法。 一、二维码的基本概念 二维码是由黑白相间的小正方形组成的图案,可以编码大...
    99+
    2023-10-21
    npm 二维码 编程算法
  • 如何通过Java编程实现高效的算法计算?
    Java是一种高效的编程语言,它可以帮助我们实现高效的算法计算。在本文中,我们将讨论如何通过Java编程实现高效的算法计算。我们将从算法的基础知识开始,然后介绍Java编程语言的一些核心概念,最后展示一些演示代码。 算法是解决问题的方法。在...
    99+
    2023-09-25
    编程算法 laravel 对象
  • 如何使用Java API实现高效编程算法?
    Java是一种广泛使用的编程语言,有着强大的API支持。使用Java API可以帮助我们快速、高效地实现各种编程算法。在本文中,我们将介绍如何使用Java API实现高效编程算法,并提供一些演示代码。 一、使用Java API实现排序算法...
    99+
    2023-10-25
    api 编程算法 编程算法
  • Java 编程必备技能:如何优化算法和接口打包实现?
    Java 是一种广泛使用的编程语言,其强大的功能和可靠性使其成为许多企业和开发人员的首选。在 Java 编程中,优化算法和接口打包实现是必不可少的技能。本文将介绍如何优化算法和接口打包实现,以提高代码质量和效率。 一、算法优化 算法优化是...
    99+
    2023-10-29
    编程算法 打包 接口
  • Java接口编程算法的优劣如何在Linux上体现?
    Java接口编程是Java语言的核心之一。Java接口是一种抽象类型,用于规范类的行为。Java接口可以用于定义方法的签名,但是不能定义方法的实现。Java接口编程可以使代码更具可读性、可维护性和可扩展性。而在Linux上,Java接口编...
    99+
    2023-08-21
    接口 编程算法 linux
  • 编程算法:如何在 Java 中实现高效的异步编程?
    在现代计算机应用程序中,异步编程已经成为了很重要的编程模式,特别是在处理大量数据和I/O操作时。Java语言在异步编程方面也提供了很多解决方案,其中最流行的是Java的异步编程模型,也就是Java NIO框架。 Java NIO框架提供了...
    99+
    2023-10-15
    面试 异步编程 编程算法
  • Java教程:如何使用Bash编程实现高效算法?
    Bash是一种基于文本的Shell程序设计语言,它可以方便地调用Linux系统命令,并且可以写出高效的算法。在Java开发中,我们可以使用Bash编写一些高效的脚本,以提高我们的开发效率。本文将介绍如何使用Bash编写高效的算法,帮助Ja...
    99+
    2023-06-19
    教程 编程算法 bash
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作