Geotools系列说明之JTS空间几何介绍

JTS介绍

The JTS Topology Suite is a Java API that implements a core set of spatial data operations
using an explicit precision model and robust geometric algorithms. It provides a complete
model for specifying 2-D linear Geometry. Many common operations in computational
geometry and spatial data processing are exposed in a clear, consistent and integrated API.
JTS is intended to be used in the development of applications that support the validation,
cleaning, integration and querying of spatial datasets.

This document is intended for developers who would like to use JTS to accomplish their
spatial data processing requirements. It describes common uses of the JTS API and gives
code examples
官方说它是一个java的api用来计算几何空间的操作工具
源码地址文档在doc目录下
在这里插入图片描述

JTS在Geotools中的使用

下载Geotoos的源码我们可以看到GeoTools使用了JTS的类
在这里插入图片描述
即Geotools依赖JTS的包
在这里插入图片描述
根据上述依赖关系可以知道Geomerty是所有图形的父类

  1. 创建Point点
GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(transform(new Coordinate(113.549006,22.388645), 4490, 3857)); //可以将4490坐标系进行转换成3857
  1. 创建线段
  /*** 生成线段* @param wkt* @return* @throws ParseException*/public static LineString createLineString(String wkt) throws ParseException {WKTReader reader = new WKTReader( geometryFactory );return (LineString) reader.read(wkt);}/*** 生成线段* @param coords* @return*/public static LineString createLineString(Coordinate[] coords) {GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(),4326);return geometryFactory.createLineString(coords);}
  1. 创建多边形Polygon
   /*** 根据左上和右下创建矩形* @param leftBottom* @param rightTop* @return*/public static Polygon createRectangle(Coordinate leftBottom, Coordinate rightTop){GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();// 创建矩形的边Coordinate[] coordinates = new Coordinate[]{leftBottom,new Coordinate(rightTop.x, leftBottom.y), // 左上角rightTop,new Coordinate(leftBottom.x, rightTop.y), // 右下角leftBottom // 闭合};//Polygon polygon = geometryFactory.createPolygon(polygonCoordinates);// 创建Polygon// 输出Polygon的WKT表示return geometryFactory.createPolygon(coordinates);}

详见GeometryFactory类,这个类就是工厂类创建在这里插入图片描述
创建完成图形后就可以使用以上方法判断多变的情况

disjoint(), //不相交 几何形状的点不相交
touches(), // 接触 几何形状接触
equals()// 几何形状拓扑上相等。
intersects(),//相交		
crosses(),//交叉
within(),//内涵
contains(),//包含
overlaps()//重叠
示例

判断点在不在多边形内

    /*** 判断是否在多边形区域内* @param latitude 经度* @param longitude 纬度* @param polygonCoordinates 多边形点集合 多边形要闭合才可以* @return*/public static boolean isPointInPolygon(double longitude, double latitude, Coordinate[] polygonCoordinates) {GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));Polygon polygon = geometryFactory.createPolygon(polygonCoordinates);return polygon.touches(point) || polygon.contains(point);}

