You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在OpenMapTiles中导入及生成瓦片时如何包含全部OSM铁路标签?

批量处理OSM Railway标签的OpenMapTiles实现方案

针对你提到的两个问题,都是可行的,核心思路是利用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的层配置中声明该字段并查询输出:

  1. 在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
  1. 确保该层被包含在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:23:20