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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在这里插入图片描述


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_idx
  ON nyc_census_blocks
  USING 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开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~

从GeoJSON到PostGIS:手把手教你搞定空间数据入库可视化(附QGIS操作) 本文详细介绍了如何将GeoJSON空间数据导入PostGIS数据库并进行可视化分析的全过程。从环境准备、数据预处理到PostGIS操作和QGIS可视化,涵盖了坐标系转换、几何校验等关键步骤,帮助开发者高效处理空间数据。特别适合需要处理地理信息的GIS开发者和数据分析师。 阅读详情

相关推荐

MySQL---空间索引、验证索引索引特点、索引原理

重复数据多的字段不应设为索引(比如性别,只有男和女,一般来说:重复的数据超过百分之15就。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁。对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度。创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加;但是不能进行范围查找,因为散列表中的值是无序的,无法进行大小的比较。关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引空间索引是对空间数据类型的字段建立的索引,MYSQL。

weixin_43961909的博客 1382

R-Tree:空间索引技术原理及实现详解

R-Tree是一种用于索引多维空间对象(如点、线、多边形等)的树形数据结构。R-Tree的每个节点都包含一定数量的条目(entry),每个条目都指向一个子节点或一个空间对象,并包含一个包围盒(bounding box),用于表示该条目所指向的空间对象的范围。R-Tree的构造过程是一个递归的过程,从根节点开始,不断将空间划分为更小的区域,直到每个区域只包含一个空间对象或达到预定的分裂阈值。R-Tree相比于传统的B-Tree等数据结构,在空间查询上具有更高的效率,尤其是在处理大量空间数据时表现出色。

铭渊老黄 1396

GIS开发——空间索引

在各种数据库系统中,地理空间索引的实现和使用方式可能略有不同,下面将介绍几种常见数据库系统中地理空间索引的基本概念和用法。索引的管理和优化:索引的存在会增加数据的存储空间和维护成本,同时过多或不必要的索引可能会导致插入、更新和删除操作的性能下降。一个表可以拥有多个索引:根据查询的需要和数据库设计的复杂性,一个表可以有多个不同的索引,每个索引针对不同的查询模式或者频繁使用的字段。混合索引:在一些数据库中,可以将空间索引常规索引(如 B 树索引)结合使用,以优化复杂查询的性能。

m0_46543935的博客 1730

常见的空间索引方法

在谈论空间索引之前,我们必须了解索引的概念。索引是为了提高数据集的检索效率。打个比喻,一本书的目录就是这本书的内容的“索引”,我们查看感兴趣的内容前,通过查看书的目录去快速查找对应的内容,而不是一字一句地找我们感兴趣的内容。所以,索引是一种“前人栽树,后人乘凉”的东西。 空间索引不同于书本“目录”,“目录”对应的书本内容是不变的,而我们讨论的空间索引是根据空间数据...

Amesteur的博客 2万+

PostGIS教程十:空间索引

虽然这对于高度事务性的数据库是必不可少的功能,但在添加索引或大容量数据之后等待自动清理运行是不明智的,如果执行大批量更新,则应该手动运行VACUUM命令。为了弄清楚要处理的数据的大概内容(读取表的一小部分信息,而不是读取表的大部分信息),PostgreSQL保存每个索引列中数据分布的。的思想,就像显微镜一样有粗粒度的调整和细粒度的调整。命令要求PostgreSQL回收表页面中因记录的更新或删除而留下的任何未使用的空间。的情况下,对要素的任何搜索都需要对数据库中的每条记录进行"顺序扫描"。

挣钱花388的博客 1409

PostGIS-空间连接空间索引空间连接

虽然这对于高度事务性的数据库是必不可少的功能,但在添加索引或大容量数据之后等待自动清理运行是不明智的,如果执行大批量更新,则应该手动运行VACUUM命令。为了弄清楚要处理的数据的大概内容(读取表的一小部分信息,而不是读取表的大部分信息),PostgreSQL保存每个索引列中数据分布的。但是,如果你在短时间内更改了表的构成,则统计数据将不会是最新的。的思想,就像显微镜一样有粗粒度的调整和细粒度的调整。命令要求PostgreSQL回收表页面中因记录的更新或删除而留下的任何未使用的空间

u011208883的博客 712

python连接postgis_Python访问PostGIS(建表、空间索引、分区表)

#encoding: utf-8__author__ = ‘Administrator‘import psycopg2import ppygisimport datetimeimport stringimport sysimport loggingimport GeowayLoggerreload(sys)#中文错误sys.setdefaultencoding( "utf-8" )vLog = G...

weixin_33103945的博客 1262

kartoza/docker-geoserverPostGIS完美结合:空间数据存储最佳实践

kartoza/docker-geoserver是一个基于Docker的GeoServer部署方案,它PostGIS数据库的无缝集成,为空间数据管理提供了高效、可靠的解决方案。本文将详细介绍如何通过docker-compose实现两者的完美结合,打造专业的地理信息服务平台。 ## 为什么选择GeoServer+PostGIS组合? GeoServer作为开源的地理空间数据服务器,能够发布、管

gitblog_00797的博客 463

PostGISQGIS的协同工作流:从数据创建到空间分析的完整指南

本文详细介绍了PostGISQGIS的协同工作流,从空间数据创建到高级空间分析的完整指南。通过优化PostgreSQLPostGIS部署、QGIS交互技巧及实战空间分析示例,帮助用户高效管理地理空间数据,提升城市规划、环境监测等领域的分析效率。重点展示了PostGIS空间QGIS空间图层的无缝集成性能优化策略。

wdx0123456的博客 1012

空间连接聚合实战:从PostGIS到Geopandas的高效总和计算

空间连接是地理信息系统(GIS)和空间数据分析中的核心操作,其本质是通过几何位置关系将不同图层的数据关联起来。其原理主要依赖空间索引(如R-Tree)来加速查询,通过判断点、线、面之间的拓扑关系(如包含、相交)实现高效匹配。这项技术的核心价值在于能将离散的空间事件(如订单点)汇总到对应的区域面中,从而支持基于地理单元的统计分析决策。在实际应用中,它广泛服务于城市规划、商业选址、物流配送和人口统计等多个场景。本文聚焦于**空间连接**过程中进行**总和计算**这一高频且易出性能瓶颈的具体任务,通过剖析传统方

angel192939的博客 372

TegolaPostGIS集成指南:打造高效空间数据服务

Tegola是一个用Go语言编写的Mapbox Vector Tile服务器,能够将空间数据高效地转换为矢量瓦片服务。本指南将详细介绍如何将TegolaPostGIS集成,构建高性能的空间数据服务,帮助新手和普通用户快速上手这一强大组合。 ## 为什么选择TegolaPostGIS? TegolaPostGIS的组合为空间数据服务提供了卓越的性能和灵活性。PostGIS作为功能强大的空间

gitblog_01066的博客 427

空间聚合分析实战:从PostGIS到GeoPandas的高效点面数据汇总

空间连接是地理信息系统(GIS)和空间数据分析中的核心操作,它基于几何位置关系(如包含、相交)而非属性匹配来关联不同图层的数据。其原理是通过空间谓词(如ST_Within、ST_Intersects)建立对象间的拓扑关系,从而实现数据的关联查询。这项技术的核心价值在于能将离散的空间观测(如点)有意义的空间单元(如面)进行整合,为区域统计、资源评估和模式发现提供基础。在实际应用中,它广泛服务于商业选址分析、城市规划、物联网设备管理和环境监测等领域,例如计算每个行政区的零售总额或每个网格的传感器读数总和。本文

dielucui7698的博客 485

PostGIS数据库配置gdb数据高效导入实战

本文详细介绍了PostGIS数据库的配置gdb数据高效导入的实战技巧,包括PostgreSQL安装避坑、PostGIS插件安装、GDAL环境配置及QGIS连接优化等关键步骤。通过智能参数组合和批量导入脚本,显著提升gdb数据导入效率,适合GIS开发者和数据分析师参考。

weixin_42540248的博客 362

PostGIS 3.3 空间查询优化:基于省市经纬度范围实现10倍速区域关联统计

本文深入解析PostGIS 3.3在空间查询优化中的最新特性,通过省市经纬度范围实现10倍速区域关联统计。从数据准备、索引优化到查询方案对比,提供完整的工程实现路径,特别适合LBS应用开发者提升海量坐标点处理效率。

cqbh2011的博客 336

PostGIS空间分析实战:从数据准备到核心函数应用

本文详细介绍了PostGIS空间分析的实战技巧,从数据准备到核心函数应用。通过创建空间数据表、优化空间查询、缓冲区分析、空间度量计算等实例,帮助开发者高效处理空间数据。特别强调了ST_Intersects、ST_Buffer等核心函数的应用场景和性能优化方法,适用于智慧城市、地理信息系统等领域的空间分析需求。

weixin_33717117的博客 252

空间数据处理瓶颈怎么破?R + PostGIS协同优化的5大核心技术

突破空间数据处理瓶颈,掌握R语言PostgreSQL空间数据交互关键。结合PostGIS空间查询R的地理可视化,详解批量加载、索引优化、并行计算等5大协同技术,提升大数据场景下分析效率。适用于城市规划、环境建模等领域,值得收藏。

Algorift的博客 791

PostGIS2

postgis 1.简单查询 示例数据:美国纽约街道人口普查数据 查询人口大于5000普查区域 SELECT * FROM nyc_census_blocks_2000 WHERE popn_total > 5000 ; 计算总人口 SELECT sum(popn_total)as population FROM nyc_census_blocks_2000计算平均值 SELECT a

GIS 633

PostGIS总结

PostGreSQL(三)PostGIS PostGreSQL(四)PostGIS-空间数据存储 PostGreSQL(五)PostGIS-常用函数 PostGreSQL(六)PostGIS-空间连接空间索引 PostGreSQL(七)PostGIS-几何图形创建函数 PostGreSQL(八)PostGIS-图形有效性和简单性 PostGreSQL(九)PostGIS-几何图形的相等 PostGreSQL(十)PostGIS-最近领域搜索 PostGreSQL(十一)PostGIS-其他函数 一、P.

爱是与世界平行 7765

SpringBoot应用PostGIS性能调优指南

分析日志,优先优化高频查询(遵循帕累托法则:$ \frac{20% \text{的查询}}{80% \text{的负载}} $)

2501_93878551的博客 370
上一篇: PostGis空间(上):常见空间关联函数全解析
下一篇: PostGis--地理以及投影数据
爱学习的小健
博客等级 码龄7年 152粉丝 81原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值