tileserver-gl批量加载MBTiles文件的配置与自动更新咨询
我正在使用tileserver-gl通过MBTiles文件提供瓦片服务,这些MBTiles文件每天由tippecanoe生成。每天会为每个特定ID(约200个ID)生成一个新的MBTiles文件,且这些新文件需要能被运行中的tileserver-gl加载并提供服务(与过往生成的文件一同)。目前我已积累了大量MBTiles文件,所有文件都需被tileserver-gl加载并提供服务。
就此我有两个问题:
- 是否可配置tileserver-gl扫描指定目录或路径,自动加载该目录下所有MBTiles文件作为数据源?还是必须将每个文件逐一添加到config.json的
data字段中?后者会导致config.json文件随时间推移变得异常冗长。 - 若支持通过指定目录加载所有MBTiles文件,新增至该目录的文件是否会被服务器自动加载,还是需要重启服务器才能生效?
此外,若tileserver-gl不支持直接指定目录加载所有MBTiles文件,如何在不使config.json文件过度膨胀的前提下,用tileserver-gl服务数量持续增长的MBTiles文件?
1. 关于目录自动扫描加载的支持
tileserver-gl原生不支持直接配置目录自动扫描加载所有MBTiles文件,默认必须在config.json的data字段中逐个声明数据源。但可以通过以下两种方案避免config.json过度膨胀:
方案A:自动生成config.json
编写脚本(Shell/Python均可)定时扫描MBTiles所在目录,动态生成config.json的data字段。脚本会遍历目录下所有.mbtiles文件,自动为每个文件生成对应的数据源配置。
示例Shell脚本(需依赖jq工具处理JSON):
#!/bin/bash # 替换为你的MBTiles目录路径 MBTILES_DIR="/opt/mbtiles" # 替换为你的config.json路径 CONFIG_PATH="/opt/tileserver/config.json" # 遍历目录生成data字段的JSON结构 DATA_ENTRIES=$(find "$MBTILES_DIR" -name "*.mbtiles" | jq -nR '[inputs | { (. | split("/")[-1] | rtrimstr(".mbtiles")): {source: .} }] | add') # 更新config.json的data字段 jq --argjson new_data "$DATA_ENTRIES" '.data = $new_data' "$CONFIG_PATH" > temp_config.json && mv temp_config.json "$CONFIG_PATH"
你可以将这个脚本加入定时任务(比如cron),每天生成新MBTiles文件后自动更新配置。
方案B:使用TileJSON代理模式
tileserver-gl支持直接通过文件路径访问MBTiles的TileJSON,无需在config.json中预先声明。只要启动时指定MBTiles所在目录为公共可访问路径,就可以通过URL直接获取对应文件的TileJSON,进而加载瓦片。
启动tileserver-gl时可以通过--public参数指定目录:
tileserver-gl --public /opt/mbtiles
之后你可以通过http://your-server/data/[filename].mbtiles.json访问该文件的TileJSON,前端直接基于这个TileJSON加载瓦片即可。新增的MBTiles文件只要放在指定目录下,就能立即通过该方式访问。
2. 关于新增文件的自动加载
- 若使用自动生成config.json的方案:tileserver-gl默认不会自动重载配置,更新
config.json后需要重启服务,或通过发送SIGHUP信号触发配置重载(仅Linux系统有效):kill -SIGHUP $(pgrep tileserver-gl) - 若使用TileJSON代理模式:新增的MBTiles文件无需任何操作,只要放在指定目录下,就能直接通过URL访问,无需重启服务。
内容的提问来源于stack exchange,提问作者RoeeHas

