PostGis空间(下):空间连接与空间索引

在这里插入图片描述

目录

  • 1、简介
  • 2、空间连接
  • 3、空间索引
    • 3.1 索引操作
    • 3.2 空间索引的工作原理
      • 3.2.1 R-Tree
    • 3.3 空间索引函数
    • 3.4 仅索引查询
    • 3.5 ANALYZE
    • 3.6 VACUUMing
    • 3.7 函数列表
  • PS


1024到啦!!!
先祝各位程序员或者想成为程序员正在奋斗中的伙伴1024程序员节快乐~
我也是今年应届毕业成为了JavaCoder的一员哈,属于程序员小新秀,祝我们技术高涨,薪资高涨,头发不减!!!

1、简介

这篇文章紧接着上一篇的PostGis--空间(上)
还没看过朋友可以先看这两篇文章:
PostGIS–介绍
PostGis–空间(上)
PostGIS的空间连接和空间索引技术是高效处理地理数据的关键。空间连接利用ST_Intersects、ST_Contains等函数实现复杂的空间关系查询。空间索引,特别是R-Tree结构,大幅提升了大规模空间数据的查询效率。空间索引的创建、维护和优化方法,包括ANALYZE和VACUUM操作,为构建高性能地理信息系统提供了实用指南。这些技术的掌握对于优化空间数据库性能和进行复杂空间分析至关重要。

2、空间连接

任何在两个表之间提供真/假关系的函数都可用于驱动空间联接,但最常用的函数是:ST_IntersectsST_ContainsST_DWithin

  • ST_Contains(几何 A,几何 B):当且仅当 B 的点不在 A 的外部,并且 B 的内部至少有一个点位于 A 的内部时,返回 true。
  • ST_DWithin(geometry A, geometry B, radius):如果几何体彼此之间的距离在指定的距离内,则返回 true。
  • ST_Intersects(geometry A, geometry B):如果几何/地理“在空间上相交”,则返回 TRUE(共享空间的任何部分),如果它们不相交(它们不相交),则返回 FALSE。
  • round(v numeric, s integer):四舍五入到小数点后 s 位的 PostgreSQL 数学函数
  • strpos(string, substring):PostgreSQL 字符串函数,返回指定子字符串的整数位置。
  • sum(expression):PostgreSQL 聚合函数,返回一组记录中的记录总和。

3、空间索引

空间索引是空间数据库的三个关键特征之一。索引使使用空间数据库作为大型数据集成为可能。如果没有索引,任何对要素的搜索都需要对数据库中的每条记录进行“顺序扫描”。索引通过将数据组织到搜索树中来加快搜索速度,该搜索树可以快速遍历以查找特定记录。
空间索引是PostGIS最大的资产之一。在前面的示例中,构建空间联接需要将整个表相互比较。这可能会变得非常昂贵:连接两个表,每个表有 10,000 条记录,而没有索引,需要 100,000,000 次比较;使用索引,成本可能低至 20,000 次比较。

3.1 索引操作

-- 删除索引
DROP INDEX nyc_census_blocks_geom_idx;-- 创建索引
-- 该子句告诉 PostgreSQL 在构建索引时使用通用索引结构 (GIST)。
-- 如果在创建索引时收到类似此类的错误,则可能忽略了添加该子句。
-- USING GISTERROR: index row requires 11340 bytes, maximum size is 8191USING GIST
CREATE INDEX nyc_census_blocks_geom_idxON nyc_census_blocksUSING GIST (geom);

3.2 空间索引的工作原理

标准数据库索引根据要编制索引的列的值创建分层树。空间索引略有不同,它们无法对几何要素本身进行索引,而是对要素的边界框进行索引。
在这里插入图片描述

在上图中,与黄色星星相交的线数是一条,即红线。但是与黄色框相交的特征边界框两个,即红色和蓝色。

3.2.1 R-Tree

R树是B树向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的 所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。R树是一种动态索引结构
在这里插入图片描述

