java jts获取线上任意一点到起点的距离
java jts获取线上任意一点到起点的距离
近期项目要求计算某段公路上一辆车的运行轨迹,通过路上的设备实时获取车辆的经纬度信息并发送到后台接收。
抽象出来就是获取线上任意一点到起点的距离,按照一定每秒一次的频率去计算就获取该点的运动轨迹了。
主要通过使用jts的工具类来计算。
<dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version>
</dependency>
jts使用样例
jts官方API文档
期间需要将经纬度转换成平面坐标。这里使用墨卡托进行坐标转换。
具体参考了如下文章,本文就不再引用了直接使用其工具类。
墨卡托经纬度转换平面坐标
正文代码如下:
@Data
@NoArgsConstructor
public class ExtLine {private String wkt;//原始的线的wkt信息private JSONObject geojson;private Coordinate[] coordinates;//组成线的每个端点的信息(经纬度已转换成平面坐标)private LineString line;//经过墨卡托转换后的线的对象private Double[] distances;//保存每个节点距离起点的距离
}
/*** @param wkt 原始线的wkt信息 需要经过墨卡托转换* @return ExtLine* 通过wkt创建ExtLine 该类中包含了各个点位的距离起点信息* */public static ExtLine createExtLine(String wkt) throws ParseException {WKTReader reader = new WKTReader();LineString lineString = (LineString) reader.read(wkt);ExtLine extLine = new ExtLine();extLine.setWkt(wkt);Coordinate[] row = lineString.getCoordinates();Coordinate[] result = new Coordinate[row.length];Double[] distance = new Double[row.length];for (int i = 0; i < row.length; i++) {double lng = row[i].x;double lat = row[i].y;double rate = Math.cos(Math.toRadians(lat));//墨卡托转成平面坐标计算距离时会拉伸长度使得结果偏大,需要对结果乘以当前纬度的cos值Map<String, Double> tmp = new HashMap<>();tmp = CoordConverter.convertLL2MC(lng, lat);//经过墨卡托转换Coordinate coordinate = new Coordinate(tmp.get("x"), tmp.get("y"));result[i] = coordinate;if (i == 0) {//起点位置distance[0] = 0.0D;} else {//计算并保存每个节点距离起点的长度LineString tempLine = geometryFactory.createLineString(Arrays.copyOf(result,i+1));distance[i] = tempLine.getLength() * rate;}}extLine.setDistances(distance);extLine.setCoordinates(result);extLine.setLine(geometryFactory.createLineString(result));System.out.println(distance[row.length-1]);return extLine;}/*** @param extLine 将上一步的计算好距离的信息对象传入* @param wkt 某点的wkt信息* @return double 返回某条线上的起点到某点的距离* */public static double getDistance(ExtLine extLine,String wkt) throws ParseException {WKTReader reader = new WKTReader();Point point = (Point) reader.read(wkt);//获取某点的信息(不一定要在线上)Coordinate coordinate = point.getCoordinate();double lng = coordinate.x;double lat = coordinate.y;Map<String,Double> map = CoordConverter.convertLL2MC(lng,lat);//将经纬度转换成平面坐标Coordinate transCoordinate = new Coordinate(map.get("x"),map.get("y"));LineString lineString = extLine.getLine();LocationIndexedLine indexedLine = new LocationIndexedLine(lineString);LinearLocation linearLocation = indexedLine.indexOf(transCoordinate);int index = linearLocation.getSegmentIndex();//获取某点距离线上最近的节点的indexCoordinate[] coordinates = extLine.getCoordinates();Coordinate lastPoint = coordinates[index];System.out.println(index);LineString temp = geometryFactory.createLineString(new Coordinate[]{lastPoint,transCoordinate});//计算线上距离某点最近的点和某点的距离 double distance = temp.getLength()+extLine.getDistances()[index];//两者相加即所求距离return distance;}
代码的图片说明如下:
线由节点1,2,3,4,5组成,需要计算点6到起点的距离(非计算点1和点6的直线距离 这样误差太大了) 需要计算点1-4的距离 这个步骤在createExtLine时就完成了 后续只需传入ExtLine 和点6的wkt 计算点4和点6的距离 d1 最后把点1-4的距离d2 return d1+d2即可。
如何计算点6距离线上某个节点最近通过linearLocation.getSegmentIndex();即可得到最近的前一个节点。
第一次写博客感觉写的不是很清楚,希望对这方面有需求的朋友有所帮助吧。
java jts获取线上任意一点到起点的距离相关推荐
- lisp 任意点 曲线距离_lisp程序能求多段线上任意一点到其中一个端点的距离,,每次要量桩号很烦...哪位大侠给个..谢谢了...........
;;;可导出桩号的代码 (defun C:GM (/ cur pt fi mile) ;;自定义错误处理函数 (defun myerror (s) (if (and (/= s "函数被取消 ...
- 获取图片上任意一点的颜色值
点击屏幕上任意一点,获取点击处的颜色值(RGB),还可以将十进制颜色值转化为十六进制颜色值显示,下面是个程序的样例: package com.junto.text;import android.app ...
- 鲁班学院-java架构师线上培训机构哪家好
2020年的开年对于我们来说打击是很大的,但是对于中华儿女的我们来说在面对苦难的时候都是众志成城的度过难关的.面对这些的武汉疫情,我们的中国儿女也是跟随着国家的步伐来抗"疫情"在疫 ...
- 如何用php获取网页表格,PHP获取网页上任意表格中内容的通用程序的制作
在工作中,经常需要对网页上的表格内容进行处理,但是,由于表格内容制作过程中的随意性,跨行跨列经常发生,所以我作了这几个函数,以获取表格的内容,程序中重要的地方已作了注解,所以在此不再重复说明,经过测试 ...
- 基于Java毕业设计政府采购线上招投标平台源码+系统+mysql+lw文档+部署软件
基于Java毕业设计政府采购线上招投标平台源码+系统+mysql+lw文档+部署软件 基于Java毕业设计政府采购线上招投标平台源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B ...
- java计算机毕业设计线上教育教学系统源码+数据库+lw文档+系统+部署
java计算机毕业设计线上教育教学系统源码+数据库+lw文档+系统+部署 java计算机毕业设计线上教育教学系统源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...
- java计算机毕业设计线上文具销售系统源程序+mysql+系统+lw文档+远程调试
java计算机毕业设计线上文具销售系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计线上文具销售系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构:B/S ...
- Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql)
Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webst ...
- java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库
java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...
最新文章
- 正确的WordPress文件权限[关闭]
- C++读写EXCEL文件方式比较 .
- Octave(open source版的matlab)介绍Octave online的使用
- Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)
- IT项目管理总结:第八章 项目质量管理
- Exchange2007 申请安装证书
- Shell记录-Shell命令(其他)
- Mina、Netty、Twisted一起学(五):整合protobuf
- 利用DEDE正则批量查找替换数据库的自定义内容
- java字符流输出流_JAVA语言之IO流字符串输入输出流
- 解决springboot工程创建是连接失败问题
- 给WP7初学者:《WP7 Dev Quick Start系列视频》
- 数据结构C语言版 学习整理
- 智能硬件无线通信协议(二)
- 在mini2440上面搞定CC2500物理层驱动
- ES集群health为yellow解决办法
- SpyNote的APK无法运行的问题
- 一张A4纸打印多张财务凭证(分栏报表)
- Android 短视频 SDK 转场特效的音视频同步分析
- bzoj3786 星际探索 splay dfs序