PostGIS学习教程八:空间关系

PostGIS学习教程八:空间关系

到目前为止,我们只使用了测量(ST_Area、ST_Length)、序列化(ST_GeomFromText)或者反序列化(ST_AsGML)几何图形(geometry)的空间函数。这些函数的共同之处在于它们一次只能处理一个几何图形。

空间数据库之所以强大,是因为它们不仅能存储几何图形,而且还能够分析几何图形之间的关系。

诸如"哪一个是离公园最近的自行车位?"或者"地铁线路和街道的交叉路口在哪里?"这样的问题,只能通过比较、分析表示自行车位、街道和地铁线路的几何图形来回答。

OGC标准定义了以下一组用于比较几何图形的方法。

文章目录

  • PostGIS学习教程八:空间关系
  • 一、ST_Equals
  • 二、ST_Intersects、ST_Disjoint、ST_Crosses和ST_Overlaps
  • 三、ST_Touches
  • 四、ST_Within和ST_Contains
  • 五、ST_Distance和ST_DWithin
  • 六、空间关系练习
  • 七、本文涉及的函数


一、ST_Equals

ST_Equals(geometry A, geometry B)用于测试两个图形的空间相等性。
在这里插入图片描述
如果两个相同类型的几何图形具有相同的x、y坐标值,即如果第二个图形与第一个图形的空间形状与位置相等(空间相等性),则ST_Equals()返回TRUE。

首先,让我们从nyc_subway_stations表中检索点数据,我们只选"Broad St"的条目。

SELECT name, geom, ST_AsText(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';

在这里插入图片描述
然后,将几何图形表示数据插入ST_Equals()进行测试:

SELECT name
FROM nyc_subway_stations
WHERE ST_Equals(geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141');

在这里插入图片描述
注意:点在空间数据表中的表示不是很容易理解(0101000020266900000EEBD4CF27CF2141BC17D69516315141),但它是坐标值的精确表示(十六进制)。对于像相等这样的测试,使用精确的坐标信息进行比较是必要的。

二、ST_Intersects、ST_Disjoint、ST_Crosses和ST_Overlaps

ST_Intersects、ST_Crosses和ST_Overlaps都用于测试几何图形内部是否相交。
在这里插入图片描述
如果两个图形有相同的空间部分,即如果它们的边界或内部相交,则ST_Intersects(geometry A, geometry B)返回TRUE。
在这里插入图片描述
ST_Intersects()方法的对立方法是ST_Disjoint(geometry A, geometry B)。

如果两个几何图形没有相交的部分,则它们不相交,反之亦然。

事实上测试"not intersect"(!ST_Intersects)通常比测试"disjoint"(ST_Disjoint)更有效,因为intersect测试会自动使用空间索引。
在这里插入图片描述
对于multipoint/polygon、multipoint/linestring、linestring/linestring、linestring/polygon和linestring/multipolygon的比较,如果相交生成的几何图形的维度小于两个源几何图形的最大维度,且相交集位于两个源几何图形的内部,则ST_Crosses(geometry A, geometry B)将返回TRUE(其实就是判断两个几何图形是否交叉)。
在这里插入图片描述
ST_Overlaps(geometry A, geometry B)比较两个相同维度的几何图形,如果它们的结果集与两个源几何图形都不同但具有相同维度,则返回TRUE(其实就是判断两个几何图形是否叠置)。

让我们以宽街地铁站(Broad Street)为例,使用ST_Intersects()函数确定其所在社区:

SELECT name, ST_AsText(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';

在这里插入图片描述
SELECT name, boroname
FROM nyc_neighborhoods
WHERE ST_Intersects(geom, ST_GeomFromText(‘POINT(583571 4506714)’, 26918));
在这里插入图片描述

三、ST_Touches

ST_Touches()测试两个几何图形是否在它们的边界上接触,但在它们的内部不相交。

在这里插入图片描述
如果两个几何图形的边界相交,或者只有一个几何图形的内部与另一个几何图形的边界相交,则ST_Touches(geometry A, geometry B)将返回TRUE。

四、ST_Within和ST_Contains

ST_Within()和ST_Contains()测试一个几何图形是否完全位于另一个几何图形内。
在这里插入图片描述
如果第一个几何图形完全位于第二个几何图形内,则ST_Within(geometry A, geometry B)返回TRUE,ST_Within()测试的结果与ST_Contains()完全相反。

如果第二个几何图形B完全包含在第一个几何图形A内,则ST_Contains(geometry A, geometry B)返回TRUE。

五、ST_Distance和ST_DWithin

一个常见的GIS问题是"找到这个物体周围距离它X的所有其他物体"。

ST_Distance(geometry A, geometry B)计算两个几何图形之间的最短距离,并将其作为浮点数返回。这对于实际报告几何图形之间的距离非常有用。

SELECT ST_Distance(
ST_GeometryFromText('POINT(0 5)'),
ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));

在这里插入图片描述

为了测试两个几何图形之间的距离是否在某个范围之内,ST_DWithin()函数提供了一个基于索引加速的功能。

这对于"在距离道路500米的缓冲区内有多少棵树?"这样的问题很有用,你不必计算实际的缓冲区,只需测试距离关系即可。
在这里插入图片描述
再次使用我们的宽街地铁站(Broad Street subway station),我们可以找到地铁站附近(10米内)的街道:

SELECT name
FROM nyc_streets
WHERE ST_DWithin(geom,ST_GeomFromText('POINT(583571 4506714)',26918),10);

在这里插入图片描述
我们可以在地图上验证答案,Broad St站实际上是在Wall、Broad和Nassau街道的十字路口。

在这里插入图片描述

六、空间关系练习

下面是我们在文章上面部分涉及到的一些函数,它们应该对练习有用!

sum(expression) aggregate to return a sum for a set of records
count(expression) aggregate to return the size of a set of records
ST_Contains(geometry A, geometry B) returns true if geometry A contains geometry B
ST_Crosses(geometry A, geometry B) returns true if geometry A crosses geometry B
ST_Disjoint(geometry A , geometry B) returns true if the geometries do not “spatially intersect”
ST_Distance(geometry A, geometry B) returns the minimum distance between geometry A and geometry B
ST_DWithin(geometry A, geometry B, radius) returns true if geometry A is radius distance or less from geometry B
ST_Equals(geometry A, geometry B) returns true if geometry A is the same as geometry B
ST_Intersects(geometry A, geometry B) returns true if geometry A intersects geometry B
ST_Overlaps(geometry A, geometry B) returns true if geometry A and geometry B share space, but are not completely contained by each other.
ST_Touches(geometry A, geometry B) returns true if the boundary of geometry A touches geometry B
ST_Within(geometry A, geometry B) returns true if geometry A is within geometry B
练习:

①名为"Atlantic Commonts(大西洋公地)"的街道的geometry值是什么?

SELECT ST_AsText(geom)
FROM nyc_streets
WHERE name = 'Atlantic Commons';

②Atlantic Commons(大西洋公地)位于哪个社区(neighborhood)和行政区(borough)?

SELECT name, boroname
FROM nyc_neighborhoods
WHERE ST_Intersects(geom,ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918)
);

注意:为什么要将"MULTILINESTRING"变成"LINESTRING"呢?因为在空间上,它们描述的是相同的形状。

更重要的是,我们还对坐标进行了四舍五入,以使它们更易于阅读,这实际上改变了结果:我们现在不能使用ST_Touches()方法来找出哪些道路连接Atlantic Commons,因为坐标不再与原来的坐标完全相同。
③Atlantic Commons(大西洋公地)与哪些街道相连?

SELECT name
FROM nyc_streets
WHERE ST_DWithin(geom,ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918),0.1
);

