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)

[3]PostGIS 3.3.3dev Manual

[4]PostGIS Cheat Sheet

[5]九交模型 开源地理空间基金会中文分会 开放地理空间实验室 (osgeo.cn)

PostGIS之维数扩展的九交模型的更多相关文章

  1. numpy的基本API(二)——维数操作

    numpy的基本维数操作API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.copyto(dst, src) copyto方法将数组src复制到 ...

  2. 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) 样本数量少于矩阵维 ...

  3. HOG参数简介及Hog特征维数的计算(转)

    HOG构造函数 CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8),      cellSize( ...

  4. Tensorflow描述张量的维度:阶,形状以及维数

    张量 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 在TensorFl ...

  5. LR特征维数特别大实时计算问题

    美团 https://tech.meituan.com/machinelearning-data-feature-process.html 维数灾难 待续...

  6. /编写一个函数,要求从给定的向量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:$ */ /* 编写一个 ...

  7. C#数组维数及不同维数中元素个数的获取

    简单理解有关数组维数的概念: 1.编程中用到的多维的数组,最多也就是二维数组了 2.数组的维数从0开始计算 using System; using System.Collections.Generic ...

  8. 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 ...

  9. 分类问题中的“维数灾难” - robotMax

    分类问题中的“维数灾难” - robotMax 在看机器学习的论文时,经常会看到有作者提到“curse of dimensionality”,中文译为“维数灾难”,这到底是一个什么样的“灾难”?本文将 ...

  10. tensorflow中张量(tensor)的属性——维数(阶)、形状和数据类型

    tensorflow的命名来源于本身的运行原理,tensor(张量)意味着N维数组,flow(流)意味着基于数据流图的计算,所以tensorflow字面理解为张量从流图的一端流动到另一端的计算过程. ...

随机推荐

  1. Crane如何做到利用率提升3倍稳定性还不受损?

    作为云平台用户,我们都希望购买的服务器物尽其用,能够达到最大利用率.然而要达到理论上的节点负载目标是很的,计算节点总是存在一些装箱碎片和低负载导致的闲置资源.下图展示了某个生产系统的CPU资源现状,从 ...

  2. STM32点亮LED的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  3. MassTransit | 基于StateMachine实现Saga编排式分布式事务

    什么是状态机 状态机作为一种程序开发范例,在实际的应用开发中有很多的应用场景,其中.NET 中的async/await 的核心底层实现就是基于状态机机制.状态机分为两种:有限状态机和无限状态机,本文介 ...

  4. [python] python模块graphviz使用入门

    文章目录 1 安装 2 快速入门 2.1 基本用法 2.2 输出图像格式 2.3 图像style设置 2.4 属性 2.5 子图和聚类 3 实例 4 如何进一步使用python graphviz Gr ...

  5. 说一下三种jar包在Linux的启动方式

    最近在linux上发布了一个SpringBoot项目,研究了一下jar包在Linux上的集中启动方式,特在此分享一下. 这里默认要启动的jar包为demo-0.0.1-SNAPSHOT.jar 第一种 ...

  6. 一文了解 Dubbo 3 配置工作原理

    以下是一个 Dubbo 属性配置的例子 dubbo-spring-boot-samples ## application.properties # Spring boot application sp ...

  7. C++string与int的相互转换(使用C++11)

    一.int转string #include <iostream> #include <string> int main() { double f = 23.43; double ...

  8. Codeforces Round #601 (Div. 2) A-E

    比赛链接 A 题意 给两个数字 \(a,b\) ,每次操作可以使 \(a\) 加上 \(+1,+2,+5,-1,-2,-5\) 中的一个数,求最少多少次操作可以将 \(a\) 变成 \(b\) . 题 ...

  9. 创建型模式 - 抽象工厂模式AbstractFactory

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 模式的定义与特点 抽象工厂模式.是一种为访问类提供一个创建一组相关或相关一类对象的接口,且访问类无需指定所要的产品的具体类,就能 ...

  10. 【单片机】nRF52832 实现停止蓝牙广播接口

    前言 有一个项目使用了 nRF52832 芯片作为主控,其中有用到蓝牙功能.在对蓝牙接口进一步封装的时候,发现 SDK 居然没有停止广播的接口,咨询了代理 FAE,对方也没有找到关闭广播的接口.后来通 ...