PostGIS之维数扩展的九交模型
1. 概述
PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询
PostGIS官网:About PostGIS | PostGIS
PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS
PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)
本文基于官方教程描述PostGIS中的九交模型
数据准备可参考:
数据介绍可参考:
2. 九交模型
2.1 定义
"维数扩展的9交集模型-Dimensionally Extended 9-Intersection Model"(DE9IM)是一个用于建模两个空间对象如何交互的框架(即,空间关系)
九交模型规定,每个几何图形都有外部、边界和内部:

对于点:内部是点,边界是空集,外部是平面上除点以外的所有其他部分
点线面的外部、边界和内部定义表格如下:
| 几何对象 | 边界 | 内部 | 外部 |
|---|---|---|---|
| 点 | 无边界 | 点本身 | 点对象以外的区域 |
| 线 | 线对象的端点 | 除端点外的线对象 | 线对象外的区域 |
| 面 | 面对象控制边 | 面对象除边界后的区域 | 面对象本身外的区域 |
九交模型进一步规定:
任意对象a、b:
| 内部(b) | 边界(b) | 外部(b) | |
|---|---|---|---|
| 内部(a) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) |
| 边界(a) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) |
| 外部(a) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) | dim(I(a) intersect I(b)) |
示例图如下:

dim(dimension)的返回值:有-1,0,1,2. 分别代表不同的含义,如下:
- T:交集存在,dim=0,1或2;
- F:交集不存在,dim=-1;
- 0:交集存在,但其最高维度必须是0;
- 1:交集存在,但其最高维度必须为1;
- 2:交集存在,但其最高维度必须为2;
例如,下图所示的图形:

其九交模型为:
1 0 1
0 F 0
2 1 2
使用PostGIS进行判断,主要使用的函数有:
- ST_Relate(geomA, geomB) Tests if two geometries have a topological relationship matching an Intersection Matrix pattern, or computes their Intersection Matrix
SELECT ST_Relate(
'LINESTRING(0 0, 2 0)',
'POLYGON((1 -1, 1 1, 3 1, 3 -1, 1 -1))'
);

2.2 查找具有特定关系的几何图形
E9IM矩阵的强大之处在于使用它们作为匹配参数来查找彼此之间具有特定关系的几何图形
比如下图中,利用九交模型寻找合格的码头:

将码头与湖泊建模进数据库:
CREATE TABLE lakes ( id serial primary key, geom geometry );
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),
合格的码头具有以下特点:
- 它们的内部与湖泊内部有一个线性(一维)相交
- 它们的边界与湖泊内部有一个点(0维)相交
- 它们的边界与湖泊边界也有一个点(0维)相交
- 它们的内部与湖泊外部没有相交(F)
用九交模型定义:

使用九交模型寻找合适的码头:
SELECT docks.*
FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom)
WHERE ST_Relate(docks.geom, lakes.geom, '1FF00F212');

DE9IM数据模型字符串可以使用通配符:
- "*"表示"此单元格中的任何值都可以接受"
- "T"表示"任何非假值(0、1或2)都可以接受"
2.3 数据质量检测
利用九交模型,来检测几何图形是否合格
例如,任何人口普查块(census blocks)都不应与任何其他人口普查块重叠,如下图所示:

使用九交模型表示内部重叠就是:
2 * *
* * *
* * *
使用这个九交模型来检测:
SELECT a.gid, b.gid
FROM nyc_census_blocks a, nyc_census_blocks b
WHERE ST_Intersects(a.geom, b.geom)
AND ST_Relate(a.geom, b.geom, '2********')
AND a.gid != b.gid;

又例如,使用九交模型检测街道线段是否内部相交(相交点只发生在街道直线的末端,而不是中点),如下图所示:

使用九交模型表示合格线段相交:
* * *
* 0 *
* * *
使用九交模型检测不合格的线段:
SELECT a.gid, b.gid
FROM nyc_streets a, nyc_streets b
WHERE ST_Intersects(a.geom, b.geom)
AND NOT ST_Relate(a.geom, b.geom, '****0****')
AND a.gid != b.gid;

