空间统计的几点想法

文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/sql

1. 背景

         在上一篇博客中提到了用ES来作搜索和统计,多个同行留言提醒用PG效率也能够很不错。本身查了些资料和文章,尤为是博友“遥想公瑾当年”一些列关于PG的文章,受益不浅。综合公司目前的实际状况,总结几点想法。docker

       因为公司项目太广(每一年大于500个项目现场在实施、维护),对于数据库和地理服务器根据甲方现场环境很难统一要求,按地理服务器主要分为:ArcGIS、SuperMap、Geoserver;按数据库主要分为:Oracle、Mysql、Postgresql。介于此,咱们以前将空间分析等逻辑经过适配三大地理服务器(OGC标准)来完成各项目的兼容,缺乏直接对数据库层面的操做。经过开发一些维护工具来进行统计类业务的预处理。数据库

  考虑到实时(或伪实时)空间统计的需求愈来愈多,将目标转向数据库层面是一个必然的趋势。尤为是如今数据库对于空间索引、各种坐标系的普遍支持,其稳定性、规避传输层问题、效率等都有明显优点。服务器

2. 采用PG进行统计

       a.首先要解决PG能通用于全部项目,能够提出项目实施规范,基于docker快速搭建PG环境。在甲方采购用Oracle等数据库时,依然基于规范要求必须部署PG以存储空间数据(业务数据可依然存放于Oracle)。微信

       b.基于区划信息统计通常分为网格、社区、街道、区、市等等。按照GIST索引的特性(类R树索引),其要素的四角范围对索引性能影响特别大。对于大范围查询,将大范围切分为小范围能够很是明显的优化查询效率。这里,咱们直接采用网格做为查询单元,经过网格查询结果构造社区、街道、区的查询结果,则会效率更好。工具

       c.空间数据来源于多种SHP数据,为了便于数据检索、查询、和效率的优化,设计空间信息目录表(资源关键信息整合表),基于该表进行统一的空间查询。性能

以2300个网格和260000个部件点要素进行效率验证,获取各网格中各种部件的数目,一共耗时5.6S:优化

 

3. 统计与数据更新如何同步的方案讨论

       空间数据并非一成不变的。因为统计数据来源于空间数据汇总表,而全部更新并非针对汇总表的更新,而是针对具体空间表(如井盖表)等的更新。如何能将更新数据实时同步至汇总表,统计表如何同步更新,是一个值得讨论的问题。spa

       真实项目中,数据统计的准确性并无要求彻底实时,这块能够做伪实时理解。因此问题能够简化为,天天(或几小时)空间统计表数据更新至最新统计结果。设计

       对应,这里给出四种方案:

3.1定时从新生成汇总表,从新统计

       这是思惟上最简单的一种方案,即用定时任务每次从新生成汇总表(将空间数据采集汇总),而后再从新生成统计表。此方案虽然简单,可是代价太大,尤为是全部数据的从新采集是一个比统计自己耗时太多的工做。

3.2利用触发器

       给每个空间数据表创建一个触发器,当数据表变动时,同步触发对汇总表的操做。对于空间统计表定时更新。

       此方案也比较简单,可是考虑到对全部空间表创建触发器,当更新频繁时对数据库性能有必定影响,还需慎重。

3.3利用中间件cannal进行数据库操做监听

       经过部署cannal监听数据库的操做,对符合定义的操做进行日志记录,定时更新至汇总表中。统计表定时更新。

       该方案的优势是不须要对全部表建立触发器,更为简洁优美,而且经过定时更新的方案,也能避免高频度操做时同步更新对数据库形成的压力。可是因为须要部署cannal,增长了项目的部署难度。

3.4系统操做日志记录

       在系统层面对数据库的操做进行单独日志记录。定时解析该日志文件,并更新汇总表。统计表定时更新。

       该方案无需特殊配置,只需经过代码完成日志写入和解析便可,部署简单,开发难度也不高。

       其中日志记录能够借用Log4j来快速完成,其支持对指定代码类生成独立日志。能够对数据库操做类进行独立设置,便可:

 

 

                    -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                           若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                

相关文章
相关标签/搜索