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
相关文章:
PostGIS学习教程八:空间关系
PostGIS学习教程八:空间关系 到目前为止,我们只使用了测量(ST_Area、ST_Length)、序列化(ST_GeomFromText)或者反序列化(ST_AsGML)几何图形(geometry)的空间…...
ESP32-Web-Server编程- 通过文本框向 Web 提交数据
ESP32-Web-Server编程- 通过文本框向 Web 提交数据 概述 前述章节我们通过简单 HTML、AJAX、Websocket、SSE 在网页上显示数据,通过网页上的按钮控制 ESP32 的行为。从本节开始,我们将进一步了解通过网页与 ESP32 进行交互的方法。 实现更复杂的交互功…...
NAT网络地址转换
目录 什么是nat nat 实验如何使用SNAT 和 DNAT 实验环境 内网连接外网 1.给网关服务器添加网卡(两张网卡) 2.查看新添加的网卡名 编辑网卡配置 3.开启路由转发 4.打开内网服务器 5.切换到外网服务器(192.168.17.30࿰…...
PyTorch模型训练过程内存泄漏问题解决
近日,在模型训练过程中,发现过一段时间后进程会被kill,观察发现是由于内存泄漏问题造成的。通过逐行代码注释,发现问题在于数据集中的此行代码: info self.data_list[index]这里,self.data_list是dataset…...
【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据
【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据 引用: B. Schlining, R. Signell, A. Crosby, nctoolbox (2009), Github repository, https://github.com/nctoolbox/nctoolbox Brief summary: nctoolbox is a Matlab toolbox…...
pytorch训练模板
来源:http://worthpen.top/#/home/blog?blogpot-blog36.md 引言 本项目实现了基于PyTorch Lightning的神经网络训练和测试管道。项目除了实现PyTorch Lightning的工作流外,还实现了通过任务池在训练过程中添加任务、k折交叉验证、将训练结果保存在.cv…...
代码随想录二刷 |字符串 |反转字符串
代码随想录二刷 |字符串 |反转字符串 题目描述解题思路 & 代码实现 题目描述 344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须…...
Rust语言入门教程(九) - 结构体
格式及语法 在其他很多编程语言中,有类(Class)的存在,在Rust中,我们没有类(Class)的概念,我们使用结构体(Struct)。 与一个结构体相关的有以下几个部分: 数据字段方法关联函数 声明一个结构体及其字段的格式如下&am…...
如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问
文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景,在大量开发人员的努力下,已经开发出大…...
AI伪原创软件-AI伪原创工具下载
在当今数字化时代,创作者们在追求独特创意的同时,也面临着时间和灵感的双重挑战。AI伪原创技术应运而生,为创作者提供了一种快捷而便利的解决方案。本文将专心分享两款备受瞩目的AI伪原创工具,147SEO伪原创、百度文心一言伪原创&a…...
【python脚本】获取OneNET数据写入本地文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # pip install prettytable import time import urllib.request as req import json import os# 设备ID、Key # ESP-12F deviceId "1047311396" APIKey "z0Yq8d3P16l2SbEwuZcXZuCidM"# 上传函数 def OneN…...
5 存储器映射和寄存器
文章目录 5.3 芯片内核5.3.1 ICache5.3.2 DCache5.3.3 FlexRAM 5.4 存储器映射5.4.1 存储器功能划分5.4.1.1 存储器 Block0 内部区域功能划分5.4.1.2 储存器 Block1 内部区域功能划分5.4.1.3 储存器 Block2 内部区域功能划分 5.5 寄存器映射5.5.1 GPIO1的输出数据寄存器 5.3 芯…...
决策树学习
1. 背景 DT决策树是一种基本的分类与回归方法,其学习时,利用训练数据,根据损失函数最小化原则建立DT模型。 分类DT主要优点:模型具有可读性,分类速度快。 由DT树的根结点到叶结点的每一条路径构建一条规则&…...
如何在Ubuntu系统上安装Git
简单介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具CVS,Subversion 等不同,它采用了分布式版…...
Leetcode.974 和可被 K 整除的子数组
题目链接 Leetcode.974 和可被 K 整除的子数组 rating : 1676 题目描述 给定一个整数数组 n u m s nums nums 和一个整数 k k k ,返回其中元素之和可被 k k k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&…...
Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError
错误详情如下: building for production...Error processing file: static/css/app.3d5caae7aaba719754d7d5c30b864551.css (node:33011) UnhandledPromiseRejectionWarning: CssSyntaxError: /Users/yt/Documents/BM/sims-plus/sims-website/static/css/app.3d5caa…...
鸿蒙系统扫盲(三):鸿蒙开发用什么语言?
1.两种开发方向 我们常说鸿蒙开发,但是其实鸿蒙开发分为两个方向: 一个是系统级别的开发,比如驱动,内核和框架层的开发,这种开发以C/C为主 还有一个是应用级别的开发,在API7以及以下,还是支持…...
linux 中vmalloc实现简述
vmalloc 用途 vmalloc只用于内核模块的逻辑地址分配,也就是说它的逻辑地址是挂在init_mm的pgd页表上的。它可将几段不连续物理区域合并分配一个连续逻辑区域。主要用于内核和驱动。 vmalloc 实现 入口在__vmalloc_node_range。 首先分配一个vm_struct,…...
homeassistant 随笔
1.使用mushroom-strategy自动生成ui,隐藏中文ares,名字为区域的拼音,例如显示厨房则真实名字为chu_fang 隐藏图片中的工作室 代码为:...
带大家做一个,易上手的家常炒鸡蛋
想做这道菜 先准备五个鸡蛋 然后将鸡蛋打到碗里面 然后 加小半勺盐 这个看个人喜好 放多少都没问题 不要太咸就好 将鸡蛋搅拌均匀 起锅烧油 油温热了之后 放三个干辣椒进去炒 干辣椒烧黑后 捞出来 味道就留在油里了 然后 倒入鸡蛋液 翻炒 注意翻炒 不要粘锅底 或者 一面糊…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
