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

PostGIS之空间索引的更多相关文章

  1. mysql空间扩展 VS PostGIS

    http://www.cnblogs.com/LBSer/p/3629149.html 功能 Mysql spatial extension  PostGIS 空间索引 仅MyISAM支持R树索引,I ...

  2. Python访问PostGIS(建表、空间索引、分区表)

    #encoding: utf-8 __author__ = 'Administrator' import psycopg2 import ppygis import datetime import s ...

  3. PostgreSQL+PostGIS的使用 函数清单

    一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...

  4. MongoDB的地埋空间数据存储、空间索引以及空间查询

    一.关于MongoDB 在众多NoSQL数据库,MongoDB是一个优秀的产品.其官方介绍如下: MongoDB (from "humongous") is a scalable, ...

  5. RedHat7下PostGIS源码安装

    本文介绍在RedHat7环境下安装使用PostGIS的流程. 1. PostgreSQL 1.1 yum安装PostgreSQL 这个比较简单,直接使用yum安装即可. $ sudo yum inst ...

  6. 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  7. PostgreSQL+PostGIS 的使用

    一.PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ.3DM.4D坐标的支持. 1. OGC的WKB和WKT格式 OG ...

  8. PostgreSQL+PostGIS

    PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循O ...

  9. PostGIS 通过SQL语句实现空间分析【入门级】

    PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循OpenGIS的规范. ...

  10. PostGIS官方教程汇总目录

    一.PostGIS介绍 二.PostGIS安装 三.创建空间数据库 四.加载空间数据 五.数据 六.简单的SQL语句 七.几何图形(Geometry) 八.关于几何图形的练习 九.空间关系 十.空间连 ...

随机推荐

  1. sql周报

    数据库分类 1.关系型数据库 Mysql Qracle MariaDB PostgreSQL mysql:开源免费 使用最广 性价比最高 Oracle:收费 但安全性高 PostgreSQL:开源免费 ...

  2. 关于JavaScript每句结尾是否需要添加分号问题

    最近在学习JS的时候遇到这么一个问题.由于我之前的学习中一直是写一句JS代码,加一个分号.但是最近我才发现原来JS代码是可以不添加分号的.如果可以不写分号的话会不会更省事呢?于是我在网上查了相关资料整 ...

  3. 【ubuntu】解决无法打开终端:gnome-terminal找不到路径问题

    因为之前安装pyton的时候把电脑本身的python路径给改了,所以出现了这样的问题:图形化启动系统自带终端时,报错找不到gnome-terminal的路径 后来找到解决方法: 先桌面右键-终端(E) ...

  4. SQLMap入门——获取数据库的所有用户

    列出数据库中的所有用户 在当前用户有权读取包含所有用户的表的权限时,使用该命令列出所有管理用户 python sqlmap.py -u http://localhost/sqli-labs-maste ...

  5. 获取VIP歌曲

    """ 分析需求 1,确定目标网址 2,获取目标网址的所有数据 3,筛选我们想要的数据 4,下载歌曲保存 """ import os imp ...

  6. ssm——springMVC整理

    目录 1.概念 1.1.什么是SpringMVC 1.2.B/S架构 1.3.MVC结构 1.4.Spring MVC常用名词 1.5.常用注解 1.6.rest和restfull 1.7.Reque ...

  7. Apache Kafka 的基本概念

    基本概念 主题 Topic topic 是 Kafka 最基础的组织单位,类似于关系数据库中的数据表.做为使用 kafka 的开发者,你最应该考虑的是和 topoc 相关的抽象.创建不同的 topic ...

  8. Python网络爬虫get方法出现乱码的解决的三种方案

    给大家祭出网络爬虫过程中三种中文乱码的处理方案,希望对大家的学习有所帮助. 方案一 将requests.get().text改为requests.get().content 我们可以看到通过text( ...

  9. uniapp 开发微信小程序问题笔记

    最近接手了一个小程序开发,从头开始.使用了 uniapp 搭建,以前没有做过小程序开发,着手看文档.查文档.一步一步完成了任务的开发.特此记录开发过程中的问题. 开发建议: 使用 HBuilderX ...

  10. CF803G Periodic RMQ Problem

    简要题意 你需要维护一个序列 \(a\),有 \(q\) 个操作,支持: 1 l r x 将 \([l,r]\) 赋值为 \(x\). 2 l r 询问 \([l,r]\) 的最小值. 为了加大难度, ...