GEOS库学习之三:空间关系、DE-9IM和谓词
要判断两个多边形的关系,实际上属于几何图形空间关系判断。几何图形并不只有多边形一种,它包括点、线、面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂。根据前人的研究,总结出了DE-9IM模型,作为一种空间关系判断的标准。
DE-9IM,全称是Dimensionally Extended nine-Intersection Model (DE-9IM),是一种拓扑模型,用于描述两个几何图形空间关系的一种标准。在专业领域,通常将每个几何图形分为三部分:外部(exterior),边界(boundary)和内部(interior)。相像一下,一个矩形的三个部分分别是指哪些地方?两个图形的关系判断,实际上就是三个部分的分别判断,因此就会有一个3*3交叉矩阵,这个矩阵就是DE-9IM模型,如下图:

其中,a,b分别代表两个面,I,B,E分别表示它的三个部分。Dim()函数表示相交部分的维度。如果相交部分是一个面,则是二维,即dim()=2;如果相交部分是一条线,则为一维,dim()=1;如果相交部分是一些点,则为0维,dim()=0;如果不相交,则dim()=-1;从上往下,从左往右读取这个矩阵,就会有一个字符串,如"212101212",即将相互关系转换成了一个字符串,最终对字符串进行判断就可以了。上面的图只是许多关系中的一种,画的是相交的情形,所以并没有出现-1的情况。
如果换一种写法,我们将(0,1,2)认为是相交,写为T,-1认为不相交,写为F。则"212101212"变为"TTTTTTTTT"。 实际上这9个值,我们只需要知道其中几个值就能作出判断了,不需要全部知道。比如我们只要知道第一位是T,就能判断两者相交,而后面8位是什么并不关心。不关心是什么值,我们就用*来代替,因此,我们只要看到"T********",就知道两个图形相交。
将关系用专业术语来表达,我们就叫谓词,比如相交、接触、重叠、包含等。关系比较多,定义也是非常精细。我们这里只考虑两个面(两个多边形)的关系,因此,只需要掌握几种关系就可以了。如果需要判断点、线关系的,建议去https://en.wikipedia.org/wiki/DE-9IM 仔细看看,介绍得非常详细。
面之间的关系,主要两种:相交和脱离(不相交),相交又分为接触、重叠、覆盖和相等。
| 谓词 | 返回值 | 描述 |
| 相等(Equals) | T*F**FFF* |
边界上的点和内部的点全部重合。属于相交的一种 |
| 脱离(Disjoint) | FF*FF**** |
不相交,与相交相反 |
| 接触(Touches) | FT*******\ |
只有边界上有共同点,内部没有。属于相交的一种 |
| 覆盖(Covers) | T*****FF*\ |
b上的每个点都在a上(边界和内部),且所有点都不在a外部。属于相交的一种 |
| 重叠(Overlaps) | |
a和b相交,且具有一部分共同点,但不是全部内部点。属于相交的一种 |



上图分别表示:覆盖、接触和重叠
在geos中, 这五种关系,分别有对应的函数,返回一个BOOL值
a->equals(b) //判断ab是否相等,返回
a->disjoint(b) //判断ab是否脱离
a->touches(b) //判断ab是否接触
a->covers(b) //判断ab是否覆盖,注意和contains的区别
a->overlaps(b) //判断两者是否有重叠部分
另外,如果ab脱离,还可以用
a->distance(b) 计算两者间的最短距离。
如果ab重叠,还可以用
a->intersection(b) 返回相交部分的几何图形。
如果不知道两者之间是什么关系 ,可以使用
a->relate(b) 来返回一串字符串,然后去匹配字符串,看属于哪一种关系。
具体代码练习后续
GEOS库学习之三:空间关系、DE-9IM和谓词的更多相关文章
- GEOS库学习之五:与GDAL/OGR结合使用
要学习GEOS库,肯定绕不开地理方面的东西.如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了.实际上只需要OGR就行 ...
- GEOS库学习之四:几何关系判断
原理上一篇已经介绍过了,这篇就直接进行程序练习 #include "geos.h" GeometryFactory factory; //创建一条环线,与线的区别就是环线是闭合的. ...
- GEOS库的学习之一:介绍和编译
对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...
- 使用VS2010编译64的Geos库
Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...
- AspectJ基础学习之三HelloWorld(转载)
AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- GEOS库在windows中的编译和测试(vs2012)
版本:vs2012, geos3.5 一.下载和编译 这类的文章比较,不再具体细说,可以参考 http://blog.csdn.net/wangqinghao/article/details/8201 ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- python_库学习_01
一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...
随机推荐
- HTTP/HTTPs要点
Http(超文本传输协议)是一个属于应用层的面向对象的协议. HTTP结构 HTTP请求: 请求行:Method-Request URI HTTP-Version(CRLF),eg:GET /form ...
- jQuery 插件开发文章收集
A jQuery plugin boilerplate http://jonathannicol.com/blog/2012/05/06/a-jquery-plugin-boilerplate/ jQ ...
- Effective Java 16 Favor composition over inheritance
Inheritance disadvantage Unlike method invocation, inheritance violates encapsulation. Since you don ...
- 网站的SEO
提高网站SEO排名的策略除了要有高质量的内容,还有几种方案可以使用 1.关键词的设定 合适的关键词可以提升搜索引擎中的排名 ①最重要的是html中的title标签,这也是一个页面的最重要的概括,所以尽 ...
- ASP.NET 使用Ajax(转)
之前在Ajax初步理解中介绍了对Ajax的初步理解,本文将介绍在ASP.NET中如何方便使用Ajax,第一种当然是使用jQuery的ajax,功能强大而且操作简单方便,第二种是使用.NET封装好的Sc ...
- Linux安装SmartSVN及破解
转载自:linux 下svn图形客户端smartsvn 安装 一.准备 smartsvn需要java支持,首先请确认机器上有没有安装java 另外还请确认环境变量里有没有JAVA_HO ...
- D_S 顺序栈的基本操作
// main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...
- C#连接MySql数据库的方法
1.要连接MySql数据库必须首先下载MySql的连接.net的文件, 文件下载地址为http://download.csdn.net/detail/xiaoliu123586/91455792.解压 ...
- dev/shm time in linux
统计文件夹大小: du -hx --max=1 : du -sk :du -hsc 重新组织行分隔符进行显示: echo "abc,dd,bach,dong,jing,shang,china ...
- LESSON THREE
安装redis,并使用ruby进行简单测试. 使用redis客户端ruby测试 安装gem yum install rubygems 安装ruby所需的redis-rb程序库 ...