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
[2]PostGIS教程十:空间索引 - 知乎 (zhihu.com)
PostGIS之空间索引的更多相关文章
- mysql空间扩展 VS PostGIS
http://www.cnblogs.com/LBSer/p/3629149.html 功能 Mysql spatial extension PostGIS 空间索引 仅MyISAM支持R树索引,I ...
- Python访问PostGIS(建表、空间索引、分区表)
#encoding: utf-8 __author__ = 'Administrator' import psycopg2 import ppygis import datetime import s ...
- PostgreSQL+PostGIS的使用 函数清单
一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...
- MongoDB的地埋空间数据存储、空间索引以及空间查询
一.关于MongoDB 在众多NoSQL数据库,MongoDB是一个优秀的产品.其官方介绍如下: MongoDB (from "humongous") is a scalable, ...
- RedHat7下PostGIS源码安装
本文介绍在RedHat7环境下安装使用PostGIS的流程. 1. PostgreSQL 1.1 yum安装PostgreSQL 这个比较简单,直接使用yum安装即可. $ sudo yum inst ...
- 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- PostgreSQL+PostGIS 的使用
一.PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ.3DM.4D坐标的支持. 1. OGC的WKB和WKT格式 OG ...
- PostgreSQL+PostGIS
PostGIS简介 PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循O ...
- PostGIS 通过SQL语句实现空间分析【入门级】
PostGIS是对象关系型数据库系统PostgreSQL的一个扩展,PostGIS提供如下空间信息服务功能:空间对象.空间索引.空间操作函数和空间操作符.同时,PostGIS遵循OpenGIS的规范. ...
- PostGIS官方教程汇总目录
一.PostGIS介绍 二.PostGIS安装 三.创建空间数据库 四.加载空间数据 五.数据 六.简单的SQL语句 七.几何图形(Geometry) 八.关于几何图形的练习 九.空间关系 十.空间连 ...
随机推荐
- DC-9靶场练习
Vulnhub靶场-DC-9 准备工作 kali和靶机都选择NAT模式(kali与靶机同网段) 下载链接:https://download.vulnhub.com/dc/DC-9.zip 一.主机发现 ...
- 使用Google OR-Tools分析过去20年中国金融资产最佳配置组合
前两天,在朋友圈里看到一张截至2022年Q2的金融资产历年收益图如下,图中列举了国内从2005年到2022年近20年主要的金融资产历年收益率,随产生想法分析和验证下面几个问题: 过去20年,基于怎样的 ...
- LeetCode HOT 100:组合总和
题目:39. 组合总和 题目描述: 给你一个没有重复元素的数组,和一个target目标值,返回数组中可以使数字和为目标数target的所有不同组合.什么叫组合?组合就是数组中任意数字组成的集合,不需要 ...
- IE浏览器卸载
1.打开此电脑,点击上箭头,打开控制面板: 2.选择卸载程序: 3.点击启用或关闭Windows功能: 4.弹出Windows功能对话框,找到Inetrnet Explorer 11,取消勾选: 5. ...
- uni框架引入外部图标
说明 在使用uni框架的uni-nav-bar自定义导航栏的时候我想要引用外部的图标,但是似乎这个好像只能引入uni框架内置的图标 所以我只能把uni的图标进行增加处理,这样引入图标的方式就和正常的引 ...
- week_3
Andrew Ng机器学习笔记 Week_3 -- -Logistic Regression This week, we'll be covering logistic regression. Log ...
- nuxt.js框架 如何打包 build
nuxt脚手架开发好项目后怎么打包 以下是脚手架的package.json部分代码 "scripts": { "dev": "cross-env NO ...
- Windows下Mariadb中文乱码问题
win10 在命令行使用Mariadb出现无法插入中文 并且之前正确插入的中文也无法正常显示了 ERROR 1366 (22007): Incorrect string value: '\xB1\xB ...
- day02-Promise
Promise 1.Promise基本介绍 Promise是异步编程的一种解决方案,可以解决传统Ajax回调函数嵌套问题. 传统的Ajax异步调用在需要多个操作的时候,会导致多个回调函数嵌套,导致代码 ...
- Redis哨兵集群搭建-Docker-Compose
title: Redis哨兵集群搭建(Docker-Compose) date: 2022-09-27 17:00:56 tags: - Redis 代码地址:https://github.com/l ...