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

article/2025/8/15 2:59:12

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轴正方向的夹角:计算p0到p1的弧度 Angle.angle(p0,p1)已x轴为参考向量,通过p0到p1向量的角度值(返回弧度)。

atan2(y,x)说明:
atan2(y,x) 其中y代表已知点的y坐标,同理x,返回值是此点与远点连线与x轴正方向的夹角,返回以弧度表示的y/x 的反正切。y和x的值的符号决定了正确的象限。也可以理解为计算复数x+yi的辐角,计算时atan2比atan 稳定。可以处理四个象限的任意情况,它的值域相应的也就是(-π,π)

atan2(y,x)是四象限反正切,它的取值不仅取决于正切值y/x ,还取决于点(x,y) 落入哪个象限:

当点(x,y) 落入第一象限时,atan2(y,x) 的范围是(0,π/2);

当点(x,y) 落入第二象限时,atan2(y,x) 的范围是(π/2,π);

当点(x,y) 落入第三象限时,atan2(y,x) 的范围是(-π,-π/2);

当点(x,y) 落入第四象限时,atan2(y,x) 的范围是(-π/2,0)

public static void main(String[] args) {//计算p0到p1的弧度 Angle.angle(p0,p1)已x轴为参考向量,通过p0到p1向量的角度值(返回弧度)Coordinate p0 = new Coordinate(1,1);Coordinate p1 = new Coordinate(2,3);double radiansP0ToP1 = Angle.angle(p0,p1);System.out.println("弧度Angle.angle(p0,p1)="+radiansP0ToP1+";角度Angle.toDegrees(radiansP0ToP1)="+Angle.toDegrees(radiansP0ToP1));//弧度Angle.angle(p0,p1)=1.1071487177940904;角度Angle.toDegrees(radiansP0ToP1)=:63.43494882292201
}

在这里插入图片描述

2.Angle.angle(p1)

返回与x轴正方向的夹角:计算(0,0)到p1的弧度 Angle.angle(p1)已x轴为参考向量,通过(0,0)到p1向量的角度值(返回弧度)。

3.Angle.isAcute(Coordinate p0, Coordinate p1, Coordinate p2)

判断是否是锐角

Coordinate B = new Coordinate(0,2);
Coordinate A = new Coordinate(1,1);
Coordinate C = new Coordinate(1,3);System.out.println("是否是锐角:boolean="+Angle.isAcute(B,A,C));
//是否是锐角:boolean=true

在这里插入图片描述
(图二)

4.Angle.isObtuse(Coordinate p0, Coordinate p1, Coordinate p2)

判断是否是钝角,使用规则同Angle.isAcute

5.Angle.angleBetween(Coordinate tip1, Coordinate tail,Coordinate tip2)

返回两个向量之间无方向的最小夹角(参考图二)

double bac = Angle.angleBetween(B,A,C);
System.out.println("bac夹角Angle.angleBetween(B,A,C)="+bac+";角度Angle.toDegrees(bac)="+Angle.toDegrees(bac));
//bac夹角Angle.angleBetween(B,A,C)=0.7853981633974483;角度Angle.toDegrees(bac)=45.0       

6.Angle.angleBetweenOriented(Coordinate tip1, Coordinate tail,Coordinate tip2)

返回两个向量之间方向的最小夹角(参考图二)

逆时针返回正 BAC, 顺时针返回负

//顺时针 (CW) rotation
double bacOriented = Angle.angleBetweenOriented(B,A,C);
System.out.println("bacOriented顺时针夹角Angle.angleBetweenOriented(B,A,C)="+bacOriented+";顺时针角度Angle.toDegrees(bacOriented)="+Angle.toDegrees(bacOriented));
//bacOriented顺时针夹角Angle.angleBetweenOriented(B,A,C)=-0.7853981633974483;顺时针角度Angle.toDegrees(bacOriented)=-45.0//逆时针(CCW) rotation
double bacOrientedCCW = Angle.angleBetweenOriented(C,A,B);
System.out.println("bacOrientedCCW逆时针夹角Angle.angleBetweenOriented(C,A,B)="+bacOrientedCCW+";逆时针角度Angle.toDegrees(bacOrientedCCW)="+Angle.toDegrees(bacOrientedCCW));
//bacOrientedCCW逆时针夹角Angle.angleBetweenOriented(C,A,B)=0.7853981633974483;逆时针角度Angle.toDegrees(bacOrientedCCW)=45.0     

7.Angle.normalizePositive(double angle)

找对应的顺时针角度,例如 -45°=>315°

//找对应的逆时针角度,例如 -45°=>315°
System.out.println(Angle.toDegrees(Angle.normalizePositive(bacOriented)));
//315.0

8.Angle.normalize(double angle)

找对应的顺时、逆时针位置,0到180(逆时针)之间返回正数,180-360(顺时针)之前返回负数,转换后的值域范围 (-Pi, Pi]

//找对应的位置 0到180(逆时针)之间返回正数,180-360(顺时针)之前返回负数
System.out.println(Angle.toDegrees(Angle.normalize(Angle.toRadians(50))));
//50.0
System.out.println(Angle.toDegrees(Angle.normalize(Angle.toRadians(181))));
//-179.0
System.out.println(Angle.toDegrees(Angle.normalize(Angle.toRadians(369))));
//9.0
System.out.println(Angle.toDegrees(Angle.normalize(Angle.toRadians(-10))));
//-10.0

9.Angle.diff(double ang1, double ang2)

计算角度的差值 ang1 (in [-Pi, Pi] );ang2 (in range [-Pi, Pi] ) return:in range [0, Pi]

 //差值计算
double ang01 = Angle.normalize(Angle.toRadians(10));
double ang02 = Angle.normalize(Angle.toRadians(369)); //0.9999999999999999
// double ang02 = Angle.normalize(Angle.toRadians(-10)); //20
System.out.println(Angle.toDegrees(Angle.diff(ang01,ang02)));

10.Angle.interiorAngle(Coordinate p0, Coordinate p1, Coordinate p2)

计算内角,值域[0, 2Pi]
在这里插入图片描述

//10.Angle.interiorAngle(Coordinate p0, Coordinate p1, Coordinate p2) 计算内角(最小角)
Coordinate Bi = new Coordinate(0,2);
Coordinate Ai = new Coordinate(1,1);
Coordinate Ci = new Coordinate(1,3);
//延Ai-Bi边逆时针转到Ai-CI边的角度值
System.out.println("Angle.interiorAngle(Bi,Ai,Ci)角度="+Angle.toDegrees(Angle.interiorAngle(Bi,Ai,Ci)));
//Angle.interiorAngle(Bi,Ai,Ci)角度=315.0//延Ci-Ai边逆时针转到Ai-BI边的角度值
System.out.println("Angle.interiorAngle(Ci,Ai,Bi)角度="+Angle.toDegrees(Angle.interiorAngle(Ci,Ai,Bi)));
//Angle.interiorAngle(Ci,Ai,Bi)角度=45.0

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

相关文章

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

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

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

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

JTS Geometry关系判断和分析

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

JTS Geometry用例分析

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

JTS 笔记

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

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

jts 文档 下载链接(含jar包、源码、pom) 组件名称中文-文档-下载链接中英对照-文档-下载链接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;最好是找到一个封…

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…