3.3 空间索引函数

  1. ST_Intersects:
    ○ 判断两个几何图形是否相交。如果两个图形有任何共享点(包括边界和内部),此函数返回真(true)。
  2. ST_Contains:
    ○ 检查第一个几何图形是否完全包含第二个几何图形。如果第二个图形的所有点都在第一个图形的内部,返回真。
  3. ST_Within:
    ○ 检查第一个几何图形是否完全位于第二个几何图形内部。这是ST_Contains的逆操作。
  4. ST_DWithin:
    ○ 判断两个几何图形之间的距离是否在指定的距离之内。这对于找出“近”某个点或图形的其他点或图形特别有用。
  5. ST_ContainsProperly:
    ○ 类似于ST_Contains,但更严格。它返回真只在第一个几何完全包含第二个,并且二者不仅是接触边界。
  6. ST_CoveredBy:
    ○ 判断第一个几何图形是否被第二个几何图形覆盖。如果第一个图形的所有点都在第二个图形中,或者在其边界上,返回真。
  7. ST_Covers:
    ○ 检查第一个几何图形是否覆盖第二个几何图形。这是ST_CoveredBy的逆操作。
  8. ST_Overlaps:
    ○ 检查两个几何图形是否在两者都不被对方完全包含的情况下共享一些部分区域。
  9. ST_Crosses:
    ○ 判断两个几何图形是否在内部相交,但不完全包含对方。这通常用于不同维度的图形,例如线与多边形。
  10. ST_DFullyWithin:
    ○ 类似于ST_DWithin,但要求两个几何体之间的每个点的距离都必须在指定距离之内。
  11. ST_3DIntersects:
    ○ 在三维空间中检查两个几何体是否相交。
  12. ST_3DDWithin:
    ○ 在三维空间中,检查两个几何体之间的距离是否在指定的距离内。
  13. ST_3DDFullyWithin:
    ○ 在三维空间中,这是ST_DFullyWithin的一个版本,确保所有点的距离都在给定距离之内。
  14. ST_LineCrossingDirection:
    ○ 确定两条线的交叉方向。这个函数返回一个整数,表明线是如何相交的(比如从左到右,从右到左等)。
  15. ST_OrderingEquals:
    ○ 如果两个几何图形在空间中的点序列完全一致,则返回真。这常用于检查两个几何图形是否完全相同。
  16. ST_Equals:
    ○ 检查两个几何图形是否在空间上等同,忽略点的顺序。

3.4 仅索引查询

PostGIS 中大多数常用函数(ST_Contains、ST_Intersects、ST_DWithin 等)都自动包含索引过滤器。但某些函数(例如,ST_Relate)不包括索引筛选器。
要使用索引(不过滤)进行边界框搜索,请使用 && 运算符。对于几何图形,&&运算符表示“边界框重叠或接触”,就像对于数字,=运算符表示“值相同”。

3.5 ANALYZE

在这里插入图片描述

-- 用于收集有关指定表的统计信息,这里的表名为 nyc_census_blocks。
-- 这些统计信息主要用于优化查询计划器的决策过程,从而提高查询效率。
ANALYZE nyc_census_blocks;作用
收集统计数据
优化查询性能
自动和手动触发重要性
查询计划的准确性
处理数据倾斜
维护和自动化在数据库维护中,ANALYZE 是一个重要的工具,它可以被集成到定期维护脚本中,
以自动化这一过程,确保数据库性能的持续优化。
总结来说,ANALYZE nyc_census_blocks; 是一个关键的数据库维护命令,
用于确保查询性能通过准确和及时的统计数据得到优化。
这对于维护查询响应时间和整体数据库性能至关重要。

3.6 VACUUMing

仅仅创建一个索引并不足以让PostgreSQL有效地使用它。每当对表发出大量 UPDATE、INSERT 或 DELETE 时,都必须执行 VACUUMing。该命令要求 PostgreSQL 回收表页中因更新或删除记录而留下的任何未使用空间。

