点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

百万级要素优化:基于 PG 与 PostGIS 的实时矢量瓦片服务

  • 2020-07-31
  • 本文字数:1970 字

    阅读完需:约 6 分钟

百万级要素优化:基于PG与PostGIS的实时矢量瓦片服务

本文由 dbaplus 社群授权转载。


之前介绍了如何使用 PG 与 PostGIS 搭建实时矢量瓦片服务,但未介绍如何做优化,对于日常项目使用基本可以满足。这篇文章主要试介绍如何浏览百万级要素,示例为 300 万点要素。


《基于 PG 与 PostGIS 搭建实时矢量瓦片服务》:https://blog.csdn.net/qq_35241223/article/details/106439268

背景介绍

对于某些应用场景,数据量很容易达到百万级要素,数据每天都在改变。而且还要考虑在 1-6 级这种小级别时候的数据展示,那么这个时候仅仅是 PG 与 PostGIS 简单的矢量瓦片服务比较困难达到客户想要的效果,这个时候就要考虑做一些优化了。

优化方法

百万级要素优化对于不同的业务来说,有相应不同的解决办法,没有最好,只有更好,这个时候要做考量,下面介绍几个常用的会考虑使用的方法:


1、依据业务,对要素进行抽稀过滤


根据业务层面,在不同场景浏览不同的要素,虽然总的要素在几百万,但是这个时候过滤一部分后剩余要素可以进行实时矢量瓦片展示。


2、几种抽稀过滤的算法


除第一种方法外,其余几种方法包含一些个人的想法与思路,其它小伙伴有其他好的思路,或者对我的想法思路有疑问的话,欢迎在评论区留言。


1)道格拉斯-普客算法(DP)


该算法个人理解为是简化的算法,对于线或者面的边界,可以使用该算法对节点进行抽稀,达到对线或者面的简化。但是为什么在点要素抽稀过滤中也介绍该算法呢?


答案:在轨迹数据中,每一次存储的都是点位信息(点),所以对于该种数据可以使用该算法进行过滤,但是对于一个点即代表一种信息的数据来说,该算法不太适用。


2)基于网格的抽稀过滤算法


该算法结果为均匀分布。


  1. 根据数据范围以及阈值将范围划分网格。

  2. 遍历网格,利用网格与数据求交(使用 PostgreSQL 的 gist 索引,加快速度),计算交到的要素。

  3. 将交到要素随机选取一个,其余要素舍弃。

  4. 遍历完网格后,即可完成要素过滤。


本人写了一个简单的实现,供各位参考。


github 链接:https://github.com/MrSmallLiu/point_dilution


3)基于距离的抽稀过滤算法


该算法结果为均匀分布。


  1. 设置距离阈值。

  2. 选取初始点,计算其它点到该点的距离,阈值范围内的点,舍弃。

  3. 从上次结果中,选取另一个点作为基准点,再次执行(2)的步骤,只需计算保留下来的点。

  4. 全部点计算完成后,即可完成要素抽稀过滤。


4)基于随机数的抽稀过滤算法


该算法结果可以保持数据疏密。


对于大数据量时的随机数,可以达到伪随机性,所以可以利用该算法进行随机性的抽稀。


  1. 设置经验阈值,例如 r=0.5,同时因为该算法效率可以实时进行,可以考虑基于每一次查询矢量切片时,根据级别设置阈值。

  2. 查询的 sql 语句中或者其它方式后面添加 where 条件,where random()>0.5 时保留要素。

  3. 基于以上就可以完成 50%的抽稀率。


使用的局限:


  1. 对于小数据量可能效果达不到。


优势:


  1. 效率很高,可以不用提前处理数据。

  2. 可以将 random()做到数据字段中,使用 btree 加速。

  3. 设置字段中后,可以保证例如小级后的结果例如 3 级,在后续级别中保留例如 4-18 级。


5)基于网格与随机数抽稀过滤算法


该算法结果可以保持数据疏密。


  1. 根据范围与网格大小阈值,划分数据网格。

  2. 遍历网格,利用网格与数据求交(使用 PostgreSQL 的 gist 索引,加快速度),计算交到的要素。

  3. 在网格内根据随机数,将网格内数据随机丢弃一些。

  4. 网格遍历完成后,即完成数据抽稀过滤。


该算法弥补了单纯基于数据数的一些局限性,不会导致数据存在缺块(对于大数据量,可能性微乎其微)。


6)基于距离并保持疏密程度的抽稀过滤算法


