利用PostGIS中的九交模型解决选址问题

1. 问题描述

  • 有一批港口的选址方案,符合标准的选址方案是:港口(线型)的一端必须与湖岸相交,并且港口的所有其他部分都要在湖中。目前有5个选址的方案,这些方案哪些是符合标准的?
file

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

file

3.2 计算过程

    1. 数据初始化
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
    1. 进行相交分析
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交集模型

你可能感兴趣的:(利用PostGIS中的九交模型解决选址问题)