2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型

16b25aed21c634fd728ae04bc7fec8ea.png

一、什么是维数扩展的9交集模型

"维数扩展的9交集模型-Dimensionally Extended 9-Intersection Model"(DE9IM)是一个用于建模两个空间对象如何交互的框架。

首先,每个空间对象都具有:

  • 内部(interior)
  • 边界(boundary)
  • 外部(exterior)

25fdcc179f5e0c7b5ae11c8c8999e456.png

内部是以环为边界的里面的那一部分;边界是环本身;外部是边界外的一切。

对于线性要素,内部边界外部不太为人所知:

e1c661fb836ddeccf2b6e81dc47d4f98.png

内部是以端点为界限的线的那一部分;边界是线性要素的端点;外部是平面中除内部边界外的所有其他部分。

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

使用这些内部外部边界的定义,任何一对空间要素之间的关系都可以用一对要素的内部/边界/外部/之间九个可能的交集的维数来表征

e0258d2905e32fbf45671f0e0c961c22.png

对于上例中的多边形,内部的交集是二维区域,因此矩阵的对应部分用"2"填充。边界仅在零维点处相交,因此对应矩阵部分用"0"填充。

当两个几何图形的这三个部分(内部边界外部)之间没有交集时,将用"F"填充矩阵中对应的部分。

下面是另一个示例,关于线串的一部分和多边形相交的例子:

e23ffca05d2b71b927e2866c618c79f4.png

关于它们的交集的DE9IM矩阵如下:

f5cf2c22ad552f9dd9d7d47caec8a76d.png

请注意,以上两个要素的边界实际上根本不相交(线的端点与多边形的内部相交,而不是与多边形的边界相交,反之亦然),因此B/B单元用"F"填充。

虽然让人从视觉上填写DE9IM矩阵很有趣,但如果计算机能够做到这一点就更好了,这就是ST_Relate函数的作用。

前面的示例可以使用简单的矩形和直线进行简化,其空间关系与上面的多边形和线串的空间关系相同:

6ec21b8f9c8278fdf2759074bd7110e9.png

我们可以使用SQL生成DE9IM信息:

SELECT ST_Relate('LINESTRING(0 0, 2 0)','POLYGON((1 -1, 1 1, 3 1, 3 -1, 1 -1))'
);

3d267fc7da41f86c4a2b8476792b922c.png

答案(1010F0212)与我们视觉上计算的结果相同,但以9个字符的字符串形式返回。将结果以三行的形式呈现:

fca6386b11589da93b79dd06838c393a.png

但是,DE9IM矩阵的强大之处不在于生成它们,而在于使用它们作为匹配参数来查找彼此之间具有特定关系的几何图形。

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

首先,在数据库中加入如下数据:

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),('LINESTRING (370 180, 390 160)',false);

22e38169ff89be64f2750425866822f8.png

假设我们有一个湖泊(Lakes)和码头(Docks)的数据模型,进一步假设码头必须位于湖泊内部,并且必须在一端接触到湖泊的边界。我们能在数据库中找到所有符合这一规则的码头吗?

d2edcdfd08f4442768f41c01be3ce25c.png

我们的合法码头具有以下特点:

  • 它们的内部与湖泊内部有一个线性(一维)相交
  • 它们的边界与湖泊内部有一个点(0维)相交
  • 它们的边界与湖泊边界也有一个点(0维)相交
  • 它们的内部与湖泊外部没有相交(F)

所以它们的DE9IM矩阵看起来像这样:

e897a5cdbc0a638c1079436e15296033.png

因此,要找到所有符合规则的码头,我们需要先找到所有与湖泊相交的码头,然后再从该集合中找到符合具体规则的所有码头。

SELECT docks.*
FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom)
WHERE ST_Relate(docks.geom, lakes.geom, '1FF00F212');-- Answer: our two good docks

75da46a03fc85bd178a91c24035fe8ff.png

注意,ST_Relate的三参数版本(重载函数)的使用,如果前两个几何图形参数的关系与第三个DE9IM模型参数匹配,则返回ture;如果不匹配,则返回false。

另外,对于更松散的匹配搜索,第三个参数允许DE9IM数据模型字符串使用通配符:

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

例如,我们在示例图形中添加一个与湖泊边界具有二维相交的码头:

