在OpenMapTiles中导入及生成瓦片时如何包含全部OSM铁路标签?
针对你提到的两个问题,都是可行的,核心思路是利用osm2pgsql的全标签捕获功能和OpenMapTiles对JSONB字段的支持,无需逐个指定railways:*子标签。具体实现步骤如下:
1. 导入OSM数据时包含所有railway相关标签
OpenMapTiles的make import-osm底层依赖osm2pgsql,我们可以通过两种方式批量捕获所有标签:
方法一:直接在mapping.yaml中配置全标签捕获
在mapping.yaml里为railway要素(线、点、面)添加JSONB类型字段,用*通配符捕获所有标签:
# 以铁路线要素为例,点/面要素配置逻辑一致 osm_railway_lines: type: line fields: railway: type: string key: railway all_tags: type: jsonb key: '*' # 捕获该要素的所有OSM标签 filter: - has_tag: railway
执行make import-osm时,osm2pgsql会自动将所有railway要素的标签存入all_tags字段,无需逐个枚举railways:*子标签。
方法二:利用osm2pgsql的hstore参数
如果不想修改mapping.yaml,也可以给import-osm传递--hstore-all参数,让osm2pgsql把所有标签存入HStore类型的tags字段,之后再转成JSONB:
# 修改Makefile或者直接执行osm2pgsql命令时添加参数 osm2pgsql --hstore-all ... [你的OSM数据文件] # 导入完成后在PostgreSQL中转换字段类型 ALTER TABLE osm_railway_lines ADD COLUMN all_tags jsonb; UPDATE osm_railway_lines SET all_tags = tags::jsonb;
2. 生成矢量瓦片时包含所有标签
要把全标签字段加入矢量瓦片,只需在OpenMapTiles的层配置中声明该字段并查询输出:
- 在
layers/目录下新建railway_extended.yaml(或修改现有railway层):
layer: id: railway_extended description: "所有带完整OSM标签的铁路要素" buffer_size: 4 fields: all_tags: jsonb datasource: query: | SELECT geom, all_tags FROM osm_railway_lines
- 确保该层被包含在
openmaptiles.yaml的layers列表中:
layers: - layers/railway_extended.yaml # 其他层...
执行make generate-tiles-pg时,生成的MBTiles就会包含railway_extended层,其中每个要素都带有完整的all_tags属性,后续渲染时可以灵活提取railways:*子标签使用。
补充说明
你提到的2021年关于「用JSONB存储标签」的讨论,本质就是上述方案的思路——通过将全标签存入JSONB字段,避免逐个配置标签的繁琐,同时让矢量瓦片具备灵活的渲染扩展性。由于你处理的是小范围OSM数据,JSONB字段带来的存储和瓦片体积增加完全在可控范围内。
内容的提问来源于stack exchange,提问作者oobayly

