要判断两个多边形的关系,实际上属于几何图形空间关系判断。几何图形并不只有多边形一种,它包括点、线、面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂。根据前人的研究,总结出了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*******\F**T*****\F***T**** 只有边界上有共同点,内部没有。属于相交的一种
覆盖(Covers) T*****FF*\*T****FF*\***T**FF*\****T*FF* b上的每个点都在a上(边界和内部),且所有点都不在a外部。属于相交的一种  
重叠(Overlaps) T*T***T**\1*T***T** 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和谓词的更多相关文章

  1. GEOS库学习之五:与GDAL/OGR结合使用

    要学习GEOS库,肯定绕不开地理方面的东西.如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了.实际上只需要OGR就行 ...

  2. GEOS库学习之四:几何关系判断

    原理上一篇已经介绍过了,这篇就直接进行程序练习 #include "geos.h" GeometryFactory factory; //创建一条环线,与线的区别就是环线是闭合的. ...

  3. GEOS库的学习之一:介绍和编译

    对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...

  4. 使用VS2010编译64的Geos库

    Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...

  5. AspectJ基础学习之三HelloWorld(转载)

    AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...

  6. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  7. GEOS库在windows中的编译和测试(vs2012)

    版本:vs2012, geos3.5 一.下载和编译 这类的文章比较,不再具体细说,可以参考 http://blog.csdn.net/wangqinghao/article/details/8201 ...

  8. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

  9. python_库学习_01

    一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...

随机推荐

  1. json深度详解及org.json库

    了解json  (Javascript Object Notation) 网站:http://json.org/ english JSON (JavaScript Object Notation) i ...

  2. 介绍一种css水平垂直居中的方法(非常好用!)

    这次介绍一下一个水平垂直居中的css方法,这个方法可以说是百试百灵,废话不多说,直接附上代码: html,body{ width:100%; height:100%; } 你需要居中的元素{ posi ...

  3. selinux开启关闭

    查看SELinux状态: 1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态 SELinux status:         ...

  4. SIEBEL应用概述

    Siebel CRM是围绕客户关系管理这个主题建立起来的一系列应用的总和,和一些国内公司的CRM/CALL CENTER产品不一样,Siebel应用远远不是只是接一些电话然后记录下来并进行处理这么简单 ...

  5. CSS中vw和vh单位的使用

    vw——viewpoint width,视窗宽度,1vw等于视窗宽度的1%: vh——viewpoint height,视窗高度,1vh等于视窗高度的1%:例子:http://tutorialzine ...

  6. 大数据架构-使用HBase和Solr将存储与索引放在不同的机器上

    大数据架构-使用HBase和Solr将存储与索引放在不同的机器上 摘要:HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索 ...

  7. 2013年 蓝桥杯预赛 java 本科A 题目

    1.标题: 世纪末的星期 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月 ...

  8. js动态切换图片

    <script language =javascript > $(function () { initAds(); }); function initAds() { var curInde ...

  9. 制作nginx和php的rpm包

    rpm包的制作真几把烦,制作php的rpm花了我3天时间,因为是根据线上环境来做的,依赖的第三方库太多,本来想把所有的第三方库做进php包,后来发现在rpmbuild -bb的时候非常耗时,而且乱七八 ...

  10. jQuery对象与dom对象的区别与相互转换

    什么是jQuery对象? 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的,其可以使用jQuery里的方法.例如: $("#test").htm ...