PostGIS学习教程八:空间关系

news2024/9/22 11:40:12

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.coloradmin.cn/o/1273044.html

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

相关文章

代码随想录刷题题Day2

刷题的第二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C / Python Day2 任务 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵 II 1 有序数组的平方(重点:双指针…

口碑爆棚!10款项目时间轴软件带你实现高效管理!

当我们在组织、规划或管理一个项目时,将所有步骤清晰地展示在一个时间轴上,无疑可以帮助我们更好地理解整个项目的流程,确定关键任务,并在必要时进行调整,项目时间轴软件在此方面发挥了重要作用。 项目时间轴软件是什…

机器学习入门(第五天)——决策树(每次选一边)

Decision tree 知识树 Knowledge tree 一个小故事 A story 挑苹果: 根据这些特征,如颜色是否是红色、硬度是否是硬、香味是否是香,如果全部满足绝对是好苹果,或者红色硬但是无味也是好苹果,从上图可以看出来&#…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1:解决思路2解决思路3(最终解决方案)后记 bug背景 项目中采用富文本编辑器后传参引起的bug,起因如下: 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1: 使用JSON方…

MyBatis的强大特性--动态SQL

目录 前言 if trim where set foreach 前言 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表…

【linux防火墙】设置开启路由转发,SNAT和DNAT转换原理及应用实操,添加自定义链归类iptables规则

目录 一、关于iptables规则的保存 1.1持久保存规则 1.2加载规则 1.3开机自动加载规则 1.4使用iptables-service软件来进行规则的保存和加载(不建议使用) 二、SNAT和DNAT的原理和应用 SNAT的原理与应用: DNAT的原理和应用: …

MySQL之 InnoDB逻辑存储结构

InnoDB逻辑存储结构 InnoDB将所有数据都存放在表空间中,表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。 页&#xff08…

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…

机器人RL数据集探索

机器人RL数据集探索 相关资料汇总 相关资料汇总

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值&#xff1a; 这样就很明显的看出来&#xff0c;hutool工具类的date是毫秒位多了.999,保存到mysql 的时候&#xff0c;MySQL数据库对于毫秒大于500的数据进行…

SPI学习

SPI介绍 SPI&#xff1a;串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步通信总线。 全双工&#xff1a;同一时刻&#xff0c;能同时接收数据和发送数据。 半双工&#xff1a;同一时刻&am…

树与二叉树堆:经典OJ题集

目录 查找值为x的结点&#xff1a; 思路分析&#xff1a; 单值二叉树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 相同的树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 二叉树的前序遍历&#xff1a;——使用前序遍历把结点元素放入数组中 题…

二分算法(整数二分、浮点数二分)

文章目录 二分一、整数二分&#xff08;一&#xff09;整数二分思路&#xff08;二&#xff09;整数二分算法模板1.左查找&#xff08;寻找左侧边界&#xff09;2.右查找&#xff08;寻找右侧边界&#xff09;3.总模板 &#xff08;三&#xff09;题目&#xff1a;数的范围 二、…

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

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

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

Vue生命周期:组件的生命之旅

&#x1f343;引言 在Vue.js中&#xff0c;每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子&#xff0c;对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

mysql mybatis分页查询 大数据量 非常慢

查阅了很多博客和资料&#xff0c;这篇文章以思路为准&#xff0c;详细代码不细说&#xff0c;都是非常简单的方法&#xff0c;一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题&#xff1a;单表数据已经达到4千万条数据&#xff0c;通过mybatis的分页查询效率非常低…

如何提高销售技巧,增加客户的成交率?

如何提高销售技巧&#xff0c;增加客户的成交率&#xff1f; 在如今的市场环境中&#xff0c;销售技巧的高低往往决定了你是否能够成功地打动客户的心。想要提高销售业绩&#xff0c;除了产品质量和服务的保障&#xff0c;更需要你精进销售技巧&#xff0c;从而让客户愿意为你…

一种快速设计射频功放IC流程分享

No.1设计目标 在功率放大器PA中&#xff0c;输出级以及输出匹配决定了该功放的线性度、效率等关键性能指标&#xff0c;通常被优先考虑。在这个项目中输出级功放关键性能指标如下&#xff1a; 带宽&#xff1a;12-13 GHz OP1dB>13dBm 输出级 Power gain>5dB DE_P1dB&…

TCP解帧解码、并发送有效数据到FPGA

TCP解帧解码、并发送有效数据到FPGA 工程的功能&#xff1a;使用TCP协议接收到网络调试助手发来的指令&#xff0c;将指令进行解帧&#xff0c;提取出帧头、有限数据、帧尾&#xff1b;再将有效数据发送到FPGA端的BRAM上&#xff0c;实现信息传递。 参考&#xff1a;正点原子启…