INSERT INTO docks ( geom, good )
VALUES ('LINESTRING (140 230, 150 250, 210 230)',true);

821f1eb142ca8f77b8a3189544b63900.png

56c3f69a82b26546fe23754253f79b1c.png

如果要将这个新增的码头在ST_Relate函数检查中被视为符合规则,则需要更改ST_Relate函数的第三个参数。

因为要使码头内部和湖泊边界的相交可以是1(我们的新情况)或F(我们的原始情况)。因此,我们使用"*"通配符覆盖所有情况。

da02e0b92c99eaaa2f2716f9c64d3974.png

SQL语句如下所示:

SELECT docks.*
FROM docks JOIN lakes ON ST_Intersects(docks.geom, lakes.geom)
WHERE ST_Relate(docks.geom, lakes.geom, '1*F00F212');-- Answer: our (now) three good docks

510059c9ab9e43d5ec9f6d199f6f2fc2.png

三、数据质量测试

TIGER数据在准备时经过仔细的质量控制,因此我们希望我们的数据也符合严格的标准。例如:任何人口普查块(census blocks)都不应与任何其他人口普查块重叠。我们能对我们的数据进行测试吗?

47e9f0a840203be5ec71dc0134510b58.png

当然!

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
LIMIT 10;-- Answer: 10, there's some funny business

6ed011bb097399a61070f1faeb30a619.png

同样,我们预计街道数据都是有尾节点的,也就是说,我们预计相交点只发生在街道直线的末端,而不是中点。

779c10c8e3da9aef420058bbbc63f189.png

我们可以通过查找是否有相交但边界之间的交点不是零维的街道(也就是,线端点之间没有接触)来测试这一点:

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
LIMIT 10;-- Answer: This happens, so the data is not end-noded.

88b590c34ecfdd05c2350fe62e51387c.png

四、本文涉及的函数

  • ST_Relate(geometry A, geometry B): Returns a text string representing the DE9IM relationship between the geometries.

五、更多相关资料

  • OpenGIS Simple Features Implementation Specification for SQL (version 1.1, section 2.1.13.2)
  • Dimensionally Extended Nine-Intersection Model (DE-9IM)
  • GeoTools: Point Set Theory and the DE-9IM Matrix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

房子里的K2 BPM业务流程管理

房…子这件事上,尴尬实在太多。 ಥ_ಥ 职场新人,租房很尴尬; 未婚男女,婚房很尴尬; 有下一代的,学区房很尴尬; 耄耋之年,养老房很尴尬... ▽ 甭管买房、租房、装修、设计&#xff0c…

大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...

「ECO氪体」体育圈人www.ecosports.cn文/ 圈哥回忆上学期间,体育最令你头疼的时刻是什么?是不是在体育中考将要到来之前,还没日没夜枯燥的训练和近乎苛刻的饮食控制?而现在,体育似乎不想再局限于中学了。图片截自&…

delphi 基础之三 文件流操作

文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。流不但可以处理文件,还可以…

mongodb 存储过程 遍历表数据_mongodb推荐存列表字段还是多条记录?

在 sql 下, 方案2更好. 在 mongo 下, 方案1更好.不知道你的这个项目中有没有用户权限组的概念.如果有权限组的话, 就是一个权限组的 collection 里面, 每个权限下保存了一个菜单项的数组.如果没有权限组的话, 就可以按照你说的方案1, 在每个用户表里, 或者单独的用户权限表里, …

学习小记----分层图最短路

前置知识 简单的图论知识 简单的dp知识 使用标志 你机智的发现了这是一道图论题,并且出现了类似于N次免费/花费变化的字样,大部分就是分层图最短路了. 它不是不是很难,就是那种,那种看起来很凶神恶煞的,你知道么&#…

gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号

在SWMM中,管线需要输入上下游节点检查井编号,那么在GIS中可否实现自动获取上下游节点编号呢?思路是这样的,首先获得管线两端节点,然后对端点进行融合,删除重复的节点,最后根据坐标关系分别建立管…

android 设置setmultichoiceitems设置初始化勾选_Linux内核启动:虚拟盘空间设置和内存管理结构初始化...

1. 设置虚拟盘并初始化接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中"虚拟盘使用标志"是否设置, 以此确定系统是否使用了虚拟盘(假设有虚拟盘,大小设置为2 MB)。 操作系统从缓冲区的末端起开辟2MB内存空间设置为虚拟盘&am…

