Tilemaker开启include_ids后生成的ID为何与原始OSM ID不符?
问题解答
原因说明
tilemaker 的 include_ids=true 配置仅负责在 Feature 的 properties 字段中添加原始 OSM ID(对应 osm_id 键),而 Feature 顶层的 id 值是 tilemaker 为了避免不同类型 OSM 元素(节点、路径、关系)的 ID 冲突而生成的编码值,并非直接使用原始 OSM ID。
具体编码逻辑为:
- 节点(Node):直接使用原始 OSM ID 作为 Feature ID
- 路径(Way):原始 OSM ID 加上
2^40(即 1099511627776) - 关系(Relation):原始 OSM ID 加上
2 * 2^40(即 2199023255552)
你遇到的情况中,Feature ID 1103861383778 对应的是路径(Way)类型的 OSM 元素,减去偏移量 2^40 后正好得到原始 OSM ID 4349756002。
转换方法
如果需要从 Feature ID 还原原始 OSM ID,可按以下规则处理:
- 若 Feature ID < 2^40:直接作为原始节点 ID
- 若 2^40 ≤ Feature ID < 2*2^40:减去
2^40得到原始路径 ID - 若 Feature ID ≥ 2*2^40:减去
2*2^40得到原始关系 ID
用 JavaScript 实现的示例代码:
function decodeOsmId(featureId) { const wayOffset = 1n << 40n; const relationOffset = 2n << 40n; const id = BigInt(featureId); if (id < wayOffset) { return { type: 'node', id: id.toString() }; } else if (id < relationOffset) { return { type: 'way', id: (id - wayOffset).toString() }; } else { return { type: 'relation', id: (id - relationOffset).toString() }; } } // 验证你的例子 console.log(decodeOsmId(1103861383778)); // 输出:{ type: 'way', id: '4349756002' }
内容的提问来源于stack exchange,提问作者Ben On Track
相关产品推荐
相关产品推荐

