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 ...
随机推荐
- java攻城狮之路(Android篇)--与服务器交互
一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...
- WPA字典锦集
1.xiemimendictionary 字典下载(第二季),500W整理过后还有282W条不重复的密码 字典下载,600W整理过后还有400W条不重复的密码 历次泄+常用弱口令字典集合[无中文去重复 ...
- Vim 插件之 NERDTree
设置快键键 编辑 .vimrc 添加以下内容后,可以使用 ctrl + n 来开关 NERDTree 插件. map <silent> <C-n> :NERDTreeToggl ...
- Android之TextView的Span样式源码剖析
Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 Spannab ...
- SharePoint 2013中的爬网最佳做法
了解在 SharePoint Server 2013 中爬网的最佳做法 搜索系统对内容进行爬网,以构建一个用户可以对其运行搜索查询的搜索索引.本文包含有关如何最有效地管理爬网的建议. 本文内容: 使用 ...
- Ember Charts – 基于 Ember & D3 的图表库
Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库.它包括时间序列.柱状图.饼图.点图,很容易扩展和修改.这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展 ...
- 前端优化:RequireJS Optimizer 的使用和配置方法
RequireJS Optimizer 是 RequireJS 自带的前端优化工具,可以对 RequireJS 项目中的 JavaScript & CSS 代码使用 UglifyJS 或者 C ...
- hash函数为什么要选择对素数求余?
常用的hash函数是选一个数m取模(余数),这个数在课本中推荐m是素数,但是经常见到选择m=2^n,因为对2^n求余数更快,并认为在key分布均匀的情况下,key%m也是在[0,m-1]区间均匀分布的 ...
- js中offsetLeft,offsetTop,offsetParent计算边距方法
封装一个函数获得任一元素在页面的位置 var GetPosition= function (obj) { var left = 0; var top = 0; while(obj.offsetPare ...
- sql server 脚本创建数据库邮件
sql server 脚本创建数据库邮件代码: --脚本创建数据库邮件 --1.开启数据库邮件 RECONFIGURE WITH OVERRIDE GO RECONFIGURE WITH OVERRI ...