要判断两个多边形的关系,实际上属于几何图形空间关系判断。几何图形并不只有多边形一种,它包括点、线、面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂。根据前人的研究,总结出了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. ruby直接底层连接数据库

    class MysqlTest #Code here require "mysql" def testMysql dbc=Mysql.real_connect('localhost ...

  2. 无法将匿名方法转换为System.Delegate

    在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...

  3. 以太网卡TSO技术

    一.简介 TSO(TCP Segment Offload)技术是一种利用网卡的少量处理能力,降低CPU发送数据包负载的技术,需要网卡硬件及驱动的支持.   二.原理 在不支持TSO的网卡上,TCP层向 ...

  4. hdu1042 N!

    /* N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Subm ...

  5. 《TCP/IP详解 卷一》读书笔记-----第三章 IP

    1.Network byte order:数据在网络中的传输是按照大端模式来的,即如果需要传递一个四个字节的int变量,先传递最高的字节,然后依次类推.因此无论主机存储数据用的是大端模式还是小端模式, ...

  6. [cocos2dx]让CCScrollView支持分页

    [cocos2dx]让CCScrollView支持分页 做过IOS开发的朋友, 肯定知道UIScrollView有一个isPaged属性. 当设置其为true的时候, 滑动会自动分页. 即, 每次滑动 ...

  7. sublime Text 2 安装Sublime Package Control

    Sublime Text 2 安装 Sublime Package Control,通过 Sublime Package Control,安装.升级和卸载 Package. 安装 Package Co ...

  8. UVALive 6470 Chomp --记忆化搜索

    题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否 ...

  9. (转)priority_queue的用法

    priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式.先写一个用 STL 里面堆算法实现的与真正的 ...

  10. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...