④大约有多少人住在Atlantic Commons上(距离Atlantic Commons50米以内)?

SELECT Sum(popn_total)
FROM nyc_census_blocks
WHERE ST_DWithin(geom,ST_GeomFromText('LINESTRING(586782 4504202,586864 4504216)', 26918),50
);

七、本文涉及的函数

ST_Contains(geometry A, geometry B): Returns true if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A.

ST_Crosses(geometry A, geometry B): Returns TRUE if the supplied geometries have some, but not all, interior points in common.

ST_Disjoint(geometry A , geometry B): Returns TRUE if the Geometries do not “spatially intersect” - if they do not share any space together.

ST_Distance(geometry A, geometry B): Returns the 2-dimensional cartesian minimum distance (based on spatial ref) between two geometries in projected units.

ST_DWithin(geometry A, geometry B, radius): Returns true if the geometries are within the specified distance (radius) of one another.

ST_Equals(geometry A, geometry B): Returns true if the given geometries represent the same geometry. Directionality is ignored.

ST_Intersects(geometry A, geometry B): Returns TRUE if the Geometries/Geography “spatially intersect” - (share any portion of space) and FALSE if they don’t (they are Disjoint).

ST_Overlaps(geometry A, geometry B): Returns TRUE if the Geometries share space, are of the same dimension, but are not completely contained by each other.

ST_Touches(geometry A, geometry B): Returns TRUE if the geometries have at least one point in common, but their interiors do not intersect.

ST_Within(geometry A , geometry B): Returns true if the geometry A is completely inside geometry B

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

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

相关文章

【MATLAB】异常数据识别

基于分位数的异常点识别 首先,给定了一个原始数据序列x。然后,计算了序列x的上四分位数和下四分位数,并根据这两个值计算了异常点的阈值。上四分位数减去1.5倍的四分位数范围得到异常值下界,下四分位数加上1.5倍的四分位数范围得…

运行新vue3项目

一,下载node并安装 官网:https://nodejs.org/en/ 查看版本: node -v二,cd进入到vue3项目目录 cd D:\Program-space\HBuilderXProject\Vue3project三,npm install npm install四,查看安装 npm list五&a…

解析生效探测方法