3. 参考资料
[1]26. Dimensionally Extended 9-Intersection Model — Introduction to PostGIS
[2]PostGIS教程十八:维数扩展的9交集模型 - 知乎 (zhihu.com)
[5]九交模型 开源地理空间基金会中文分会 开放地理空间实验室 (osgeo.cn)
PostGIS之维数扩展的九交模型的更多相关文章
- numpy的基本API(二)——维数操作
numpy的基本维数操作API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.copyto(dst, src) copyto方法将数组src复制到 ...
- PCA样本数量少于矩阵维数
%test pcaA=[3,7,1,4,1;5,5,2,1,3;4,2,4,5,3];S=cov(A);T=cov(A');[ds,vs]=eig(S)[dt,vt]=eig(T) 样本数量少于矩阵维 ...
- HOG参数简介及Hog特征维数的计算(转)
HOG构造函数 CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8), cellSize( ...
- Tensorflow描述张量的维度:阶,形状以及维数
张量 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 在TensorFl ...
- LR特征维数特别大实时计算问题
美团 https://tech.meituan.com/machinelearning-data-feature-process.html 维数灾难 待续...
- /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数
/** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...
- C#数组维数及不同维数中元素个数的获取
简单理解有关数组维数的概念: 1.编程中用到的多维的数组,最多也就是二维数组了 2.数组的维数从0开始计算 using System; using System.Collections.Generic ...
- python 增加矩阵行列和维数
python 增加矩阵行列和维数 方法1 np.r_ np.c_ import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) b = np.a ...
- 分类问题中的“维数灾难” - robotMax
分类问题中的“维数灾难” - robotMax 在看机器学习的论文时,经常会看到有作者提到“curse of dimensionality”,中文译为“维数灾难”,这到底是一个什么样的“灾难”?本文将 ...
- tensorflow中张量(tensor)的属性——维数(阶)、形状和数据类型
tensorflow的命名来源于本身的运行原理,tensor(张量)意味着N维数组,flow(流)意味着基于数据流图的计算,所以tensorflow字面理解为张量从流图的一端流动到另一端的计算过程. ...
随机推荐
- 【大数据-课程】高途-天翼云侯圣文-Day2:离线数仓搭建分解
一.内容介绍 昨日福利:大数据反杀熟 今日:数据看板 离线分析及DW数据仓库 明日:实时计算框架及全流程 一.数仓定义及演进史 1.概念 生活中解答 2.数据仓库的理解 对比商品仓库 3.数仓分层内容 ...
- 推荐一款 在线+离线数据 同步框架 Dotmim.Sync
移动智能应用可以分为在线模式.纯离线模式与"在线+离线"混合模式.在线模式下系统数据一般存储在服务器端的大中型数据库(如 SQL Server.Oracle.MySQL 等),移动 ...
- Django视图层/FBV与CBV/jsonResponse对象/form表单上传文件/request对象获取文件
目录 虚拟环境 视图层views 三板斧 jsonResponse对象 form如何上传文件/request对象获取文件 request对象方法 FBV与CBV CBV源码解析 虚拟环境 每创建一个虚 ...
- 从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波
摘要:常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波.方框滤波.高斯滤波)和两种非线性滤波(中值滤波.双边滤波),本文将详细讲解两种非线性滤波方法. 本文分享自华为云社区<[Python ...
- ArcObjects SDK开发 016 在ArcMap中使用Toolbox
1.如何找到ToolBox 通过Geoprocessing菜单上的ArcToolbox菜单项,可以打开ArcToolbox面板. 工具栏上也有一个ArcToolbox的按钮,点击该按钮也可以打开. 通 ...
- js将时间戳转成时间格式
let start_time = 1653007401082, date = new Date(+start_time), Y = date.getFullYear() + '-', M = (dat ...
- 为什么NoSQL数据库这么受欢迎?
大数据时代,NoSQL数据库是企业构建数据能力的核心工具之一.近期,在2022腾讯全球数字生态大会NoSQL数据库专场上,腾讯云发布了多项NoSQL产品能力升级,并重点讲解了其背后的自研技术要点及实现 ...
- 【转载】SQL SERVER 通过对汉字、字母和数字的Unicode码区间的判断来识别字符串
A~Z :65~90 a~z :97~122 0-9 : 48-57 –汉字unicode编码范围:[0x4e00,0x9fa5](或十进制[19968,40869]) SELECT * FR ...
- 【进阶篇】Redis实战之Jedis使用技巧详解
一.摘要 在上一篇文章中,我们详细的介绍了 redis 的安装和常见的操作命令,以及可视化工具的介绍. 刚知道服务端的操作知识,还是远远不够的,如果想要真正在项目中得到应用,我们还需要一个 redis ...
- [OpenCV实战]20 使用OpenCV实现基于增强相关系数最大化的图像对齐
目录 1 背景 1.1 彩色摄影的一个简短而不完整的历史 1.2 OpenCV中的运动模型 2 使用增强相关系数最大化(ECC)的图像对齐 2.1 findTransformECC在OpenCV中的示 ...