org.locationtech.jts
jts-core
1.16.1
几何关系
|
|
相等(equals)
|
|
脱节(disjoint)
|
|
相交(intersects)
|
|
接触(touches)
|
|
交叉(crosses)
|
|
内含(within)
|
|
包含(contains)
|
|
覆盖(overlaps)
|
|
-
相等(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,说明连个图形相交了
-
接触(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),只能是面和面、面和线进行判断。(没有测试点)
-
交叉(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),只能是线和线、面和线进行判断。(没有测试点)
-
内含(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图形里。
-
包含(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图形,和内含刚好相反。
-
覆盖(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
库还提供了其他
几何
修复和操作的函数,你可以根据具体需求进行调整。