首页 > 其他分享 >PostGIS之维数扩展的九交模型

PostGIS之维数扩展的九交模型

时间:2023-01-12 00:12:07浏览次数:57  
标签:dim 模型 之维数 PostGIS 九交 geom intersect

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)是一个用于建模两个空间对象如何交互的框架(即,空间关系)

九交模型规定,每个几何图形都有外部、边界和内部:

_images/de9im1.jpg _images/de9im2.jpg

对于点:内部是点,边界是空集,外部是平面上除点以外的所有其他部分

点线面的外部、边界和内部定义表格如下:

几何对象 边界 内部 外部
无边界 点本身 点对象以外的区域
线 线对象的端点 除端点外的线对象 线对象外的区域
面对象控制边 面对象除边界后的区域 面对象本身外的区域

九交模型进一步规定:

任意对象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))

示例图如下:

_images/de9im3.jpg

dim(dimension)的返回值:有-1,0,1,2. 分别代表不同的含义,如下:

  • T:交集存在,dim=0,1或2;
  • F:交集不存在,dim=-1;
  • 0:交集存在,但其最高维度必须是0;
  • 1:交集存在,但其最高维度必须为1;
  • 2:交集存在,但其最高维度必须为2;

例如,下图所示的图形:

_images/de9im6.jpg

其九交模型为:

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))'
       );

image-20230106164737843

2.2 查找具有特定关系的几何图形

E9IM矩阵的强大之处在于使用它们作为匹配参数来查找彼此之间具有特定关系的几何图形

比如下图中,利用九交模型寻找合格的码头:

_images/de9im7.jpg

将码头与湖泊建模进数据库:

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)

用九交模型定义:

_images/de9im8.jpg

使用九交模型寻找合适的码头:

SELECT docks.*
FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom)
WHERE ST_Relate(docks.geom, lakes.geom, '1FF00F212');

image-20230106165524637

DE9IM数据模型字符串可以使用通配符:

  • "*"表示"此单元格中的任何值都可以接受"
  • "T"表示"任何非假值(0、1或2)都可以接受"

2.3 数据质量检测

利用九交模型,来检测几何图形是否合格

例如,任何人口普查块(census blocks)都不应与任何其他人口普查块重叠,如下图所示:

_images/de9im11.jpg

使用九交模型表示内部重叠就是:

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;

image-20230106170440492

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

_images/de9im12.jpg

使用九交模型表示合格线段相交:

* * *
* 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;

image-20230106171737428

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)

标签:dim,模型,之维数,PostGIS,九交,geom,intersect
From: https://www.cnblogs.com/jiujiubashiyi/p/17031742.html

相关文章

  • PostGIS之线性参考
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之几何有效性
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之几何创建函数
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之地理坐标
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之空间投影
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • PostGIS之空间索引
    1.概述PostGIS是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在SQL中运行空间查询PostGIS官网:AboutPostGIS|PostGISPostGIS官方教程:PostGIS......
  • 基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
    背景在OGC标准中,通常空间字段是由Geometry类型来表示。而一般编程语言中是没有这种数据类型的。以java为例,怎么操作这些数据,满足业务需求呢?跟着本文一起来学习吧。今天介绍......
  • GeoServer 发布PostGIS数据库中的栅格数据
    1.导入栅格数据进入PostgreSQL\bin目录,利用raster2pgsql工具导入栅格数据,具体命令如下所示:<!--分块,切片存储到PostGIS数据库中-->raster2pgsql-s4326-I-C-ME:/......
  • centos源码编译postgis3.2.1
    前言介绍CentOS8源码编译PostGIS3.2.1版本安装官网官方网站​​https://www.postgis.net/​​​源码下载地址​​https://www.postgis.net/source/​​依赖必须PostgreS......
  • CentOS中使用Docker部署带postgis的postgresql
    场景CentOS中使用Docker来部署Postgresql:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128099670上面安装的postgresql还需自行安装postgis插件,是否可以......