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

news2024/11/22 16:02:41

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.coloradmin.cn/o/1877363.html

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

相关文章

Linux部署Java项目至云服务器

文章目录 1.服务器环境2.发布部署过程2.1 执行SQL脚本2.2 修改代码中数据源的配置2.3 修改配置中的日志级别与日志文件路径2.4 打包Java程序2.5 上传到服务器2.6 后台运行2.7 服务器开放对应的端口2.8 访问验证 1.服务器环境 要将我们的项目部署到云服务器上我们就需要先有一个…

Sentinel解决雪崩问题

我们或多或少都对雪崩问题有点了解,在微服务系统中,各个微服务互相调用,关系错综复杂,如果其中一个微服务挂了或者处理消息的速度大幅下降,需要被处理的消息越积越多,那么影响的不仅仅是本微服务的功能&…

MathType2024最新破解版在哪里可以下载?

在当今科技日益发展的时代,我们每个人都可能遇到需要在电子文档、网页或其他平台中输入复杂数学公式的情况。这时,一个强大且易用的数学公式编辑器就成了我们迫切需要的工具。而MathType,作为一款专业、精准的数学公式编辑器,无疑…

大模型和数据库最新结合进展

写在前面 本文主要内容是上次接受 infoQ 访谈,百度智能云朱洁老师介绍了大模型和 AI 结合相关话题,这次整体再刷新下,给到对这个领域感兴趣的同学。 当前,百度智能云云数据库特惠专场开始!热销规格新用户免费使用&am…

IDEA中导入Maven项目

IDEA中导入Maven项目 方式1:使用Maven面板,快速导入项目 打开IDEA,选择右侧Maven面板,点击 号,选中对应项目的pom.xml文件,双击即可 说明:如果没有Maven面板,选择 View > Appe…

<电力行业> - 《第8课:输电(一)》

1 输电环节的意义 电能的传输,是电力系统整体功能的重要组成环节。发电厂与电力负荷中心通常都位于不同地区。在水力、煤炭等一次能源资源条件适宜的地点建立发电厂,通过输电可以将电能输送到远离发电厂的负荷中心,使电能的开发和利用超越地…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

什么是预主密钥(pre-master secret)?

什么是预主密钥(Pre-Master Secret)? 在SSL/TLS协议中,预主密钥(Pre-Master Secret)是建立安全连接的关键要素之一。它在客户端和服务器之间生成共享密钥的过程中扮演重要角色。本文将详细介绍预主密钥的生…

J018_冒泡排序

一、排序过程 如果要对一个数组进行升序排序: 每个轮次两两数字进行比较,如果前面的数字大于后面的数字,则交换两个数字的位置;如果前面的数字小于或等于后面的数字,则这两个数字位置不变。直到把数组中所有数字比较…

打靶记录——靶机medium_socnet

靶机下载地址 https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 打靶过程 由于靶机和我的Kali都处于同一个网段,所以使用arpscan二次发现技术来识别目标主机的IP地址 arpscan -l除了192.168.174.133,其他IP都是我VMware虚拟机正…

amis源码 更新组件数据域的几种方法

更新组件数据域的几种方法: 默认都是合并数据,非覆盖(指定replace为true的才是覆盖): const comp amisScoped.getComponentById(id);//或者getComponentByName(name) 1.comp.setData(values, replace); //更新多个值values, r…

wget之Win11中安装及使用

wget之Win11中安装及使用 文章目录 wget之Win11中安装及使用1. 下载2. 安装3. 配置环境变量4. 查看及使用1. 查看版本2. 帮助命令3. 基本使用 1. 下载 下载地址:https://eternallybored.org/misc/wget 选择对应的版本进行下载即可 2. 安装 将下载后的wget-1.21.4-w…

Rpc服务的提供方(Rpcprovider)的调用流程

首先,服务的提供方,会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法, 那么,我们通过protobuf提供的抽象层的service和method,将服务对象和它所对应的服务方法记录在map表中, 当它启动以后&#xff…

Java--常用类APl(复习总结)

前言: Java是一种强大而灵活的编程语言,具有广泛的应用范围,从桌面应用程序到企业级应用程序都能够使用Java进行开发。在Java的编程过程中,使用标准类库是非常重要的,因为标准类库提供了丰富的类和API,可以简化开发过…

电影APP——项目建议书参考

项目建议书 1. 前言1.1 实现目标1.2 项目应用范围1.3 项目名称 2. 概述2.1 国内外发展综述2.2 拟解决的问题2.2.1 业务问题2.2.2 技术需求 2.3 系统环境需求2.3.1 网络需求描述2.3.2 业务需求描述2.3.3 运行环境/用户描述 2.4 功能建议2.4.1应用场景描述2.4.2功能划分/功能模型…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示…

windographer数据操作教程

目录 通道设置将4个windographer文件拼到一起映射关系通道设置 先把风速列选中,将Type改为 wind speed 无需额外操作,确认一下即可

Linux(Ubuntu20.04)系统中安装deb软件包错误(依赖关系问题-仍未被配置)解决的办法

在Ubuntu16.04下采用如下dpkg命令安装deb软件安装包时: sudo dpkg -i XXXX.deb 发生安装失败,返回信息为"正处理时有错误发生",并且在安装过程中出现"依赖关系问题-仍未被配置"的提示&#xff0…

【机器学习300问】136、C4.5虽然改善了ID3决策树算法的部分缺点,但还是有不足,请问还有更好的算法吗?CART算法构建决策树

一、C4.5算法仍存在的不足 (1)计算效率不高 C4.5使用的信息增益率计算涉及熵的对数计算,特别是当属性值数量大时,计算成本较高。 (2)处理连续数值属性不够高效 ID3算法只能处理离散属性,需要预…

一个CentOS“倒下去”,更多开源创新服务器操作系统站起来

“一切过往,皆为序章。” ——出自莎士比亚的戏剧《暴风雨》 CentOS 7将在2024年6月30日正式停更,这在某种程度上宣告了国外开源操作系统一个时代的结束。那么,这是不是必然意味着,一个属于我国自主创新的开源操作…