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个目标边界的内部和外部。
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个元素)。
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'