(数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
本文示例代码已上传至我的
Github仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,在日常研发地图类应用的场景中,为了在地图上快速加载大量的矢量要素,且方便快捷的在前端处理矢量的样式,且矢量数据可以携带对应的若干属性字段,目前主流的做法是使用矢量切片(vector tiles)的方式将矢量数据发布为服务进行调用:

而可用于发布矢量切片服务的工具,主流的有geoserver、tippecanoe等,但是使用起来方式比较繁琐,且很容易遇到性能瓶颈。
除此之外,PostGIS中也提供了ST_AsMVT等函数可以直接通过书写SQL来生成矢量切片数据,但是需要额外进行服务化的开发封装,较为繁琐。
而我在最近的工作中,接触到由maplibre开源的高性能矢量切片服务器martin( https://github.com/maplibre/martin ),它基于Rust进行开发,官方宣传其性能快到疯狂(Blazing fast),而在我实际的使用体验中也确实如此,在今天的文章中我就将为大家分享有关martin发布矢量切片地图服务的常用知识。

2 基于martin+PostGIS发布矢量切片服务
martin可在windows、linux、mac等主流系统上运行,其最经典的用法是配合PostGIS,下面我们以linux系统为例,介绍martin的部署使用方法:
2.1 martin的安装
martin提供了多种多样的安装方式,其中我体验下来比较简单稳定的安装方式是基于cargo,这是Rust的包管理器(因为martin基于Rust开发,这也是其超高性能的原因之一),martin可以直接当作Rust包进行安装。因此我们首先需要安装cargo:
apt-get update
apt-get install cargo
cargo完成安装后,为了在加速其国内下载速度,我们可以使用由字节跳动维护的镜像源( https://rsproxy.cn/ ):
mkdir ~/.cargo
vim ~/.cargo/config
# 在vim中粘贴下列内容后保存退出
[source.crates-io]
replace-with = 'rsproxy'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true
接着逐一执行下列命令即可完成martin及其必要依赖的安装:
# 安装必要依赖以防martin安装失败
apt-get install pkg-config
apt-get install libssl-dev
cargo install martin

2.2 准备演示用数据
接下来我们利用geopandas来读入及生成一些示例用PostGIS数据库表,完整的代码及示例数据可以在文章开头的仓库中找到:
import random
import geopandas as gpd
from shapely import Point
from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:mypassword@127.0.0.1:5432/gis_demo')
# 读取示测试矢量数据1(数据来自阿里DataV地图选择器)
demo_gdf1 = gpd.read_file('中华人民共和国.json')[['adcode', 'name', 'geometry']]
# 生成示例矢量数据2
demo_gdf2 = gpd.GeoDataFrame(
{
'id': range(100000),
'geometry': [Point(random.normalvariate(0, 20),
random.normalvariate(0, 20))
for i in range(100000)]
},
crs='EPSG:4326'
)
# 推送至数据库
demo_gdf1.to_postgis(name='demo_gdf1', con=engine, if_exists='replace')
demo_gdf2.to_postgis(name='demo_gdf2', con=engine, if_exists='replace')
通过上面的Python代码,我们将两张带有矢量数据且坐标参考系为WGS84的数据表demo_gdf1、demo_gdf2分别推送至演示用PostGIS数据库中:

接下来我们就可以愉快的使用martin来发布矢量切片服务了~
2.3 使用martin发布矢量切片地图服务
martin的基础使用超级简单,只需要在启动martin服务时设置好目标PostGIS数据库的连接参数字符串,它就可以自动发现数据库中具有合法坐标系(默认为EPSG:4326)的所有矢量表,并自动发布为相应的地图服务,以我们的示例数据库为例,参考下列命令:
/root/.cargo/bin/martin postgresql://postgres:mypassword@127.0.0.1:5432/gis_demo
从输出结果中可以看到示例数据库中的demo_gdf1、demo_gdf2表均被martin自动发现,我们的martin服务被正常启动:

这时直接访问本机IP地址对应的3000端口,即可看到相应的提示信息:

访问上面对应地址下的/catalog页面,可以看到被当前martin服务所架起的图层信息:

当以各个图层id作为路径进行访问时,就可以看到其对应地图服务的完整参数信息了,以demo_gdf1为例:

对mapbox、maplibre等地图框架了解的朋友,就知道上述信息可以直接用于向地图实例中添加相应的source和layer,下面是一个简单的基于maplibre的地图示例,要素加载速度非常之快,可以说唯一限制要素加载速度上限的瓶颈是带宽:


除此之外,martin还有相当多的额外功能,譬如基于PostGIS自定义运算函数、基于nginx实现切片缓存等,更多martin使用相关内容请移步官网https://maplibre.org/martin/。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札153)基于martin的高性能矢量切片地图服务构建的更多相关文章
- (数据科学学习手札130)利用geopandas快捷绘制在线地图
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中,我为大家介绍了不久前发布的 ...
- (数据科学学习手札133)利用geopandas绘制拓扑着色地图
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在绘制某些地图时,为了凸显出每个独立的 ...
- (数据科学学习手札96)在geopandas中叠加在线地图
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
随机推荐
- Rails 中的布局和渲染
Templates, Partials, and Layouts 在 Rails 中,视图是用于呈现 HTML.XML.JSON 等响应的模板.Rails 的视图系统支持模板.局部模板和布局模板,它们 ...
- Sementic Kernel 案例之网梯科技在线教育
2023年4月25日,微软公布了2023年第一季度财报,营收528亿美元, 微软CEO纳德称,「世界上最先进的AI模型与世界上最通用的用户界面--自然语言--相结合,开创了一个新的计算时代.」该公司有 ...
- 【CSS】使元素在父元素中居中显示的几种方法
在页面元素布局时经常会有把元素居中的需求,大多都是用弹性盒或者定位,下面来说一下使用方法 一.使用边距进行固定位置 这种方法需要把父元素和子元素的宽度固定,然后利用二者宽高之差添加边距移动元素的位置 ...
- drf重写authenticate方法实现多条件登录(源码分析)
drf重写authenticate方法实现多条件登录(源码分析) 1. 思路 JWT拓展的登录视图中, 在接受到用户名和密码时, 调用的也是Django的认证系统中提供的authenticate()来 ...
- #Powerquery 数据结构基础 一维数据与二维数据
本文参考了采悟老师的文章,推荐大家看原文,本文为笔记随笔 https://mp.weixin.qq.com/s?__biz=MzA4MzQwMjY4MA==&mid=2484068871&am ...
- 2022-12-21:uifd/ui-for-docker是docker的web可视化工具。请问部署在k3s中,yaml文件如何写?
2022-12-21:uifd/ui-for-docker是docker的web可视化工具.请问部署在k3s中,yaml文件如何写? 答案2022-12-21: yaml如下: apiVersion: ...
- 2020-11-08:在Mysql中,三个字段A、B、C的联合索引,查询条件是B、A、C,会用到索引吗?
福哥答案2020-11-08: 会走索引,原因是mysql优化器会把BAC优化成ABC. CREATE TABLE `t_testabc2` ( `id` int(11) NOT NULL AUTO_ ...
- 2021-07-15:接雨水 II。给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
2021-07-15:接雨水 II.给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 福大大 答案2021-07-15: 小根堆 ...
- 解决 VMware EXSI的Windows虚拟机中,配置静态IP后,DHCP自动默认开启获取IP,导致无法访问
解决 VMware EXSI的Windows虚拟机中,配置静态IP后,DHCP自动默认开启获取IP,导致无法访问 前言:在EXSI上部署了Windows虚拟机,但是配置了静态IP后却不能Ping通:逐 ...
- vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs
ref 在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法.在 setup 函数中,你可以使用 ref.reactive 和 computed 等 Vue 3 的响应式 API 来 ...