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_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

[2]PostGIS教程十:空间索引 - 知乎 (zhihu.com)

[3]PostGIS 3.3.3dev Manual

[4]PostGIS Cheat Sheet

最新文章

  1. Spring单例模式与线程安全
  2. MongoDB的安装和配置成服务的三种方法和一些难点
  3. TFS 自动同步Server 端文件的批处理命令
  4. SQL如何将A,B,C替换为'A','B','C'
  5. 1.后台如何获取 jquery get方式的ajax的参数
  6. 判断手机,pc方式登录
  7. <string> <string.h>
  8. [LeetCode]题解(python):095-Unique Binary Search Trees II
  9. inode和文件描述符区别
  10. xcode8 更新cocoapods
  11. MyBatis框架及原理分析
  12. java程序调用xfire发布的webService服务
  13. 20162318 实验三《 敏捷开发与XP实践》实验报告
  14. Hibernate异常之关键字错误
  15. React Native Flexbox & CSS3 Flexbox
  16. Django项目开发
  17. MySQL 自带4个默认数据库
  18. Android Studio添加原生库并自动构建
  19. 基于c#的windows基础设计(学习日记2)【关于多态】
  20. Balanced Numbers (数位dp+三进制)

热门文章

  1. 用最少的代码打造一个Mini版的gRPC框架
  2. O-MVLL:支持ARM64的基于LLVM的代码混淆模块
  3. 错误:org.springframework.beans.factory.BeanDefinitionStoreException:
  4. 通过 CancellationToken 提高 Web 性能
  5. Redis的数据复制
  6. jsvmp_wencai
  7. JavaScript:操作符:比较运算符及其隐式转换数据类型
  8. APICloud平台使用融云模块实现音视频通话实践经验总结分享
  9. 记录Typescript的学习调试笔记(比 javascript更具面向对象,强类型检查,静态字段,适合现代的大团队分工与管理风格).
  10. wkhtmltopdf 目录对象使用 及 目录样式分享