org.locationtech.jts jts-core 1.16.1
几何关系
相等(equals)
脱节(disjoint)
相交(intersects)
接触(touches)
交叉(crosses)
内含(within)
包含(contains)
覆盖(overlaps)
  1. 相等(equals)
* 判断两个几何图形是否相等 * @throws ParseException public void equals() throws ParseException { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((113.5052490234375 34.397844946449865, 114.03259277343749 34.397844946449865, 114.03259277343749 34.82507742547058, 113.5052490234375 34.82507742547058, 113.5052490234375 34.397844946449865))"; // String wktPolygon2 = "POLYGON ((113.5052490234375 34.397844946449865, 114.03259277343749 34.397844946449865, 114.03259277343749 34.82507742547058, 113.5052490234375 34.82507742547058, 113.5052490234375 34.397844946449865))"; String wktPolygon2 = "POLYGON ((114.345703125 33.8521697014074, 115.257568359375 33.8521697014074, 115.257568359375 34.53371242139564, 114.345703125 34.53371242139564, 114.345703125 33.8521697014074))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.equals(read2));

输出结果为false,当两个图形的坐标完全相同时输出true

图形:
在这里插入图片描述
2. 脱节(disjoint)

* 判断两个几何图形是否不相交 * @throws Exception public void disjoint() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((113.5052490234375 34.397844946449865, 114.03259277343749 34.397844946449865, 114.03259277343749 34.82507742547058, 113.5052490234375 34.82507742547058, 113.5052490234375 34.397844946449865))"; String wktPolygon2 = "POLYGON ((114.345703125 33.8521697014074, 115.257568359375 33.8521697014074, 115.257568359375 34.53371242139564, 114.345703125 34.53371242139564, 114.345703125 33.8521697014074))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.disjoint(read2));

输出true,说明两个图形没有相交

* 判断两个几何图形是否相交(和脱节刚好相反) * @throws Exception public void intersects() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((114.345703125 33.8521697014074, 115.257568359375 33.8521697014074, 115.257568359375 34.53371242139564, 114.345703125 34.53371242139564, 114.345703125 33.8521697014074))"; String wktPolygon2 = "POLYGON ((114.85107421875 33.57343808567733, 115.60913085937499 33.57343808567733, 115.60913085937499 34.134541681937364, 114.85107421875 34.134541681937364, 114.85107421875 33.57343808567733))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.intersects(read2));

输出true,说明连个图形相交了

  1. 接触(touches)
* 判断几何体是否接触(边界是否有共同的点或边界线) * @throws Exception public void touches() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((115.6087875366211 33.11282400421533, 116.1416244506836 33.11282400421533, 116.1416244506836 33.57172177544194, 115.60913085937499 33.57343808567733, 115.6087875366211 33.11282400421533))"; String wktPolygon2 = "POLYGON ((114.85107421875 33.57343808567733, 115.60913085937499 33.57343808567733, 115.60913085937499 34.134541681937364, 114.85107421875 34.134541681937364, 114.85107421875 33.57343808567733))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.touches(read2));

输出为true,两个图形的边界的点或线的坐标一样,并且图形内部没有公共的点。使用 intersects 方法输出也为true,和 intersects 不同的是 touches 只允许两个图形的边界点有公共点,不允许内部有公共点。

图形:
在这里插入图片描述
下面这种图形输出也为ture,但是Geometry对象不能同时为线(可以是线,但是结果为false),只能是面和面、面和线进行判断。(没有测试点)
在这里插入图片描述

  1. 交叉(crosses)
* 判断几何图形是否交叉(穿过) * @throws Exception public void crosses() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "LINESTRING (115.90164184570312 33.18123802491263, 116.08840942382812 33.005208549965474, 116.43447875976561 33.16284622181141)"; String wktPolygon2 = "LINESTRING (115.82748413085936 33.042629907076225, 116.08840942382812 33.005208549965474, 116.38710021972655 33.00981511270531)"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.crosses(read2));

输出为true, intersects 方法输出也为true,但是和 intersects 不同的是如果两个Geometry 都为面时 crosses 输出为false。一个为面,一个为线的两个Geometry交叉时 crosses 输出也为ture。

图形:
在这里插入图片描述
下面这种图形 crosses 输出为true,但是Geometry对象不能同时为面(可以是面,但是结果为false),只能是线和线、面和线进行判断。(没有测试点)
在这里插入图片描述

  1. 内含(within)
* @throws Exception public void within() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((112.87353515625 31.970803930433096, 114.45556640625 31.970803930433096, 114.45556640625 33.30298618122413, 112.87353515625 33.30298618122413, 112.87353515625 31.970803930433096))"; String wktPolygon2 = "POLYGON ((111.357421875 30.95876857077987, 115.90576171874999 30.95876857077987, 115.90576171874999 34.361576287484176, 111.357421875 34.361576287484176, 111.357421875 30.95876857077987))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.within(read2));

输出true,如图,A图形内含在B图形里。

  1. 包含(contains)
