JTS Geometry关系判断和分析
关系判断
- Geometry之间的关系有如下几种:
|
相等(Equals): |
几何形状拓扑上相等。 |
|
脱节(Disjoint): |
几何形状没有共有的点。 |
|
相交(Intersects): |
几何形状至少有一个共有点(区别于脱节) |
|
接触(Touches): |
几何形状有至少一个公共的边界点,但是没有内部点。 |
|
交叉(Crosses): |
几何形状共享一些但不是所有的内部点。 |
|
内含(Within): |
几何形状A的线都在几何形状B内部。 |
|
包含(Contains): |
几何形状B的线都在几何形状A内部(区别于内含) |
|
重叠(Overlaps): |
几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。 |
- 如下例子展示了如何使用Equals,Disjoint,Intersects,Within操作:
package com.alibaba.autonavi; import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader; /**
* gemotry之间的关系
* @author xingxing.dxx
*
*/
public class GeometryRelated { private GeometryFactory geometryFactory = new GeometryFactory(); /**
* 两个几何对象是否是重叠的
* @return
* @throws ParseException
*/
public boolean equalsGeo() throws ParseException{
WKTReader reader = new WKTReader( geometryFactory );
LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
LineString geometry2 = (LineString) reader.read("LINESTRING(5 0, 0 0)");
return geometry1.equals(geometry2);//true
} /**
* 几何对象没有交点(相邻)
* @return
* @throws ParseException
*/
public boolean disjointGeo() throws ParseException{
WKTReader reader = new WKTReader( geometryFactory );
LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
LineString geometry2 = (LineString) reader.read("LINESTRING(0 1, 0 2)");
return geometry1.disjoint(geometry2);
} /**
* 至少一个公共点(相交)
* @return
* @throws ParseException
*/
public boolean intersectsGeo() throws ParseException{
WKTReader reader = new WKTReader( geometryFactory );
LineString geometry1 = (LineString) reader.read("LINESTRING(0 0, 2 0, 5 0)");
LineString geometry2 = (LineString) reader.read("LINESTRING(0 0, 0 2)");
Geometry interPoint = geometry1.intersection(geometry2);//相交点
System.out.println(interPoint.toText());//输出 POINT (0 0)
return geometry1.intersects(geometry2);
} /**
* 判断以x,y为坐标的点point(x,y)是否在geometry表示的Polygon中
* @param x
* @param y
* @param geometry wkt格式
* @return
*/
public boolean withinGeo(double x,double y,String geometry) throws ParseException { Coordinate coord = new Coordinate(x,y);
Point point = geometryFactory.createPoint( coord ); WKTReader reader = new WKTReader( geometryFactory );
Polygon polygon = (Polygon) reader.read(geometry);
return point.within(polygon);
}
/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
GeometryRelated gr = new GeometryRelated();
System.out.println(gr.equalsGeo());
System.out.println(gr.disjointGeo());
System.out.println(gr.intersectsGeo());
System.out.println(gr.withinGeo(5,5,"POLYGON((0 0, 10 0, 10 10, 0 10,0 0))"));
} }
关系分析
- 关系分析有如下几种
|
缓冲区分析(Buffer) |
包含所有的点在一个指定距离内的多边形和多多边形 |
|
凸壳分析(ConvexHull) |
包含几何形体的所有点的最小凸壳多边形(外包多边形) |
|
交叉分析(Intersection) |
A∩B 交叉操作就是多边形AB中所有共同点的集合 |
|
联合分析(Union) |
AUB AB的联合操作就是AB所有点的集合 |
|
差异分析(Difference) |
(A-A∩B) AB形状的差异分析就是A里有B里没有的所有点的集合 |
|
对称差异分析(SymDifference) |
(AUB-A∩B) AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合 |
2. 我们来看看具体的例子
package com.alibaba.autonavi; import java.util.ArrayList;
import java.util.List; import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString; /**
* gemotry之间的关系分析
*
* @author xingxing.dxx
*/
public class Operation { private GeometryFactory geometryFactory = new GeometryFactory(); /**
* create a Point
*
* @param x
* @param y
* @return
*/
public Coordinate point(double x, double y) {
return new Coordinate(x, y);
} /**
* create a line
*
* @return
*/
public LineString createLine(List<Coordinate> points) {
Coordinate[] coords = (Coordinate[]) points.toArray(new Coordinate[points.size()]);
LineString line = geometryFactory.createLineString(coords);
return line;
} /**
* 返回a指定距离内的多边形和多多边形
*
* @param a
* @param distance
* @return
*/
public Geometry bufferGeo(Geometry a, double distance) {
return a.buffer(distance);
} /**
* 返回(A)与(B)中距离最近的两个点的距离
*
* @param a
* @param b
* @return
*/
public double distanceGeo(Geometry a, Geometry b) {
return a.distance(b);
} /**
* 两个几何对象的交集
*
* @param a
* @param b
* @return
*/
public Geometry intersectionGeo(Geometry a, Geometry b) {
return a.intersection(b);
} /**
* 几何对象合并
*
* @param a
* @param b
* @return
*/
public Geometry unionGeo(Geometry a, Geometry b) {
return a.union(b);
} /**
* 在A几何对象中有的,但是B几何对象中没有
*
* @param a
* @param b
* @return
*/
public Geometry differenceGeo(Geometry a, Geometry b) {
return a.difference(b);
} public static void main(String[] args) {
Operation op = new Operation();
//创建一条线
List<Coordinate> points1 = new ArrayList<Coordinate>();
points1.add(op.point(0, 0));
points1.add(op.point(1, 3));
points1.add(op.point(2, 3));
LineString line1 = op.createLine(points1);
//创建第二条线
List<Coordinate> points2 = new ArrayList<Coordinate>();
points2.add(op.point(3, 0));
points2.add(op.point(3, 3));
points2.add(op.point(5, 6));
LineString line2 = op.createLine(points2); System.out.println(op.distanceGeo(line1, line2));//out 1.0
System.out.println(op.intersectionGeo(line1, line2));//out GEOMETRYCOLLECTION EMPTY
System.out.println(op.unionGeo(line1, line2)); //out MULTILINESTRING ((0 0, 1 3, 2 3), (3 0, 3 3, 5 6))
System.out.println(op.differenceGeo(line1, line2));//out LINESTRING (0 0, 1 3, 2 3)
}
}
JTS Geometry关系判断和分析的更多相关文章
- JTS Geometry
JTS Geometry关系判断和分析 JTS Geometry关系判断和分析 1.关系判断 1.1实例 2.关系分析 2.1实例 JTS(Geometry) JTS Geometry关系判断和分析 ...
- 基于R树索引的点面关系判断以及效率优化统计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在之前的博客中,我分别介绍了基于网格的空间索引(http:// ...
- JTS(Geometry)(转)
原文链接:http://blog.csdn.net/cdl2008sky/article/details/7268577 空间数据模型(1).JTS Geometry model (2).ISO Ge ...
- NLP之基于BERT的预测掩码标记和句间关系判断
BERT @ 目录 BERT 程序步骤 程序步骤 设置基本变量值,数据预处理 构建输入样本 在样本集中随机选取a和b两个句子 把ab两个句子合并为1个模型输入句,在句首加入分类符CLS,在ab中间和句 ...
- Geometry关系高级操作
一些高级的操作 几何形状Geometry缓冲(buffer) 线段的融合(linemerge)是将Geometry A中相互连接的线段进行连接 多边形化操作(polygonize)对Geometry ...
- Python基础(三):简化除法判断、分析apache访问日志、扫描存活主机、利用多线程实现ssh并发访问
一.简化除法判断 目标: 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用 ...
- C:矩形相交、相包含、相离关系判断
矩形相交 包含 问题.参考 假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形 rect1{(minx1, miny1)(maxx1, maxy1)} ...
- Mybatis日期类型的关系判断
进行时间段的查询时,在mapper文件中直接使用">","<"等关系运算符是无法解析的 <if test="executeStart ...
- boost::algorithm用法详解之字符串关系判断
http://blog.csdn.net/qingzai_/article/details/44417937 下面先列举几个常用的: #define i_end_with boost::iends_w ...
随机推荐
- ruby self.included用法
===Module#included 当一个模块混入到类时,如果该模块的included方法已经定义,那么该方法被调用.该方法的唯一参数就是接受混含的类的名字. module M def self.i ...
- 利用__index和__newindex实现默认值表、监控表、只读表
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...
- Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
MINA.Netty.Twisted为什么放在一起学习?首先,不妨先分别看一下它们官方网站对其的介绍: MINA: Apache MINA is a network application frame ...
- linux分享六:nohup与&,守护进程
contab每秒执行脚本,然后将把标准错误重定向到标准输出(2>&1)以追加的方式写入log_cronjob.txt.补充:试想2>1代表什么,2与>结合代表错误重定向,而1 ...
- 【算法题】Multiples of 3 and 5
Multiples of 3 and 5 原题 题意如下: 找出N以内的3和5的倍数的和. 思路 1.刚看到觉得好弱智,直接遍历一遍不就OK了吗?但是第2和第3个测试用例报了TLE,超时. 2.然后想 ...
- Gulp.js - 简单、直观的自动化项目构建工具
Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...
- 基于.NET C#的 sqlite 数据库 ORM 【Easyliter】
因为工作原因经常用到SQLITE数据库,但又找不到好用的ORM所以自个整理了一个简单好用的轻量极ORM框架:Easyliter 功能介绍: 1.支持SQL语句操作 2.支持 List<T> ...
- 如何根据iframe内嵌页面调整iframe高宽续篇
接着昨天的工作 如何根据iframe内嵌页面调整iframe高宽 来说,按照文章中说的第二种方法实现代码如下: 实现 A.com/detail/view 页面的iframe代码如下: <ifra ...
- 以神经网络使用为例的Matlab和Android混合编程
由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是...) ...
- thread_Semaphore信号量
Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制. 使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数. 一个计数信 ...