如何在ABAP中解码HERE Routing API 8返回的polyline数据?
HERE API Polyline 解码方案(ABAP适配)
HERE Flexible Polyline 官方编码规则
HERE路线接口返回的polyline采用自定义的Flexible Polyline编码标准,核心规则如下:
- 坐标序列按「纬度、经度」交替存储,先对连续坐标做差分编码压缩差值
- 所有数值先乘以精度系数(默认10^5,即保留5位小数)取整后再编码
- 采用自定义Base64字符集做可变长编码,每个字符对应6位有效位,最高位为「是否有后续字符」标识位
- 编码字符串开头存储元数据,低3位为精度值,可适配0~15位小数的场景
ABAP本地解码实现步骤
无需依赖外部实现,按以下逻辑即可完成解码:
- 预定义自定义Base64映射表:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_,注意最后两位是-和_,不是标准Base64的+和/ - 解析编码头:
取第一个字符解码为整数,取二进制低3位作为精度值precision,计算系数factor = 10 ** precision - 逐段解码坐标:
- 初始化上一个纬度、经度值均为0
- 交替解码纬度差值、经度差值:每次读取字符直到字符对应整数的最高位为0,拼接所有有效位还原为补码整数,除以
factor得到差值 - 差值与上一个坐标值累加得到当前实际坐标,存储后更新上一个坐标值
- 输出的坐标数组按「纬度,经度」顺序排列即可使用
常见解码错误原因
你之前解码结果异常,90%以上是以下问题导致:
- 精度值硬编码为5,部分接口返回的polyline精度为6,未动态读取编码头的精度值
- Base64映射表用了标准版本,未替换最后两位字符
- 坐标顺序搞反,把经度放在纬度前
补充:你当前调用的
https://router.hereapi.com/v8/routes接口默认返回5位精度的polyline,若需要更高精度可在请求参数中新增polyline6返回值,解码时按头中读取的精度处理即可。
内容的提问来源于stack exchange,提问作者SAPShweta
相关产品推荐
相关产品推荐

