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

article/2025/8/15 3:04:24

GeoTools——JTS的相关介绍(一)

JTS拓扑套件是GeoTools用于提供Geometry数据结构的实现,Geometry主要是指几何形状。

想要使用geoTools——JTS相关的操作可以导入以下的依赖<properties><geotools.version>17.1</geotools.version></properties><dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-geometry</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-jts-wrapper</artifactId><version>${geotools.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.geotools/gt-main --><dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-opengis</artifactId><version>${geotools.version}</version></dependency>

创建一个点

使用的是JTS GeometryFactory来创建一个全局的JTS :

   GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();Coordinate coord = new Coordinate(1, 1);Point point = geometryFactory.createPoint(coord);

WKT规范定义的一种简单文本格式:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();WKTReader reader = new WKTReader(geometryFactory);Point point = (Point) reader.read("POINT (1 1)");

表示许多点(可能是构成围栏的围栏柱),可以使用MultiPoint。

创建一个LineString

在这里插入图片描述

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();Coordinate[] coords  =new Coordinate[] {new Coordinate(0, 2), new Coordinate(2, 0), new Coordinate(8, 6) };LineString line = geometryFactory.createLineString(coordinates);

LineString从WKT读取 :

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();WKTReader reader = new WKTReader( geometryFactory );
LineString line = (LineString) reader.read("LINESTRING(0 2, 2 0, 8 6)");

可以使用MultiLineString表示多条线。

在这里插入图片描述

以下内容使多边形成为正方形:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();Coordinate[] coords  =new Coordinate[] {new Coordinate(4, 0), new Coordinate(2, 2),new Coordinate(4, 4), new Coordinate(6, 2), new Coordinate(4, 0) };LinearRing ring = geometryFactory.createLinearRing( coords );
LinearRing holes[] = null; // use LinearRing[] to represent holes
Polygon polygon = geometryFactory.createPolygon(ring, holes );

从WKT读取多边形:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );WKTReader reader = new WKTReader( geometryFactory );
Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");

您也可以在其中创建一个多边形孔。并再次使用MultiPolygon表示由不同形状组成的单个几何。

创建CircularString

要创建一个CircularString(或一个CircularRing),请使用GeoTools CurvedGeometryFactory。设置时,CurvedGeometryFactory将在线性化过程中使用提供的公差:

 GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();CurvedGeometryFactory curvedFactory =new CurvedGeometryFactory(geometryFactory, Double.MAX_VALUE);CoordinateSequence coords =PackedCoordinateSequenceFactory.DOUBLE_FACTORY.create(new double[] {10, 14, 6, 10, 14, 10}, 2);CircularString arc = (CircularString) curvedFactory.createCurvedGeometry(coords);

圆弧定义在通过点6,10的坐标10,14和14、10之间。该示例使用PackedCoordinateSequence允许直接使用双精度数组的数组。曲线支持仅限于2D坐标。CircularLineString在这种情况下返回 ,CircularRing如果从闭合环提供两个或更多曲线,则会产生闭环。

从WKT读取圆弧:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();CurvedGeometryFactory curvedfactory = new CurvedGeometryFactory(Double.MAX_VALUE);WKTReader2 reader = new WKTReader2(curvedfactory);CircularString arc = (CircularString) reader.read("CIRCULARSTRING(10 14,6 10,14 10)");

一个CompoundCurve(或封闭的CompoundRing)由CircularString和/或普通LineString成分组成的混合。

自定义曲线

JTS拓扑套件没有任何表示“曲线”或“圆”的结构-GeoTools将该扩展作为扩展。JTS使用的数学严格限于由直线(即线性)组成的几何。

GeoTools曲线的实现依赖于使用控制点来定义曲线,并在可能的最后时刻将其转换为直线。

曲线也可以通过一点数学来手工生成。

创建圆:

private static Geometry createCircle(double x, double y, final double RADIUS) {GeometricShapeFactory shapeFactory = new GeometricShapeFactory();shapeFactory.setNumPoints(32);shapeFactory.setCentre(new Coordinate(x, y));shapeFactory.setSize(RADIUS * 2);return shapeFactory.createCircle();
}

即使GeometricShapeFactoryJTS提供了开箱即用的功能,没有什么花哨的代码。它在一个圆中创建一系列坐标。

另一种方法是使用Java的便捷Shape类之一创建曲线或形状对象,然后从该对象提取坐标以创建几何。

没有数学的弧:

private static Geometry createBezierCurve(Coordinate start,Coordinate end,Coordinate ctrlPoint1,Coordinate ctrlPoint2double smooth) {Shape curve = new CubicCurve2D.Double(start.x, start.y,ctrlPoint1.x, ctrlPoint1.y,ctrlPoint2.x, ctrlPoint2.y,end.x, end.y);//平滑参数的值决定线条的紧密程度//点之间的线段近似光滑曲线//(参见javadocs了解形状。Shape.getPathIterator)PathIterator iter = curve.getPathIterator(null, smooth);// a length 6 array is required for the iteratordouble[] iterBuf = new double[6];List<Coordinate> coords = new ArrayList<Coordinate>();while (!iter.isDone()) {iter.currentSegment(iterBuf);coords.add(new Coordinate(buf[0], buf[1]);iter.next();}GeometryFactory gf = new GeometryFactory();return gf.createLineString(coords.toArray(new Coordinate[coords.size()]));
}

这是以此方式生成的一些随机定向和成形的曲线的示例……