VACUUM可以根据需要单独执行数据库的清空和分析。发出命令不会更新数据库统计信息;同样,发出命令也不会恢复未使用的表行。这两个命令都可以针对整个数据库、单个表或单个列运行。

VACUUM ANALYZE nyc_census_blocks;
  1. VACUUM:
    功能: VACUUM 操作用于回收数据库表中的空闲空间,这个空间是由于数据删除和更新操作留下的。这不仅有助于释放存储空间,还可以避免表内部碎片化,从而提高数据库查询的效率。
    细节: PostgreSQL 中的事务性特性意味着,当数据被删除或更新时,旧的数据版本并不会立即从物理存储中移除。这样做是为了支持并发控制和事务回滚。VACUUM 正是用来清理这些不再需要的数据版本的。
  2. ANALYZE:
    功能: ANALYZE 操作用于更新表的统计信息,这些信息对于数据库优化器(Planner/Optimizer)选择最佳执行计划至关重要。统计信息包括数据的分布情况、列值的频率等。
    细节: 数据库优化器使用这些统计信息来评估不同查询操作的成本,如何高效地执行查询(例如,决定使用哪种类型的索引,是否执行表连接等)。如果统计信息不准确,可能导致数据库选择了非最优的执行计划,影响查询性能。

3.7 函数列表

geometry_a && geometry_b:如果 A 的边界框与 B 的边界框重叠,则返回 TRUE。
geometry_a = geometry_b:如果 A 的边界框与 B 的边界框相同,则返回 TRUE。
ST_Intersects(geometry_a, geometry_b):如果几何/地理“在空间上相交”(共享空间的任何部分),则返回 TRUE,如果它们不相交(它们不相交),则返回 FALSE。


PS

大家好,我是小健,Java开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~

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

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

相关文章

JavaScript进阶:手写代码挑战(二)

​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript手写代码篇 在现代Web开发中,JavaScript 是不可或缺的编程语言…

Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨…

Mac 使用 zsh 终端提示 zsh: killed 的问题

我的脚本的内容为: #!/bin/bashset -epids$(ps -ef | grep consul | grep -v grep | awk {print $2})for pid in $pids; doecho "kill process: $pid"kill -9 $pid donecd $(dirname $0)nohup ./consul agent -dev > nohup.log &可以看到这是一个…

阿里云项目启动OOM问题解决

问题描述 随着项目业务的增长,系统启动时内存紧张,每次第一次启动的时候就会出现oom第二次或者第n的时候,就启动成功了。 带着这个疑问,我就在阿里云上提交了工单,咨询为什么第一次提交失败但是后面却能提交成功尼&a…

Matlab学习01-矩阵

目录 一,矩阵的创建 1,直接输入法创建矩阵 2,利用M文件创建矩阵 3,利用其它文本编辑器创建矩阵 二,矩阵的拼接 1,基本拼接 1) 水平方向的拼接 2)垂直方向的拼接 3&#xf…

shell脚本-函数

