(数据科学学习手札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中专为正则表达式相关功能做出支持的模块,提供 ...
随机推荐
- 2021年蓝桥杯python组真题-直线(细节+分析+代码)
题目 : 代码: #直线 M=[[x,y] for x in range(20) for y in range(21)] #创建二维列表:代表xy坐标系 d=set() #创建集合属性的容器:因为集合 ...
- java生成机器码
java根据系统参数生成每个计算机的唯一标识. 1. 获取CPU序列号 /** * 获取CPU序列号 * @return * @throws IOException */ public static ...
- [双目视差] 立体校正源码分析(opencv)
文章目录 [双目视差] 立体校正源码分析(opencv) 一.源码解析 二.源码中的方法 [双目视差] 立体校正源码分析(opencv) 一.源码解析 立体校正:把实际中非共面行对准的两幅图像,校正成 ...
- 用tk.mybaits实现指定字段更新
去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...
- 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你一个数组 graph 表示这个图, 其中,graph[i] 是一个列表,由所有与节点 i
2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你一个数组 graph 表示这个图, 其中,graph[i] 是一个列表,由所有与节点 i ...
- 2022-10-10:以下go语言代码输出什么?A:[1 2 3 0 1 2];B:死循环;C:[1 2 3 1 2 3];D:[1 2 3]。 package main import “fmt“
2022-10-10:以下go语言代码输出什么?A:[1 2 3 0 1 2]:B:死循环:C:[1 2 3 1 2 3]:D:[1 2 3]. package main import "f ...
- 2022-03-03:课程表 III。 这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi]
2022-03-03:课程表 III. 这里有 n 门不同的在线课程,按从 1 到 n 编号.给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] ...
- 2021-12-14:根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个
2021-12-14:根据身高重建队列. 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序).每个 people[i] = [hi, ki] 表示第 i 个 ...
- Django4全栈进阶之路11 view视图
在 Django 4 中,视图(View)是一个处理请求并返回响应的 Python 函数或类的组合.视图函数通常是处理请求的主要逻辑,因此它是 Django Web 应用程序的重要组成部分. 视图函数 ...
- ent M2M模型在pxc集群中的一个大坑
ent M2M模型在pxc集群中的一个大坑 事故简要分析 PXC集群3个节点,在插入数据时,如果使用数据库自己生成的主键,一般顺序为1,4,7,10- 这里就是坑的源头,在ent底层代码中,在做M2M ...