java jts获取线上任意一点到起点的距离

article/2025/8/14 19:11:26

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();即可得到最近的前一个节点。

第一次写博客感觉写的不是很清楚,希望对这方面有需求的朋友有所帮助吧。


http://chatgpt.dhexx.cn/article/mRjjmyCJ.shtml

相关文章

JTS-Geometry 使用说明(五)

org.locationtech.jts.geom.Geometry 使用说明 示例代码库 Geometry 经纬度操作类 Geometry类继承关系 说明 平面、线性几何操作抽象类 提供的相关方法: 1.基础方法&#xff1a; 1.1 getLength:获取长度&#xff0c;线几何返回点与点之间的长度之和&#xff1b;闭合几何返回…

JAVA使用JTS 判断坐标点是否在坐标多边形内部

JAVA使用JTS 判断坐标点是否在坐标多边形内部 思路Geometry之间的关系API及参考博客代码依赖工具类测试类 思路 判断坐标点是否在坐标多边形内部&#xff0c;首先不能直接计算坐标点&#xff0c;是需要字符串坐标点转化为地理空间数据Geometry&#xff0c;然后使用JTS包中提供…

JTS学习笔记

JTS学习笔记 基础的类 Geometry geom对象Coordinate坐标类Point Point对象MultiPoint 基本对象MultiPoint等等GeometryFactory工厂对象PreparedGeometryFactoryPreparedGeometry 几何对象Geometry public abstract class Geometry implements Cloneable, Comparable, Seria…

JTS-Angle GIS几何角度计算使用说明(十八)

org.locationtech.jts.algorithm.Angle 角度计算使用说明 示例代码库 Angle 角度计算 1.Angle.angle(p0,p1) public static double angle(Coordinate p0, Coordinate p1) {double dx p1.x - p0.x;double dy p1.y - p0.y;return Math.atan2(dy, dx); }返回与x轴正方向的夹…

java jts_Java Topology Suite (JTS)与空间数据模型

JTS是Java的处理地理数据的API&#xff0c;它提供以下功能&#xff1a; 实现了OGC关于简单要素SQL查询规范定义的空间数据模型 一个完整的、一致的、基本的二维空间算法的实现&#xff0c;包括二元运算(例如touch和overlap)和空间分析方法(例如intersection和buffer) 一个显示的…

java jts点到面的距离_jts-空间索引

前言&#xff1a; 如果您对JTS这三个词还是没有一个概念&#xff0c;那么推荐您关注一下sinoly的博客。这个我能够找到为数不多的关于jts的中文资料。 http://www.blogjava.net/sinoly/archive/2007/02/09/99042.html 下面这段话就是摘抄自sinoly老兄的博客&#xff1a; ......…

JTS Geometry关系判断和分析

关系判断 Geometry之间的关系有如下几种&#xff1a; 相等(Equals)&#xff1a; 几何形状拓扑上相等。 脱节(Disjoint)&#xff1a; 几何形状没有共有的点。 相交(Intersects)&#xff1a; 几何形状至少有一个共有点&#xff08;区别于脱节&#xff09; 接触(Touches)&a…

JTS Geometry用例分析

微信搜索&#xff1a;“二十同学” 公众号&#xff0c;欢迎关注一条不一样的成长之路 拓扑关系 GeometryTest import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import…

JTS 笔记

简介 JTS由加拿大的VividSolutions公司开发&#xff0c;是一个用Java语言描述的几何拓扑套件&#xff0c;遵循OpenGIS的Simple Feature Specification&#xff0c;封装了2D几何类型和非常多的空间分析操作&#xff0c;而且包含了不少常见的计算几何算法实现。     JTS被广泛…

jts 简介、中文文档、中英对照文档 下载

jts 文档 下载链接&#xff08;含jar包、源码、pom&#xff09; 组件名称中文-文档-下载链接中英对照-文档-下载链接jts-1.13.jarjts-1.13-API文档-中文版.zipjts-1.13-API文档-中英对照版.zip jts 简介 JTS拓扑套件 JTS拓扑套件是一个用于建模和操作二维线性几何的API。它…

GeoTools——JTS的相关介绍和操作

GeoTools——JTS的相关介绍&#xff08;一&#xff09; JTS拓扑套件是GeoTools用于提供Geometry数据结构的实现&#xff0c;Geometry主要是指几何形状。 想要使用geoTools——JTS相关的操作可以导入以下的依赖<properties><geotools.version>17.1</geotools.ver…

java topo: 开源jtopo框架

java web 非本人研究方向&#xff0c;只是作为拓展知识涉猎范围 原文链接&#xff1a;http://www.jtopo.com/index.html jTopo是什么? jTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。 jTopo关注于数据的图形展…

JTopo踩坑记 -- React项目中使用JTopo

JTopo踩坑记 – React项目中使用JTopo JTopo-in-node & JTopo 最近实习公司一个项目需要绘制电网的拓扑图&#xff0c;大致要求的效果如下&#xff1a; 首先想到的是Echarts和d3&#xff0c;因为这个项目其他图表都是使用的Echarts&#xff0c; 但是在Echarts的官方示例…

jtopo的项目实战(七)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家在评论区留言提出&#xff0c;博主基本每天在线&#xff0c;看到都会及时回复的&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&am…

关于vue3.0项目引入jtopo出现的各种问题汇总

jtopo官网demo网址&#xff1a;http://www.jtopo.com/demo.html 最近的项目需要用到jtopo&#xff0c;关于jtopo的引入&#xff0c;之前自己也都尝试过&#xff0c;没想到这次引入会出现这么多问题&#xff0c;所以大概总结一下 1、借用同事以前的经验来引入 npm install jto…

JTopo 框架教程之一:初始JTopo 框架

JTopo 是什么&#xff1f; JTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。jTopo关注于数据的图形展示&#xff0c;它是面向开发人员的&#xff0c;需要进行二次开发。使用jTopo很简单&#xff0c;可以快速创建一…

jtopo的项目实战(一)

前言 初识jtopo是因为项目中需要一个能够动态绘制网络拓扑图的插件&#xff0c;不但能画出基本的网络拓扑结构&#xff0c;还要能够标识出网络设备的类型以及端口设置&#xff0c;甚至是网络连线的流量信息等&#xff0c;基于这个需求查找了很多资料&#xff0c;初步选中了几款…

jtopo的项目实战(二)

话接上回&#xff0c;继续实现jtopo本身不具有的一些功能&#xff0c;有讲的不对的地方&#xff0c;欢迎大家留言提出&#xff0c;我们一起进步&#xff0c;奥利给&#xff0c;还有&#xff0c;码字不易&#xff0c;如果觉得博主写的不错的欢迎打赏哈&#xff01; 2.美化节点之…

vue、jtopo绘制鱼骨图

效果如下图所示&#xff1a; 一、文件目录结构&#xff1a; 二、绘制png的鱼头、鱼尾图片 fish_head.png&#xff1a; fish_tail.png&#xff1a; 三、下载js文件 jquery、jtopo请到官网下载。 四、编写鱼骨图核心文件&#xff1a;MakFishBone.js let MakFishBo…

通过JTopo.js在网页绘制网络拓扑图

项目中遇到要在网页中绘制网络拓扑图的需求&#xff0c;要求节点具备点击、拖拽、缩放等交互功能&#xff0c;并且可以显示/隐藏详细信息&#xff0c;数据是设备实时上报来的。 综上&#xff0c;用画拓扑图的工具画一张固定的图片偷懒显然是不行的&#xff0c;最好是找到一个封…