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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:41:19