PostGIS之空间索引
1. 概述
PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询
PostGIS官网:About PostGIS | PostGIS
PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS
PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)
本文基于官方教程描述PostGIS中的空间索引
数据准备可参考:
数据介绍可参考:
2. 空间索引
2.1 R树索引
PostGIS使用的是R树索引,对于空间物体,计算其外包矩形
根据不同层级的外包矩形建立R树索引
2.2 索引速度测试
空间索引使得空间查询速度极大提升,以下是速度对比试验:
删除空间索引并查询Broad St地铁站所在的社区:
-- 1. 删除数据库自动创建的空间索引 DROP INDEX nyc_neighborhoods_geom_idx; -- 2. 查询Broad St的位置 -- SELECT ST_AsEWKT(geom) FROM nyc_subway_stations WHERE name = 'Broad St'; -- 空间位置为 SRID=26918;POINT(583571.9059213118 4506714.341192182) -- 3. 查询包含这个位置的社区 SELECT name FROM nyc_neighborhoods WHERE ST_Contains(geom, ST_GeomFromText('SRID=26918;POINT(583571.9059213118 4506714.341192182)'));
查询时间为6.423秒
创建空间索引并查询Broad St地铁站所在的社区:
-- 1. 创建数据表的空间索引 CREATE INDEX nyc_neighborhoods_geom_idx ON nyc_census_blocks USING GIST (geom); -- 2. 查询Broad St的位置 -- SELECT ST_AsEWKT(geom) FROM nyc_subway_stations WHERE name = 'Broad St'; -- 空间位置为 SRID=26918;POINT(583571.9059213118 4506714.341192182) -- 3. 查询包含这个位置的社区 SELECT name FROM nyc_neighborhoods WHERE ST_Contains(geom, ST_GeomFromText('SRID=26918;POINT(583571.9059213118 4506714.341192182)'));
查询时间为1.379秒,速度提升很大
2.3 支持空间索引的函数
不是所有函数都会使用空间索引的,如果存在空间索引,那么支持使用空间索引的函数会自动使用它。支持空间索引的空间函数主要有:
- ST_Intersects
- ST_Contains
- ST_Within
- ST_DWithin
- ST_ContainsProperly
- ST_CoveredBy
- ST_Covers
- ST_Overlaps
- ST_Crosses
- ST_DFullyWithin
- ST_3DIntersects
- ST_3DDWithin
- ST_3DDFullyWithin
- ST_LineCrossingDirection
- ST_OrderingEquals
- ST_Equals
前四个是查询中最常用的,ST_DWithin 对于 “一定距离内”、“一定半径内” 的查询是非常重要的,能获得指数级别的查询性能
2.4 使用索引进行运算
对于创建的空间物体的边界矩形,可以使用它作为快速判断,比如:
- && (A , B)Returns TRUE if A's 2D bounding box intersects B's 2D bounding box
- ~ (A, B) Returns TRUE if A's bounding box contains B's
比如使用 &&
来计算Broad St地铁站所在的社区:
SELECT name FROM nyc_neighborhoods WHERE geom && ST_GeomFromText('SRID=26918;POINT(583571.9059213118 4506714.341192182)');
2.5 清理与分析
PostGIS会Analyst和Vacuum进行信息统计和垃圾清理,也可手动执行:
-- 分析统计数据表 ANALYZE nyc_census_blocks; -- 清理分析数据 VACUUM ANALYZE nyc_census_blocks;
3. 参考资料
[1]15. 空间索引 — Introduction to PostGIS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具