基于PG与PostGIS搭建实时矢量瓦片服务

基于PG与PostGIS搭建实时矢量瓦片服务

  • 矢量瓦片(MVT)
    • MVT标准
    • 矢量瓦片优势
  • 实时矢量瓦片
    • 为什么要有实时的矢量瓦片
  • PostGIS中矢量切片相关函数
  • 实战
    • 只有点层的SQL语句
    • 点、线、面层在一起的SQL
  • 写在最后
  • 关于作者
  • 相关链接

在PG相关分享上已经分享过两次关于PG与PostGIS做实时矢量切片这块的内容了。这次写几篇博客来分享这块的知识。

矢量瓦片(MVT)

本文中提到的矢量瓦片为Mapbox Vector Tile格式,简称MVT。

MVT标准

MVT标准参考Mapbox官方文档。传送门链接

矢量瓦片优势

  1. 可以支持高分辨率屏幕的显示
  2. 地图渲染在前端,可以支持一套数据随意更改配图方案,解决传统栅格瓦片动态样式上的问题
  3. 要素查询可以在前端进行
  4. 保持了矢量数据的优势,同时采用切片方式又提高了传输上的效率

实时矢量瓦片

顾明思议,矢量瓦片不在使用工具线下进行预先切片,采用即时浏览即时传输矢量瓦片。

为什么要有实时的矢量瓦片

采用实时切的矢量瓦片可以做到数据编辑功能。如果采用预先切片方式,那么在数据编辑后,浏览的数据还是旧的数据,做到实时的矢量瓦片后,编辑数据之后浏览到的矢量瓦片就是最新数据。这样就可以解决数据编辑后瓦片不是最新的问题。

PostGIS中矢量切片相关函数

本文介绍使用PG+PostGIS来做到实时的矢量瓦片,在实战之前先介绍几个用到的矢量瓦片相关的函数。

主要函数:

  • ST_AsMvtGeom 将Geom转化为MVT的geom
  • ST_AsMVT 将geom转换为MVT数据
  • ST_TileEnvelope(3.0以上支持) 根据行列号获取Envelope

辅助函数:

  • ST_Transform 坐标转换函数,用它可以做到支持任何坐标系的矢量瓦片
  • ST_Simplify 简化,用它来做线或者面的简化
  • ST_SimplifyPreserveTopology 与简化类似

实战

思路:

  • 前端地图库浏览时,将请求URL传到后台
  • 后端实现URL的服务,根据x、y、z获取对应范围数据,使用sql查询到数据返回给前端

只有点层的SQL语句

点的矢量切片
基于PG与PostGIS搭建实时矢量瓦片服务_第1张图片

点、线、面层在一起的SQL

基于PG与PostGIS搭建实时矢量瓦片服务_第2张图片
基于PG与PostGIS搭建实时矢量瓦片服务_第3张图片

写在最后

  • 本文先介绍如何使用PG+PostGIS生成矢量瓦片。后续会写几篇一些小的优化技巧,用来支持大数据量下的浏览,欢迎关注。

  • 本人写了后端服务以及前端浏览(mapboxgljs)的源代码,后端服务使用Go与Node.js分别实现了一遍,以下附上源代码地址,github链接觉得有用动动手给个star。

  • 在分享会上的PPT分享给大家,传送门

关于作者

GISer
小刘先森
QQ: 1016817543
邮箱:[email protected]
github:https://github.com/MrSmallLiu (欢迎star)

相关链接

以下为本人参与开发的一些库,欢迎各位Star、Issues、PR

  • 更方便快捷的基于PostgreSQL和PostGIS的坐标转换函数,支持点、线、面的WGS84和CGCS2000与GCJ02和BD09坐标系与之间互转
  • 统一社会信用代码相关的PostgreSQL函数,包括验证、随机生成等
  • 以上工具的交流群:QQ: 947051720

你可能感兴趣的:(GIS)