使用arcgis-js-api
或mapboxgl-js
开发时,为了在内网环境使用字体库或使用我们喜欢的字体,需要将字体发布为内网pbf格式的服务。
方法一:使用 fontnik 工具
在mapboxgl-js
开发本地化实践中,提到在linux中使用fontnik
工具(https://github.com/mapbox/node-fontnik
)可以把ttf字体转换为pbf,且fontnik仅支持linux系统。
安装node-fontnik
的本身很顺畅,但过程中需要从亚马逊s3下载相关二进制包,会被墙阻隔,因此在普通环境下不容易安装成功。
国内有大神将 node-fontnik 的环境封装为一个 docker 镜像,并发布到国内的阿里云了,使用方式如下:
// 拉取
docker pull registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
// 通过映射路径的方式调用,
// 默认会搜索字体所在路径下的全部.ttc后缀名文件,结果存方在 输出路径/{字体名}文件夹
docker run -v {字体所在路径}:/input -v {输出路径}:/output registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
// 若使用ttf格式的字体,需要追加参数
docker run -v {字体所在路径}:/input -v {输出路径}:/output -e EXTENSION=.ttf registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
方法二:使用 martin 构建字体切片服务
martin 是由 maplibre 开源的高性能矢量切片服务器( https://github.com/maplibre/martin ),它基于Rust进行开发,官方宣传其性能快到疯狂。martin 简单稳定的安装方式是在linux基于cargo(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安装失败
apt-get install pkg-config
apt-get install libssl-dev
cargo install martin
如果已经安装了martin可以进行覆盖更新,譬如我之前的martin版本为0.8.7,执行下面代码后,更新到0.11.0版本
cargo install martin --force
本地准备好 otf/ttf/ttc等常见格式字体文件,执行下面代码,发布pbf字体服务:
/root/.cargo/bin/martin --font /home/lqq/fonts // 发布 --font 后面路径的下所有字体文件
/root/.cargo/bin/martin --font /home/lqq/fonts --font /home/lqq2/fonts // 发布多个 --font 路径下的字体文件
/root/.cargo/bin/martin --font /home/lqq/fonts/Abril Fatface Regular.ttf // 发布单个字体文件
参考博客:
在国内更方便的使用node-fontnik
ArcGIS API For JavaScript Font字体简介下载及本地部署
Mapbox样式字体本地化方法
基于martin为在线地图构建字体切片服务