判断点在不在线段上
这里要注意是通过把经纬度变成一个区域和线段进行相交等其他判断

    /*** 判断点在不在线段上** @param longitude* @param latitude* @param lineString* @return*/public static boolean isSegmentInPolygon(double longitude, double latitude, LineString lineString) {GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(transform(new Coordinate(longitude,latitude),4326,3857));LineString targetLinString = transform(lineString.toText(), 4326, 3857);double distance = targetLinString.distance(point);log.debug("点到直线的距离是:{}",distance);//a polygonal geometry representing the buffer region (which may be empty)Geometry buffer = point.buffer( ConstantUtil.ROUTE_LIMIT );//        return targetLinString.isWithinDistance(point,ConstantUtil.ROUTE_LIMIT);
//        return true;return targetLinString.touches(buffer)||targetLinString.crosses(buffer)||targetLinString.intersects(buffer);}

JTS中的距离计算

在进行距离计算的时候我们首先要把经纬度进行转换转换方案可参考上一篇博客内容,当完成转换后我们就可以通过JTS提供的api进行距离的计算,如下:

  GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(transform(new Coordinate(113.549006,22.388645), 4490, 3857));System.out.println(point);Point point1 = geometryFactory.createPoint(transform(new Coordinate(113.541006, 22.388645),4490,3857));
//        System.out.println(transform(point1.toText(), 4326, 4490).toString());System.out.println(point1.distance(point));

点到线、点到点、点到面、面到到面都可以通过这个示例进行计算。
在这里插入图片描述
观察JTS的源码可以知道只要继承了Geometry就可以使用这些方法了。

三维中的几何距离计算

有时候我们需要计算三维的距离,但是目前的Geometry方法提供了二维的计算,通过jts的源码我们可以找到JTS已经支持了三维的空间距离计算如下图:
在这里插入图片描述
JTS提供了三维图像的计算示例如下:

 GeometryFactory geometryFactory = new GeometryFactory();Point point = geometryFactory.createPoint(transform(new Coordinate(longitude,latitude,height),4326,3857));LineString targetLinString = transform(genderLineStrWkt(lineString.getCoordinates()), 4326, 3857);double distance = targetLinString.distance(point);log.debug("点到直线的距离是:{}",distance);
//        Geometry buffer = point.buffer( ConstantUtil.ROUTE_LIMIT );
//        LinearRing 可以是任意的多边形double distance1 = Distance3DOp.distance(point, targetLinString);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt的入门

Qt的入门 1.Qt的配置2.介绍Qt的使用2.1 Qt 5.14.22.2 Linguist 5.14.22.3Designer 5.14.22.4 Assistant 5.14.22.5 Qt Creator 4.11.1 3.创建第一个项目3.1点击文件来新建一个新的文件或项目3.2选择项目路径和名称3.3选择构建工具3.4类信息3.5翻译文件3.6选择编译器3.7项目管理…

在navicat对mysql声明无符号字段

1.无符号设置 在 MySQL 中,我们可以使用 UNSIGNED 属性来设置列的无符号属性,这意味着该列只能存储非负整数值。对于一些需要存储正整数的列,比如年龄、数量等,使用 UNSIGNED 属性可以提高数据存储和查询的效率,并且能…

智能工业网络,需要何种工业以太网交换机作为支撑?

随着工业企业数字化及信息化的进一步深化升级,工业领域相关控制及信息系统的业务类型不断增加、复杂性不断提升,工业控制网络与工业信息网络也呈现融合趋势,具备支持多业务、多协议、多厂商设备和数据的互联互通、共网承载以及高质量传输能力…

【源码+文档+调试讲解】actual self 服装店的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统服装销售信息管理难度大,容错率低&#xff0c…

C# 中 IEnumerable 和 IQueryable 接口之间的区别

在 C# 中,IEnumerable和IQueryable接口都用于查询数据集合,但它们的用途不同,功能也不同。下面是它们之间差异的细分: 1. C# 中的 IEnumerable 接口 在命名空间中定义System.Collections。表示集合中元素的只进式游标。适用于查…

Linux-网络编程

网络编程概述 本文将介绍网络编程中的一些基础知识,包括TCP和UDP的区别、端口号的作用、字节序的概念,以及通过socket编程实现客户端和服务器之间的通信。我们还会展示一些示例代码,帮助理解这些概念的实际应用。 1. TCP/UDP的区别&#xf…

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …

详解相似度计算方法及其应用场景

详解相似度计算方法及其应用场景 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨相似度计算方法及其在实际应用中的场景。 什么是相似度计算…

Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令

注意:tac命令是倒置输出文件内容 #### tac - **作用:倒叙访问文件内容** - 格式:tac 参数 文件名 - **例如:** **tac /etc/passwd** #### more 命令 - 作用:翻页查看文件内容,适合内容较多的文件查看…

ingress代理前后端服务跨域

一、前言 ingress对于前后端服务的代理有不同的方式可以实现,前后端服务可以通过不同的域名实现流量的分流策略,不过这需要解决前后端域名不同产生的跨域问题,也可以通过不同的path实现流量的分流策略,该方式不会产生跨域的问题 …

Apipost接口测试工具的原理及应用详解(二)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为…

debian linux E: 无法定位软件包

原因是国内镜像站全寄了,你设国内源没用!,换成官方的然后懂? sudo vim /etc/apt/sources.list添加debian官方源 deb https://deb.debian.org/debian/ bullseye main contrib non-free deb-src https://deb.debian.org/debian/ bullseye mai…

AI 创业者的探索之路——从 Lester Holt 的访谈中汲取灵感

随着人工智能技术的快速发展,越来越多的创业者开始关注这一领域。在最近的一次采访中,Lester Holt 分别与 OpenAI 的 Sam Altman 和 Airbnb 的 Brian Chesky 进行了深入交流,探讨了 AI 技术的发展、应用以及对个人和社会的影响。本文将总结这次访谈中的关键点,并为 AI 创业…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇11基于stm32的智能水质检测系统 🧿创作不易,拒绝白嫖可私 一、功能介绍 -------------…

昇思MindSpore学习笔记2--快速入门

一、环境准备 安装minspore模块 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.3.0rc1 导入minsporei mport mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.d…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

spring常用方法

1. 读取配置文件信息 方式一: // 获取文件路径 String fileName "application.yaml"; String filePath this.getClass().getClassLoader().getResource(fileName).getPath();BufferedReader bufferedReader new BufferedReader(new FileReader(path)…

《昇思25天学习打卡营第5天 | 网络构建》

《昇思25天学习打卡营第5天 | 网络构建》 目录 《昇思25天学习打卡营第5天 | 网络构建》什么是神经网络模型构建一个用于Mnist数据集分类的神经网络模型定义模型类模型层nn.Flattennn.Densenn.ReLUnn.SequentialCellnn.Softmax 模型参数 想要学习神经网络模型的构建&#xff0c…

Bazel plugin for Visual Studio Code

语法突出显示 Bazel Build Targets 树显示工作区中的构建包/目标BUILD 文件中的 CodeLens 链接可通过单击目标直接启动构建或测试Buildifier 集成以检查和格式化您的 Bazel 文件(需要安装 Buildifier)tasks.json 的 Bazel Task 定义在构建期间调试 .bzl…

C++:静态断言内存对齐

静态断言 C中的断言assert (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (2)C的assert是运行时检测发现错误,而不是编译时 (3)C在编译时错误用#error来输出C静态断言 (1)C引入static_assert(表达式, “提示字符串”)来实现编译时的静…