>>> 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九交空间应用¶
该方法是有局限性,需要运用维数扩展法进行扩展:
下面是几个预定义的空间关系:
两个几何对象完全相同,则表示为DE-9IM即
TFFFTFFFT
两个对象的边界和内部都没有任何公共部分,则表示为DE-9IM即
FF*FF****
Disjoint
取反简单地说Touches表示两个对象的边缘相接触, 这个关系是以下几类几何对象间特有的:A/A, L/L, L/A, P/A ,P/L。 用DE-9IM表示为
FT*******
,F**T*****
或F***T****
Crosses表示一个对象穿过另一个对象,它应用于P/L, P/A, L/L和L/A之间。 用DE-9IM表示为:
T*T******
(P/L, P/A,L/A),0********
(L/L)包含于。用DE-9IM表示为:
T*F**F***
相叠,应用于A/A, L/L 和P/P之间。用DE-9IM表示为:
T*T***T**
(A/A, P/P),1*T***T**
(L/L)包含,对立于
Within
。
JTS的Geometry类实现了上面的所有方法,由于这些方法不能表示全部的空间位置关系,
因此OGC的Simple Feature Specification和JTS都提供了一个 relate()
方法, 用来测试指定的DE-9IM关系。
relate()
方法测试了对象之间的所有DE九交空间关系。
object.relate(other)
返回在一个对象和另一个几何对象的内部、
边界和外部之间的DE九交空间关系。
命名关系谓词 contains()
等通常被当作relate()
的封装实现。
两个不同的点在它们的矩阵中主要有假值( F
,False
)属性;
它们的外部交集 (第九个元素)是一个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'