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

如何计算用于HERE Maps API的Tile ID?附Python实现示例

HERE Maps API Tile ID 计算的Python实现优化

官方计算公式

HERE官方给出的Tile ID计算逻辑如下:

tile size = 180° / 2^level [degree]
tileY = trunc((latitude + 90°) / tile size)
tileX = trunc((longitude + 180°) / tile size)
tileID = tileY * 2 * (2^level) + tileX

原代码问题分析

你编写的代码存在几个关键错误:

  • 误用math.degrees():该函数用于将弧度值转换为角度值,但公式中所有参数(纬度、经度、180°、90°)本身都是角度单位,无需额外转换。若传入的经纬度已是角度,这一步会导致数值错误放大;若为弧度,需在参数说明中明确,但地理坐标接口通常以角度为输入单位。
  • denom = math.degrees(math.pow(2, level))完全错误:math.pow(2, level)是数值计算结果,并非弧度值,用math.degrees()转换毫无意义。
  • tile_id计算使用math.pow(2, level)会返回浮点数,易引发精度问题,建议改用整数运算或位运算。

修正后的可运行代码

import math

def get_tile_id(lat, lon, level=8):
    # 若输入经纬度为弧度值,取消下方两行注释:
    # lat = math.degrees(lat)
    # lon = math.degrees(lon)
    
    tile_size = 180.0 / (2 ** level)
    tile_y = math.trunc((lat + 90.0) / tile_size)
    tile_x = math.trunc((lon + 180.0) / tile_size)
    # 2*(2^level) 等价于 2^(level+1),位运算更高效
    tile_id = tile_y * (1 << (level + 1)) + tile_x
    return tile_id

关键说明

  • 使用2 ** level替代math.pow(2, level),Python整数幂运算更高效且无浮点误差。
  • 1 << (level + 1)是位运算,等价于2^(level+1),计算速度更快且结果为整数。
  • math.trunc()直接截断小数部分,完全贴合官方公式的trunc定义,避免隐式类型转换带来的意外问题。

内容的提问来源于stack exchange,提问作者davidj411

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:43