在这里插入图片描述

有时您需要生成一条平滑曲线,以确保可以通过一组指定的点。这里尝试过的真实方法是使用样条函数。这将生成一组多项式(三次)曲线,每个曲线都拟合一部分数据,并平滑地与其相邻曲线连接。

花键:

public Geometry splineInterpolatePoints(double[] xPoints, double[] yPoints) {/** 首先,使用。创建一个由段组成的LineString* 输入点作为顶点。*/final int N = xPoints.length;Coordinate[] coords = new Coordinate[N];for (int i = 0; i < N; i++) {coords[i] = new Coordinate(xPoints[i], yPoints[i]);}GeometryFactory gf = new GeometryFactory();LineString line = gf.createLineString(coords);/**现在我们使用GeoTools JTS实用程序类来平滑*线。返回的几何图形将拥有所有的顶点*的输入行加上跟踪样条的额外顶点*曲线。第二个参数是“fit”参数,它*可以在0(松散匹配)到1(最紧密匹配)的范围内。*/return JTS.smooth(line, 0.0);
}

这是一个正在使用的示例:
在这里插入图片描述
平滑多边形的示例:

WKTReader reader = new WKTReader();
Geometry tShape = reader.read(
"POLYGON((10 0, 10 20, 0 20, 0 30, 30 30, 30 20, 20 20, 20 0, 10 0))");Geometry tLoose = JTS.smooth(tShape, 0.0);
Geometry tTighter = JTS.smooth(tShape, 0.75);

这是结果图像:

在这里插入图片描述


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

相关文章

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;最好是找到一个封…

JTopo添加动态连线

效果如下 先在 JTopo 的 link 原型上定义一个方法 window.requestAnimationFrame window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame JTopo.Link.prototype.drawanimepic functi…

JTopo + Vue 实现自定义拖拽流程图

JTopo Vue 实现自定义拖拽流程图 进入体验效果 进入github 市场上做流程图的插件比较多&#xff0c;这里介绍一种基于canvas编写的js插件&#xff0c;结合vue框架做出精美的流程图 首先搭建vue框架&#xff0c;这里就不做介绍&#xff0c;由于jtopo官方demo里用到了jquery&am…

jtopo连线绘制脉冲动画效果

随着需求的日益精细化&#xff0c;人们越来越多的关注到了画面的美观&#xff0c;单纯的节点间连线已经不满足人们的审美观念了&#xff0c;那么能不能让节点间的连线动起来呢&#xff1f;答案是可以的&#xff0c;老规矩&#xff0c;先上图&#xff0c;再说怎么实现。 同样&am…

jTopo入门 简单实现拓扑图

最近项目中需要绘制拓扑图&#xff0c;于是研究了下绘制拓扑图的组件&#xff0c;jtopo是一款比较简单易上手的开发工具包&#xff0c;分享给大家。 jtopo特点 1、完全基于HTML5 Canvas开发&#xff0c;API平易近人、几乎简单到了极致。 2、不依赖任何其他库、执行仅需一个Ca…

jtopo 实现一键布局

最近很忙、也很懒&#xff0c;一堆烦心事&#xff0c;jtopo后面不准备再深究了&#xff0c;本身东西也不多&#xff0c;做出的新功能&#xff0c;新特效也都写到博客中来了&#xff0c;今天给大家分享最近研究的一个新技能——jtopo一键布局&#xff0c;写给大家、也写给自己。…

jtopo简单实例

原贴地址 http://cn-arthurs.iteye.com/blog/2009345 说明: jtopo是一个基于canvas的js拓扑图形组件.比canvasexpress容易多了. 可以方便地加点,加连线,加鼠标事件,拖曳. 号称跨浏览器,不过实际上不支持ie678,加上excanvas.js也没用,除非像canvasexpress那样使用chrome插件. …

Vue — jTopo

近期在Vue项目中使用jTopo来制作集群节点拓扑图&#xff0c;官网http://www.jtopo.com/ 使用vue-cli搭建的模块化开发项目&#xff0c;使用第三方库最好的方式就是通过npm install xxx安装&#xff0c;然后在项目 里import xxx来使用&#xff1b;但是在JTopo官网上并没有发现有…

【Vue引入JTopo及所遇到的问题】

Vue引入JTopo及所遇到的问题 前言一、方案选型二、使用步骤三、总结 前言 项目过程中总是会遇到稀奇古怪的需求&#xff0c;这不&#xff0c;咱老大又让我画一个系统拓扑图放在首页&#xff0c;要求部分数据需从后端获取&#xff0c;动态展示在页面上。对于一个后端人猿来说&a…

Vue+JTopo(一)

1.下载js jtopo 更新下载 (不知道为什么网站被封禁了……在这提供下我现在用的 jtopo-1.4.4_trial-esm-min.js) 链接&#xff1a;https://pan.baidu.com/s/18V1HKwAuxzWM19RD4axGOg 提取码&#xff1a;0304 2.引用 文件放在public/js文件夹下&#xff0c;在index.hml内引用。…

jTopo(一)

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

windows10下安装MSYS2+MinGW64

1.下载msys2&#xff0c;官方地址&#xff1a;http://www.msys2.org/&#xff0c;这里选择64位的安装器 2.安装完成之后&#xff0c;先别启动msys2&#xff0c;在 安装根目录/etc/pacman.d/ 下找到mirrorlist.mingw32、mirrorlist.mingw64和mirrorlist.msys并进行修改。 mirr…