linux dig命令 1.最常用的查询命令 dig baidu.com2 . 根据记录类型进行查询,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可。 dig a.shifen.com ns3 . 指定域名DNS服务器测试解析是否生效的命令,以…

centos8 下载

下载网址 Download 直接下载地址 https://mirrors.cqu.edu.cn/CentOS/8-stream/isos/x86_64/CentOS-Stream-8-20231127.0-x86_64-dvd1.iso 这个版本安装的时候方便

大数据Doris(二十九):数据导入(Insert Into)

文章目录 数据导入(Insert Into) 一、​​​​​​​创建导入

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。很多人可能想不明白,这里的映射到底是啥意思,为啥访问的时间…

基于SpringBoot的旅游网站的设计与实现

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理…

支持中文,性能超GPT-4!为开发人员而生的 AI 搜索引擎

生成式AI代码开发平台Phind在官网发布了最新V7版本,性能方面超越GPT-4,运行效率提升了5倍,并且支持中文和16K超长上下文。 据悉,Phind V7是基于Phind的开源代码模型CodeLlama-34B V2,以及700亿个高质量代码和推理问题…

企业数字化转型应对传统网络挑战的关键策略

数字化变革正在以前所未有的速度和规模改变着我们的生活和工作方式,使得传统网络架构面临着巨大的挑战。其中包括带宽需求增加、多云应用增加、安全威胁增加以及传统网络设备无法满足需求等问题。 数字化时代需要更高速、更可靠、更安全的网络支持,传统网…

西安数字孪生赋能工业制造,加速推进制造业数字化转型

西安数字孪生、5G、工业物联网、工业互联网等新一代信息通信技术与工业制造业经济深度融合,通过对人、机、物、系统等全面连接,构建覆盖全产业链、全价值链的全新制造和服务体系,为工业乃至产业数字化、网络化、智能化发展提供实现途径&#…

Redis String类型

String 类型是 Redis 最基本的数据类型,String 类型在 Redis 内部使用动态长度数组实现,Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先,Redis 中所…

改进YOLO5:结合CVPR2023最新 PConv |包含 YOLOv5 / YOLOv8 模型 YAML 文件

改进YOLO5:结合CVPR2023最新 PConv |包含 YOLOv5 / YOLOv8 模型 YAML 文件 一、论文总结PConv模块优势二、YOLOv51. yaml文件2. common代码文件三、YOLOv81. yaml2. modules文件添加3. Task文件4. 测试论文链接🎁 :https://arxiv.org/pdf/2303.0366

低代码平台在数字化转型过程中的定位

内容来自演讲:郭昊东 | 上海外服 | 流程分析工程师 摘要 本文介绍了外服集团的 IT 共享中心在低代码平台应用开发方面的实践经验。他们选择低代码平台的原因包括开发成本低、快速看到实际产品以及能够解决数据孤岛和影子 IT 等问题。他们在应用开发中面临的挑战包括…

基于Java SSM框架+Vue实现汉服文化平台网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现汉服文化平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将…

【RabbitMQ】RabbitMQ快速入门 通俗易懂 初学者入门

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比: 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Que…

2023.11.29 -hmzx电商平台建设项目 -核销主题阶段总结

目录 1.准备源数据 2.准备数仓工具进行源数据同步到ods层,本项目使用Datax 3.使用Datax完成数据同步前建表时的方案选择 3.1同步方式区别: 3.2存储格式和压缩区别: 4.在hive中创建表,共31个表 5.数仓概念 和 数仓建模方案 5.1数仓的基本概念 5.2 数仓建模方案 关系建模…

信贷销售经理简历模板

这份简历内容,以信贷销售经理招聘需求为背景,我们制作了1份全面、专业且具有参考价值的简历案例,大家可以灵活借鉴。 信贷销售经理简历模板在线编辑下载:百度幻主简历 求职意向 求职类型:全职 意向岗位&#xff…

光伏设计软件:创新工具,提升设计效率与质量

随着可再生能源的全球关注度不断提高,光伏产业也迎来了前所未有的发展机遇。光伏设计软件作为支持光伏项目的重要工具,为设计师提供了强大的功能,以优化设计过程,提高设计效率,减少错误,降低成本。 首先&am…

保存规则、nat、自定义链

目录 一、保存防火墙的规则 1、保存规则 二、nat 一、SNAT和DNAT 1.SNAT 2 DNAT 三、自定义链 1.添加自定义链 2.设置自定义链并生效 3.删除自定义链 一、保存防火墙的规则 1、保存规则 [rootlocalhost ~]# iptables -A INPUT -s 172.16.114.30 -p tcp -m multiport…

科技与教育:未来教育的新趋势

在21世纪,科技的快速发展正在深刻地改变教育行业。从在线学习平台到虚拟现实教室,科技为教育带来了革命性的变化。本文将探讨科技如何影响现代教育,并预测未来教育的发展趋势。 一、科技在教育中的应用 在线学习平台:通过平台如C…