1. 问题描述
- 有一批港口的选址方案,符合标准的选址方案是:港口(线型)的一端必须与湖岸相交,并且港口的所有其他部分都要在湖中。目前有5个选址的方案,这些方案哪些是符合标准的?
2. 九交模型介绍
2.1 空间要素的组成部分
-
首先,定义所有的空间要素都有
- 内部(interior)
- 边界(boundary)
- 外部(exterior)
-
面:
file
-
线:
file -
点:
I B(为空) E
file
2.2 九交模型
两个几何图形的空间关系,可以用以下矩阵表示:
file举例来说,就是以下的表达方式,点-点、点-线、点-面、线-线、线-面、面-面的空间关系可以依次推导:
file
2.3 一些典型的空间关系
OGC中标准的空间关系
序号 | 空间关系 | 中文名称 | pg函数 | 解释 | 相交关系 |
---|---|---|---|---|---|
1 | Contains / Inside | 包含 | 一个几何图形的内部完全包含了另一个几何图形 | file | |
2 | Croses | 交叉、穿过 | 一个几何图形的内部和另一个几何图形的边界和内部相交,在不同维度图形使用,如线和面 | file | |
3 | Disjoint | 分离 | 两个几何图形的边界和内部不相交 | file | |
4 | Equal | 相等 | 两个几何图形具有相同的边界和内部 | file | |
5 | Intersects | 相交 | 两个几何图形没有分离(Non-Disjoint) | 除了分离以外的所有情况 | |
6 | Overlaps | 重叠 | 两个图形的边界和内部相交(Intersect) | file | |
7 | Touch | 接触 | 两个几何图形的边界相交,但是内部不相交 | file | |
8 | Within | 包含于 | 一个几何图形的内部和边界完全在另一个几何图形的内部 | file |
2.4 扩展
三维空间拓扑关系
点-点空间关系2种:相离、相等;
点-线空间关系3种:相离、相接、包含于;
点-面空间关系3种:相离、相接、包含于;
点-体空间关系3种:相离、相接、包含于;
线-线空间关系7种:相离、相交、交叠、相等、相接、包含于、包含;
线-面空间关系5种:相离、相接、进入、穿越、包含于;
线-体空间关系5种:相离、相接、进入、穿越、包含于;
面-面空间关系10种:相离、相接、交叠、相等、包含于、包含、覆盖、被覆盖、穿越、被穿越;
面-体空间关系8种:相离、相接、交叠、进入、包含于、包含、穿越、被穿越;
体-体空间关系8种:相离、相接、进入、相等、包含于、包含、穿越、被穿越。
3. 如何在PostgreSQL中利用9交模型解决码头选址问题?
3.1 分析:
码头必须拥有以下特征:
- 码头一端与湖岸相接→B(a)∩B(b) = 0
- 码头在湖中→I(a)∩I(b) = 1
- 码头不在湖以外的地区 → I(a)∩E(b) = F
- 码头的另外一端在湖中 → B(a)∩I(b) = 0
所以整理得到九交满足的码头标准为:1FF00F212
3.2 计算过程
- 数据初始化
CREATE TABLE lakes ( id serial primary key, geom geometry ); --创建带有坐标的geom表
CREATE TABLE docks ( id serial primary key, good boolean, geom geometry ); --创建码头表
INSERT INTO lakes ( geom ) VALUES ( 'POLYGON ((100 200, 140 230, 180 310, 280 310, 390 270, 400 210, 320 140, 215 141, 150 170, 100 200))'); -- 初始化数值
INSERT INTO docks ( geom, good ) VALUES ('LINESTRING (170 290, 205 272)',true),('LINESTRING (120 215, 176 197)',true),('LINESTRING (290 260, 340 250)',false),('LINESTRING (350 300, 400 320)',false),('LINESTRING (370 230, 420 240)',false),('LINESTRING (370 180, 390 160)',false); --初始化码头
file
- 进行相交分析
SELECT docks.* FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom) WHERE ST_Relate(docks.geom, lakes.geom, '1FF00F212');--ST_Intersects先进行求交运算,判断
4. 9交模型的运算效率如何?
- 敬请期待
参考博客:
点线面拓扑关系
代数拓扑
维数扩展的9交集模型
网友评论