Jts Geometry 的Difference 空间差异分析
JTS Topology Suite
Java Transaction Service(Java事务服务)拓扑套件,是一种能够利用清楚精确的模型和强大的几何算法来实现一套核心空间数据操作的JAVA 应用编程接口(API)。它提供一种详细说明2-D线性几何图形(Geometry)的完善模式。许多在计算几何学的普通操作(Operation)和空间数据处理在一个清晰的,一致的,完整的应用程序接口(API)是无掩蔽的。Java事务服务(JTS)是为了致力于能够支持确定性,清洁性,完整性和对空间数据进行查询的应用软件的发展。
JTS拓扑套件是开源的,可以下载。
关于多边形空间关系和空间操作,网上介绍最多的是这个:
JTS一个重要的应用是计算几何图形(Geometry)之间的空间关系,它提供了多种多样的用于处理空间关系的办法。JTS遵循OGC详细说明的维扩展九交集模型(the Dimensionally-Extended 9 Intersection Matrix model)。为计算两个几何图形的维扩展九交集模型,利用相关的办法去计算:
大多数重要关系可以详细说明成为一种匹配一组交叉矩阵的模式。JTS同样提供了一套布尔数学体系(boolean)的能够直接计算普通空间关系的谓项(predicates谓项,阐述)。它们包括:
相等(Equals): |
几何形状拓扑上相等。 |
脱节(Disjoint): |
几何形状没有共有的点。 |
相交(Intersects): |
几何形状至少有一个共有点(区别于脱节) |
接触(Touches): |
几何形状有至少一个公共的边界点,但是没有内部点。 |
交叉(Crosses): |
几何形状共享一些但不是所有的内部点。 |
内含(Within): |
几何形状A的线都在几何形状B内部。 |
包含(Contains): |
几何形状B的线都在几何形状A内部(区别于内含) |
重叠(Overlaps): |
几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。 |
空间操作:
最近在用差异分析的时候,遇到B会贯穿A的情况:
正常的应该是返回两个多边形,(1,2,7,8)和(3,4,5,6)
-
GeometryFactorygeometryFactory=new
GeometryFactory(); - WKTReader reader = new WKTReader(geometryFactory);
- Polygon geometry1 = (Polygon) reader.read(“POLYGON((0 0, 2 0 ,2 2, 0 2,0 0))”);
- Polygon geometry2 = (Polygon) reader.read(“POLYGON((0 0, 4 0 , 4 1, 0 1, 0 0))”);
-
OverlayOp op = new OverlayOp(geometry1,geometry2);
- Geometry g3 = op.getResultGeometry(OverlayOp.DIFFERENCE);
- //或者这样
- Geometry g3 = geometry1.difference(geometry2)
此外,postgis中也提供了差异分析的操作
说明文档中Geometry
Processing下
ST_Difference — Returns a geometry that represents that part of geometry A that does not intersect with geometry B.提供了一下线段的例子:
SELECT ST_AsText( ST_Difference( ST_GeomFromText('LINESTRING(50 100, 50 200)'), ST_GeomFromText('LINESTRING(50 50, 50 150)') ) ); st_astext --------- LINESTRING(50 150,50 200)
将其中
'LINESTRING(50 100, 50 200)'
替换为polygon或者multipolygon多边形即可得到相应结果。
'MULTIPOLYGON(50 100, 50 200, 100 200,100 100,50 100 )'
参考:
http://blog.csdn.net/cdl2008sky/article/details/7578886
————————————————————————————-
我在第一次用的时候,遇到一个奇怪的问题,两个geometry差异后得到的不是两个多边形(1,2,7,8)和(3,4,5,6)而是一个多了四个点的一个大多边形(1,2,3,4,5,6,7,8)。好像是把相交的点都返回了,需要自己拼装多个多边形。于是,搜到一个方法:
http://revar.livejournal.com/81627.html 里介绍的
利用A上每一个线段的中点和另一个B的相对位置,给每一条线段标记,线段是在内还在外,B的线段也同样标记,最后取标记的线段中A里面在外的线段和B在内的线段拼起来就是差异分析结果。
此外,C++也有库CGAL实现空间操作。和前面功能一样包括交集,差集,并集和对称差异。
转载自:https://mtr-1.oss-cn-beijing.aliyuncs.com/qyblog/2019/04/51096644.jpg