>>> from env_helper import info; info()
页面更新时间: 2023-12-24 22:54:02
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-15-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

7.4. DE九交空间(DE-9IM)关系

DE九交空间关系运算是用于检验2个几何对象的特定的拓扑空间关系的逻辑方法。 两个几何对象的拓扑空间关系在GIS中是一个重要的研究主题。 2个几何对象的拓扑空间关系的判断主要是通过几何对象的内部、边界和外部的交集。 在二维空间中,几何体的边界是比几何体更低一维的集合。 如点和多点的边界为空集。线的边界为线的2个端点, 当线是闭合时,则线的边界为空集。多边形(面)的边界是组成它的线。

有两个简单实体A与B B(A) 和B(B) 表示A 和B 的边界(border) I(A) 和I(B) 表示A 和B 的内部(inside) E(A) 和E(B) 表示A 和B 的外部。 从数学上来讲,该模型可以表示29 = 512 种可能的关系,但实际 上有些关系是不存在的。

上面的9交模型是通过空和非空来区分2个目标边界的内部和外部。

7.4.1. DE九交空间应用

该方法是有局限性,需要运用维数扩展法进行扩展:

下面是几个预定义的空间关系:

  1. 两个几何对象完全相同,则表示为DE-9IM即 TFFFTFFFT

  2. 两个对象的边界和内部都没有任何公共部分,则表示为DE-9IM即 FF*FF****

  3. Disjoint 取反

  4. 简单地说Touches表示两个对象的边缘相接触, 这个关系是以下几类几何对象间特有的:A/A, L/L, L/A, P/A ,P/L。 用DE-9IM表示为 FT******* , F**T*****F***T****

  5. Crosses表示一个对象穿过另一个对象,它应用于P/L, P/A, L/L和L/A之间。 用DE-9IM表示为: T*T******(P/L, P/A,L/A), 0********(L/L)

  6. 包含于。用DE-9IM表示为: T*F**F***

  7. 相叠,应用于A/A, L/L 和P/P之间。用DE-9IM表示为: T*T***T** (A/A, P/P), 1*T***T** (L/L)

  8. 包含,对立于 Within

JTS的Geometry类实现了上面的所有方法,由于这些方法不能表示全部的空间位置关系, 因此OGC的Simple Feature Specification和JTS都提供了一个 relate() 方法, 用来测试指定的DE-9IM关系。

relate() 方法测试了对象之间的所有DE九交空间关系。

object.relate(other) 返回在一个对象和另一个几何对象的内部、 边界和外部之间的DE九交空间关系。

命名关系谓词 contains() 等通常被当作relate()的封装实现。

两个不同的点在它们的矩阵中主要有假值( FFalse)属性; 它们的外部交集 (第九个元素)是一个2维对象平面的其余部分。 一个对象的内部和另一个 外部的交集是0维对象(矩阵中的第3与第7个元素)。

7.4.2. 在 Shapely 中使用 relate() 函数计算空间关系

>>> from shapely.geometry import Point
>>> Point(0, 0).relate(Point(1, 1))
'FF0FFF0F2'
>>> from shapely.geometry import LineString
>>> Point(0, 0).relate(LineString([(0, 0), (1, 1)]))
'F0FFFF102'

一条线和线上点的矩阵有更多真元素,而不是假元素。

测试

>>> LineString([(0, 0), (1, 1)]).relate(LineString([(0, 0), (1, 1)]))
'1FFF0FFF2'
>>> Point(0, 0).relate(Point(0, 0))
'0FFFFFFF2'
>>> from shapely.geometry import Polygon
>>> Polygon([[0, 0], [0, 4], [4, 4], [4, 0]]).relate(Polygon([[0, 0], [0, 4], [4, 4], [4, 0]]))
'2FFF1FFF2'