文章目录 一、函数介绍什么是函数、为什么使用函数、如何使用函数 二、shell脚本中如何定义函数Way1Way2Way3 三、shell脚本中如何调用函数四、shell脚本中使用内置变量(1、#、?、2等等)五、函数的返回值、shell脚本中函数的返回值函数的返回值概念shell脚本中函数的返回值ret…

梦金园三闯港交所上市:年营收200亿元,靠加盟模式取胜

近日,梦金园黄金珠宝集团股份有限公司(以下简称“梦金园”)向港交所递交IPO申请,中信证券为其独家保荐人。贝多财经了解到,这已经是梦金园第三次向港股发起冲击,此前曾于2023年9月、2024年4月两度递表。 继…

刷题 - 图论

1 | bfs/dfs | 网格染色 200. 岛屿数量 访问到马上就染色(将visited标为 true)auto [cur_x, cur_y] que.front(); 结构化绑定(C17)也可以不使用 visited数组,直接修改原始数组时间复杂度: O(n * m),最多将 visited 数…

Deepinteraction 深度交互:通过模态交互的3D对象检测

一.前提 为什么要采用跨模态的信息融合? 点云在低分辨率下提供必要的定位和几何信息,而图像在高分辨率下提供丰富的外观信息。 -->因此必须采用跨模态的信息融合 提出的原因? 传统的融合办法可能会由于信息融合到统一表示中的不太完美而丢失很大一部分特定…

磁珠的工作原理:【图文讲解】

1:什么是磁珠 磁珠是一种被动组件,用来抑制电路中的高频噪声。磁珠是一种特别的扼流圈,其成分多半为铁氧体,利用其高频电流产生的热耗散来抑制高频噪声。磁珠有时也称为磁环、EMI滤波器、铁芯等。 磁珠是滤波常用的器件&#xf…

SpringMVC常用注解

RequestMapping接口的映射,可以将HTTP请求映射到控制器方法上,通过这个注解使用不同的映射,就可以区分不同的控制器,其中RequestMapping中还有不同的属性,比如method,params,produces等在这里我…

快速搭建SpringBoot3+Prometheus+Grafana

快速搭建SpringBoot3PrometheusGrafana 一、搭建SpringBoot项目 1.1 创建SpringBoot项目 1.2 修改pom文件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

25年山东高考报名时间为10月23日-29日

今日&#xff0c;山东省招生考试院发布关于《山东省2025年普通高等学校招生考试报名工作的通知》 其中高考报名时间定为&#xff1a;2024年10月23日29日&#xff08;每天9&#xff1a;0018&#xff1a;00&#xff09; 资格审查时间为&#xff1a;10月30日~11月11日 网上缴费时间…

Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0

文章目录 前言开发环境问题描述问题分析1. 适配Java 212. 适配AGP 8.0 解决方案补充内容最后 前言 Android Studio版本从Koala Feature Drop升级到Ladybug&#xff0c;出现了一系列报错。 开发环境 Flutter: 3.24.3Android Studio: 2024.2.1 Patch 1Java: 21.0.3Gradle: 7.4…

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

高效改进!防止DataX从HDFS导入关系型数据库丢数据

高效改进&#xff01;防止DataX从HDFS导入关系型数据库丢数据 针对DataX在从HDFS导入数据到关系型数据库过程中的数据丢失问题&#xff0c;优化了分片处理代码。改动包括将之前单一分片处理逻辑重构为循环处理所有分片&#xff0c;确保了每个分片数据都得到全面读取和传输&…

Git文件操作指令和文件状态

一、Git 文件操作指令 1、查看指定文件的状态 git status [filename] 我们在新创建且初始化过后的 git 仓库中新建一个 文件&#xff0c;然后在 git 的命令行中输入此指令后&#xff0c;就可以看到 的状态&#xff1a; 在此显示的是 Untracked 的状态&#xff0c;也就是未…

visual studio设置修改文件字符集方法

该方法来自网文&#xff0c;特此记录备忘。 添加两个组件&#xff0c;分别是Force UTF-8,FileEncoding。 截图如下&#xff1a; 方法如下&#xff1a;vs中点击“扩展”->“管理扩展”&#xff0c;输入utf搜索&#xff0c;安装如下两个插件&#xff0c;然后重启vs&#xf…

【pytorch DistributedDataParallel 及amp 使用过程遇到的问题记录 】

目录 环境问题单机多卡时&#xff1a;超时错误部分报错内容:解决方法: 存在没有使用梯度的参数报错内容:解决方法:方法1 找到不参与梯度计算的层**且**没有用处的层&#xff0c;删除方法2 DistributedDataParallel 增加参数:find_unused_parameters True DDP 训练时第一个batc…

2 两数相加

解题思路&#xff1a; \qquad 这道题可以用模拟很直观的解决&#xff0c;模式加法的计算过程&#xff0c;只不过套了一层链表的外衣。题目给出的数字在链表中是按照逆序排列的&#xff0c;即链表头节点的值代表相加数字的个位&#xff0c;这样只需要从链表头开始计算加法即可得…