centos7 Failed to start iptables.service: Unit not found

在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理 添加 firewall-cmd --zonepublic --add-port80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)firewall-cmd --zonepublic --add-port1000-2000/tcp --permanent 重新载…

关闭mysql服务的方法有哪些_MySQL--启动和关闭MySQL服务

介绍了启动服务器的两种方式,以及可能遇到的问题第一种:系统服务1)可以通过右击方式一步步找到服务右击计算机->选择管理->找到服务,然后双击打开,找到mysql,我安装的是mysql8.0所以服务的名称显示是mysql80&…

[浪风分享]很简单的查看电脑所支持的最大内存的方法--磨刀不误砍柴工

硬件操作系统====决定支持的最大内存  在开始---运行处输入cmd(或者按住winkdyR键输入CMD),打开命令窗口,输…

mysql mysar_使用mysar分析squid日志(日志存mysql)

需要的包:php5-mysql #安装后php才能联系数据库php5-commonphp5-cli #执行php脚本需要mysql-server开始安装:下载最新的mysar包tar zxvf mysar-2.0.6.tar.gz -C /usr/local-#将mysar解压到/usr/local下ln -s /usr/local/mysar/etc/mysar.apache /etc/apache2/…

mysql语句怎么记_Mysql常用语句(记一下,免得忘)

1、去掉某列记录中的特殊字符例如:/r,update test_table set keyreplace(key, char(13), );其他特殊字符类似。2、查询重复的记录Select weixinid From dianxin_highda_detail Group By weixinid Having Count(*)>1;3、从txt向数据库导入记录load dat…

ZSH终端 乱码问题

参考链接 CSDN 转载于:https://www.cnblogs.com/eat-too-much/p/11216073.html

mysql将数据导入mgr_MySQL 8.0.20 MGR数据迁移过程以及注意事项

1.背景近期由于业务调整,需要将Windows Server 2008 MySQL5.5数据库迁移到Windows Server 2012 MySQL8.0集群MGR中,由于实际部署时,有一台机器硬盘损坏,只能构建双节点MGR,在迁移以及应用迁移过程中遇到许多参数与迁移…

安装 搜狗输入法 ubuntu 18

命令 sudo dpkg -i sogoupinyin_2.2.0.0108_amd64.deb sudo apt --fix-broken install 转载于:https://www.cnblogs.com/eat-too-much/p/11216083.html

devstack mysql_DevStack部署OpenStack开发环境 - 问题总结

建议在使用DevStack搭建OpenStack开发环境前,先安装好开发工具包组.特别是gcc,主要一定是在yum update -y 之前,否则更新完系统后,在安装开发工具包会出现很多依赖包因为版本更新而无法安装.要部署OpenStack需要注意若电脑配置不高,我自己的经验是先最小化或基本Web安装,然后,再…

docker+mysql创建用户名密码_docker构建私有仓库并设置仓库用户和密码

#搭建私有镜像仓库[rootdocker_test opt]# docker pull registryUsing default tag: latestlatest: Pulling from library/registryGet https://registry-1.docker.io/v2/library/registry/manifests/sha256:b1165286043f2745f45ea637873d61939bff6d9a59f76539d6228abf79f87774…

linux 安装RabbitMQ 注意版本

Linux下安装RabbitMQ 一下载依赖包 1.下载Rabbitmq 所依赖的环境gcc、erlang包和rabbitmq包,这里演示是网上下载gcc 依赖 1yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xzerla…

mysql更新写入数据_七、MySQL插入、更新与删除数据

存储在系统中的数据是数据库管理系统(DBMS)的核心,数据库被设计用来管理数据的存储、访问和维护数据的完整性。MySQL中提供丰富的数据管理语句,包括插入数据的INSERT、更新数据的UPDATE以及删除数据的DELETE语句。7.1、插入数据为表的所有字段插入数据使…

mysql语句随机数_程序生成随机数与SQL语句生成随机数

随机数可以通过程序生成,也可以通过SQL语句生成。通过程序生成随机数时一般采用硬件的编号时间作为种子,这种方法在瞬间插入数据库N条数据的时候会影响随机数的效果,生成很多相邻的插入值相同。所以频繁插入时可以使用SQL语句的内置函数生成随…