该算法结果可以保持数据疏密。


  1. 设置距离阈值,设置丢弃比例。

  2. 选取初始点,遍历其它要素,计算其它要素到该要素的距离,小于距离阈值的归为一片。

  3. 将该片数据,基于丢弃比例,舍弃一部分要素。

  4. 继续下一个点为基准点,循环(2)(3)的步骤。

  5. 全部要素完成后,即可完成数据抽稀过滤。


以上即为介绍的几种抽稀过滤算法,可以在合适的场景使用合适的方式。其中虽然有些算法存在局限性(基于随机数的算法),但是对于大数据量来说,可能性很低,并且效率极高,可以做到实时,以下效果也是采用该方法。

效果展示

示例:


  • 数据量: 本示例数据量为 300 万点要素;

  • 抽稀过滤方法: 基于随机数抽稀过滤,将 random 字段添加到字段中,同时利用该方法结合经验值,实时抽稀过滤展示(例如:<4 级:0.2,4-6 级:0.4,7-9:0.7,>10 不抽稀过滤);

  • 数据展示方法: 实时矢量切片,结合根据级别抽稀过滤。


效果图:




写在最后

以上优化方法仅为个人的一些经验以及思路,有错误的地方欢迎留言,一起交流,向您学习。


作者介绍


刘航,国信司南地理信息技术有限公司 GIS 研发工程师、技术经理。


原文链接


https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650792661&idx=2&sn=4f12ce2610c8f938b0580117cec7e652&chksm=f3f95740c48ede562aa4d81696661f17ac039ac4b51d75b9288280f6a6e88e5220fbf9776d3d&scene=27#wechat_redirect


2020-07-31 10:052060

评论

发布
暂无评论
发现更多内容

利益相关方以及优先级

skylar

智能汽车如何赚钱? (28天写作 Day19/28)

mtfelix

商业模式 28天写作 智能汽车 软件定义汽车

利益相关方分析-公司及团队维度

梁媛

产品经理

我用PHP写的第一个Hello world

熊斌

28天写作

面试官常问的垃圾回收器,这次全搞懂

Silently9527

Java JVM 垃圾回收 GC

娄底携手浪潮,打造了智慧城市建设的“娄底样板”

浪潮云

抽奖助手stackholder

再见陛下

年底想跳槽?先想清楚自己要什么。

一笑

面试 工作 28天写作

Android Styling System

Changing Lin

android

30+岁、没转管理、加不动班,我的竞争力从哪里来?

博文视点Broadview

GO 进阶学习笔记

zach

微服务 Go 语言

信任是一种需要牺牲效率持续发出的信号

Justin

心理学 信任 市场营销 28天写作

【总结】产品经理训练营 | 02 产品思维和产品意识(上、中)

阿席达卡。

Kubernetes Pod篇:带你轻松玩转Pod

xcbeyond

Kubernetes pod 28天写作 Kubernetes从入门到精通 服务编排

从定义到AST及其遍历方式,一文带你搞懂Antlr4

华为云开发者联盟

Java AST 语言 antlr4 语法分析器

GNUCash 4: 我的使用经验

lidaobing

GNUCash 28天写作

你以为阿里真的取消周报了?

Ian哥

28天写作

产品经理训练营第二章作业——利益相关者

阿波

【年度重磅】2020华为云社区年度技术精选合集,700页+免费下载!

华为云开发者联盟

数据库 AI 云原生 物联网 华为云

计算机网络学习第一课

落曦

【图文并茂,点赞收藏哦!】重学巩固你的Vuejs知识体系

我是哪吒

程序员 面试 Vue 大前端 Web

第二周作业

Geek_6a8931

红帽架构师:为什么KubeEdge是2020年我最喜欢的开源项目?

华为云原生团队

开源 云原生 边缘计算 边缘技术

Elasticsearch从入门到放弃:浅谈算分

Jackey

elasticsearch

架构师训练营-大作业:物流系统架构设计

晴空万里

架构师训练营第2期

第二周作业

正午看星星

极客大学产品经理训练营

智能building 之智慧城市

张老蔫

28天写作

第 2 周作业

老元宵

keepalived 实现Nginx高可用安装

庞小辉

第2章:产品思维总结

让时间说真话

产品经理

产品思维和产品意识-利益相关方学习总结

mas

百万级要素优化:基于PG与PostGIS的实时矢量瓦片服务_大数据_dbaplus社群_InfoQ精选文章