* @throws Exception public void contains() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((112.87353515625 31.970803930433096, 114.45556640625 31.970803930433096, 114.45556640625 33.30298618122413, 112.87353515625 33.30298618122413, 112.87353515625 31.970803930433096))"; String wktPolygon2 = "POLYGON ((111.357421875 30.95876857077987, 115.90576171874999 30.95876857077987, 115.90576171874999 34.361576287484176, 111.357421875 34.361576287484176, 111.357421875 30.95876857077987))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read2.contains(read1));

输出为true,如图,B图形包含A图形,和内含刚好相反。

  1. 覆盖(overlaps)
* @throws Exception public void overlaps() throws Exception { WKTReader reader = new WKTReader(); String wktPolygon1 = "POLYGON ((111.357421875 30.95876857077987, 115.90576171874999 30.95876857077987, 115.90576171874999 34.361576287484176, 111.357421875 34.361576287484176, 111.357421875 30.95876857077987))"; String wktPolygon2 = "POLYGON ((114.75219726562499 30.420256142845158, 117.72949218749999 30.420256142845158, 117.72949218749999 32.58384932565662, 114.75219726562499 32.58384932565662, 114.75219726562499 30.420256142845158))"; Geometry read1 = reader.read(wktPolygon1); Geometry read2 = reader.read(wktPolygon2); System.out.println(read1.overlaps(read2));

输出为true,两个几何图形必须有公共的点但不是所有的点。就是说两个图形要有相交的部分,也要有不相交的部分。和 intersects 方法不同的是当两个图形的一个点或者边界相交时,输出为false。

最近在做一个项目,涉及到求线与面的交点问题,查阅了API,没有发现符合需求的函数,于是就动手实现了求线与面交点的功能。 注意:这里的线与面的交点仅指二维平面的交点,而非三维的 参考链接: GeoTools 官方文档 提示:以下是本篇文章正文内容,下面案例可供参考 一、maven引入 GeoTools 依赖 项目中用到的 Geotools 中的依赖都在
当前需求是需要为建图算法建立评价指标,比如精准率和召回率指标,这两个指标如何计算在此不细说了,其中主要用到了 JTS 做空间 关系 计算。 差分出两份OSM 文件中同一个Way节点之间的重合的Node部分,多余的部分和空缺的部分; 用到了 JTS 中的 buffer 和 intersect ion来做 两个Way也就是两个LINESTRING ,但并不是所有Node经纬度完全相同的Linestring, 而...
设矢量P  =  (x1,y1)   ,Q  =  (x2,y2) 则矢量叉积定义为:   P  × Q  =  x1*y2  -  x2*y1    得到的是一个标量 显然有性质  P  × Q  =  -  (  Q  × P  )    P  × (  -  Q  )  =  -  (  P  × Q  ) 如不加说明,下 import org.locationtech. jts .algorithm.Angle; import org.locationtech. jts .geom.Coordinate; * 左右 判断 * 通过向量的角度来 判断 点在线的左侧还是右侧 public class 通过 JTS 可以实现多边形求面积以及多个多边形求重合度,本文章只列举几个简单的使用例子。 详细的文档使用链接:http://www.tsusiatsoftware.net/ jts /main.html <dependency> <groupId>com.vividsolutions</groupId> <artifactId> jts -core</artifactId> <version>1.14.0</v
多边形线、面的自相交问题一直是个头疼的问题!网上的处理方式有多种,Polygonizer使用线从新绘制是一种,但会漏洞中间的孔洞。昨天突然想到一个巧妙的解决方法。程序员不多说,直接上代码了。巧妙方法来了_ 。 工具类代码: package com.vx.utils; import com.vividsolutions. jts .geom.*; import com.vividsolutions. jts .operation.valid.IsValidOp; import com.viv
Geotools 中,你可以使用 JTS (Java Topology Suite)库提供的 几何 修复功能来修复 几何 对象。下面是一个示例代码,演示如何使用 Geotools JTS 来修复 几何 对象: ```java import org. geotools .geometry. jts . JTS ; import org.locationtech. jts .geom.Geometry; import org.locationtech. jts .geom.GeometryFactory; import org.locationtech. jts .geom.PrecisionModel; import org.locationtech. jts .operation.buffer.BufferOp; public class GeometryRepairExample { public static void main(String[] args) { // 创建一个需要修复的 几何 对象 GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); Geometry geometry = ...; // 这里替换为你的 几何 对象 // 检查 几何 对象是否有效 if (!geometry.isValid()) { // 修复 几何 对象 Geometry fixedGeometry = geometry.buffer(0); // 打印修复后的 几何 对象 System.out.println("Fixed Geometry: " + fixedGeometry); } else { System.out.println("Geometry is already valid."); 在上面的示例中,你需要替换 `...` 部分为你实际的 几何 对象。首先,创建一个 `GeometryFactory` 对象来生成 几何 对象。然后,使用 `isValid()` 方法检查 几何 对象是否有效。如果 几何 对象无效,则通过调用 `buffer(0)` 方法来修复 几何 对象。修复后的 几何 对象将作为返回值。 需要注意的是, 几何 修复的结果可能会因输入的 几何 对象而异。有时候,简单地使用 `buffer(0)` 方法可能无法完全修复 几何 对象中的所有问题。在处理复杂的 几何 问题时,可能需要使用更高级的算法或工具来进行修复。同时, Geotools 库还提供了其他 几何 修复和操作的函数,你可以根据具体需求进行调整。