提升PostGIS大范围、大数据量分区几何裁剪统计查询速度技巧

news/2024/11/8 4:35:41/

 PostGIS是在GIS系统开发中常用的开源空间数据库,使用PostGIS进行大范围、大数据量的几何裁剪操作时,耗时较长。

当我遇到需要按区县或选中的乡镇,计算展示林规、土地报批等多个规划数据的面积等,此时需要使用规划数据叠加行政界线进行裁剪计算,因为行政界线是固定的,那么此时我们可以通过构建实体化视图的方式,对矢量数据进行预裁剪,从而将空间裁剪查询转换成普通字段关系查询,经过验证,速度可提高250倍左右。下面以计算一个乡镇的林规面积为例。

一、实时裁剪计算方法

通过使用PostGIS函数进去实时裁剪计算

1.SQL执行语句

SELECT sum(st_area(st_intersection(bf.geom, (SELECT bt.geom  as geom FROM bd_town bt WHERE bt.id = '3201d5f0-ef09-46ee-8593-73b41ae4e598')))) FROM bd_forestry_plan bf 
WHERE st_intersects(bf.geom, (SELECT bt.geom  as geom FROM bd_town bt WHERE bt.id = '3201d5f0-ef09-46ee-8593-73b41ae4e598'))

2.执行耗时

从下图可以看到耗时约5秒

图1 空间裁剪查询执行耗时

二、使用实体化视图方法

1.实体化视图构建

此处使用navcat连接数据库,并使用视图构建工具辅助构建实体化视图。在视图中执行按行政界线进行几何裁剪,构建的SQL语句如下。

SELECT DISTINCT bf.id,bf.bh_dj,bf.lyfq,bf.qykz,bf.version,bf.bh_dj_mc,bv.id AS villageid,bv.townid,st_intersection(bf.geom, bv.geom) AS geomFROM (bd_forestry_plan bfJOIN bd_village bv ON (st_intersects(bf.geom, bv.geom)))

 2.实体化视图构建成果

 图2 实体化视图构建成果

3.实体化视图使用

视图中构建出来的虚拟表林规数据,已经按行政界线裁剪好,并赋予了行政界线的id,即通过行政界线id进行关联查询即可,下面是查询SQL和执行结果,可以看到耗时约0.02秒,极大提高了速度。

SELECT sum(st_area(bf.geom)) FROM bd_forestry_plan_home_evw bf WHERE bf.townid = '3201d5f0-ef09-46ee-8593-73b41ae4e598'

 

图3 实体化视图查询耗时

三、总结

1.优势

实体化视图会在数据库中生成数据缓存,相当于普通表,故在查询时不会重新执行一次构建视图SQL。建立实体化视图后,等于事先将林规按行政界线裁剪好了,查询时直接使用关系查询而非空间查询,达到提高查询速度的目的

2.使用限制

因为实体化视图会生成缓存,故不会因为源表更新后自动刷新视图数据,而且数据量大时,刷新视图耗时间较大。因为只适用于更新不频繁的基础数据使用,例如:林规,土规等

3.注意事项

在更新源表数据后,应执行一次刷新视图操作,同步视图数据。并且只有使用实体化视图才能达到提高速度的目的,而使用普通视图无效。关注薇信工众号“GIS工具乐园”,有更多教程技术分享哦


http://www.ppmy.cn/news/99850.html

相关文章

Eclipse Ⅶ

哈喽各位,今天继续分享第七部分的内容,喜欢可以点赞和收藏,这是我的动力来源hahahhah! 今天谈谈Eclipse 生成 jar 包、Eclipse 关闭项目以及Eclipse 编译项目。 废话不多说,开始咯! Eclipse 生成 jar 包…

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…

Flume系列:案例-Flume负载均衡和故障转移

目录 Apache Hadoop生态-目录汇总-持续更新 逻辑: 2:案例需求-实现故障转移 3:实现步骤: 2.1:实现flume1.conf 2.2:实现flume2.conf - 端口4141 2.3:实现flume3.conf - 端口4142 3&#…

数控加工插补功能指令

1、G00—快速定位指令 格式:G00 XYZ; 格式含义:G00 指令使刀具以点位控制方式从刀具当前点以最快速度运动到另一点。其轨 迹不一定是两点一线,有可能是一条折线。 须知:(1)刀具从上向下移动时&a…

chapter6:SpringBoot与Docker

1. 简介 Docker是一个开源的轻量级应用容器引擎, 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到Linux机器中实现虚拟化。(沙箱机制) Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像…

如何在华为OD机试中获得满分?Java实现【比赛评分】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 一个有N个选手参加比赛,…

NIO编程总结

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题…

JAVA之数组2

添加元素 从后往前进行迭代,最后在末尾插入元素 tip:为避免数字在覆盖过程中丢失,故从后往前覆盖 删除元素 从前往后迭代,最后将末尾赋值为0 tip: 以覆盖的数arr【i】为基准,构造循环 共同处Tip: 范围均为【index1&…