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

使用HERE SDK Premium版导入点位列表计算路线精度不足

问题背景

我们使用HERE SDK Premium版的CoreRouter.calculateRoute(List<GeoCoordinate>, RouteOptions, Listener)方法,基于从谷歌地图导出的GPX文件点位列表计算路线,但发现HERE地图生成的路线点位无法像谷歌地图那样精准落在道路上:

  • 谷歌地图原始路线为规划好的精准道路路线
  • HERE地图计算结果显示路线点位偏离道路
  • 对比图可清晰看到两者的点位匹配差异

GPX点位列表

<trkpt lat="37.3665039" lon="-121.9179512">
        <name>TP0</name>
      </trkpt>
      <trkpt lat="37.3663126" lon="-121.9178105">
        <name>TP1</name>
      </trkpt>
      <trkpt lat="37.3660126" lon="-121.9175858">
        <name>TP2</name>
      </trkpt>
      <trkpt lat="37.3657063" lon="-121.9173579">
        <name>TP3</name>
      </trkpt>
      <trkpt lat="37.3653819" lon="-121.9171101">
        <name>TP4</name>
      </trkpt>
      <trkpt lat="37.3652228" lon="-121.916993">
        <name>TP5</name>
      </trkpt>
      <trkpt lat="37.3653404" lon="-121.9167218">
        <name>TP6</name>
      </trkpt>
      <trkpt lat="37.3657065" lon="-121.9159425">
        <name>TP7</name>
      </trkpt>
      <trkpt lat="37.3659858" lon="-121.9153481">
        <name>TP8</name>
      </trkpt>
      <trkpt lat="37.366333" lon="-121.9146232">
        <name>TP9</name>
      </trkpt>
      <trkpt lat="37.3663824" lon="-121.9145151">
        <name>TP10</name>
      </trkpt>
      <trkpt lat="37.3666919" lon="-121.9139078">
        <name>TP11</name>
      </trkpt>
      <trkpt lat="37.366698" lon="-121.9137683">
        <name>TP12</name>
      </trkpt>
      <trkpt lat="37.3666968" lon="-121.913702">
        <name>TP13</name>
      </trkpt>
      <trkpt lat="37.3666941" lon="-121.9136539">
        <name>TP14</name>
      </trkpt>
      <trkpt lat="37.3666879" lon="-121.9136134">
        <name>TP15</name>
      </trkpt>
      <trkpt lat="37.3666756" lon="-121.913573">
        <name>TP16</name>
      </trkpt>
      <trkpt lat="37.3666331" lon="-121.913451">
        <name>TP17</name>
      </trkpt>
      <trkpt lat="37.3664775" lon="-121.9133349">
        <name>TP18</name>
      </trkpt>
      <trkpt lat="37.3659049" lon="-121.9129044">
        <name>TP19</name>
      </trkpt>
      <trkpt lat="37.3658757" lon="-121.9129628">
        <name>TP20</name>
      </trkpt>

当前实现代码

val TESTING_WAYPOINTS = arrayOf(
            GeoCoordinate(37.3665039, -121.9179512),
            GeoCoordinate(37.3663126, -121.9178105),
            GeoCoordinate(37.3660126, -121.9175858),
            GeoCoordinate(37.3657063, -121.9173579),
            GeoCoordinate(37.3653819, -121.9171101),
            GeoCoordinate(37.3652228, -121.916993),
            GeoCoordinate(37.3653404, -121.9167218),
            GeoCoordinate(37.3657065, -121.9159425),
            GeoCoordinate(37.3659858, -121.9153481),
            GeoCoordinate(37.366333, -121.9146232),
            GeoCoordinate(37.3663824, -121.9145151),
            GeoCoordinate(37.3666919, -121.9139078),
            GeoCoordinate(37.366698, -121.9137683),
            GeoCoordinate(37.3666968, -121.913702),
            GeoCoordinate(37.3666941, -121.9136539),
            GeoCoordinate(37.3666879, -121.9136134),
            GeoCoordinate(37.3666756, -121.913573),
            GeoCoordinate(37.3666331, -121.913451),
            GeoCoordinate(37.3664775, -121.9133349),
            GeoCoordinate(37.3659049, -121.9129044),
            GeoCoordinate(37.366377, -121.9137508), 
            GeoCoordinate(37.3658757, -121.9129628),
        )

// set route options
val mRouteOptions = RouteOptions().apply {
    this.transportMode = RouteOptions.TransportMode.CAR
    this.routeCount = navigationOptions.routeCount
    this.routeType = navigationOptions.routeType
    setTunnelsAllowed(navigationOptions.tunnelAllowed)
    setTollRoadsAllowed(navigationOptions.tollAllowed)
    setHighwaysAllowed(navigationOptions.highwaysAllowed)
    setFerriesAllowed(navigationOptions.boatsAllowed)
    setDirtRoadsAllowed(navigationOptions.dirtRoadsAllowed)
    this.locale = Locale("en")
})

fun calculateRoute(listener: CoreRouter.Listener) {
    mCoreRouterListener = listener
    // force using the preset waypoints
    val presetWaypoints = TESTING_WAYPOINTS
    for (p in presetWaypoints) {
        Log.d(TAG, "[TRACK]: ${p.latitude} ${p.longitude}")
        mRoutePoints.add(p)
    }

    mCoreRouter.calculateRoute(mRoutePoints, mRouteOptions, this)
}

核心问题:是否可通过CoreRouter.calculateRoute方法提升路线计算精度?

优化方案

可以通过调整calculateRoute的配置和使用逻辑来提升精度,具体方法如下:

1. 启用严格路径匹配模式

在RouteOptions中设置严格匹配模式,强制路线贴近所有途经点:

mRouteOptions.routeMatchMode = RouteOptions.RouteMatchMode.EXACT

该模式会减少路由算法对途经点的自动调整,让路线更贴合给定的点位。

2. 使用RouteWaypoint设置严格道路匹配

将普通GeoCoordinate替换为RouteWaypoint,并设置严格的道路匹配规则,确保每个点位都匹配到最近的道路:

val waypoints = mutableListOf<RouteWaypoint>()
TESTING_WAYPOINTS.forEach { coord ->
    val waypoint = RouteWaypoint(coord)
    // 强制匹配到最近的道路链接,不允许偏离到非道路区域
    waypoint.linkMatchingMethod = RouteWaypoint.LinkMatchingMethod.STRICT
    waypoints.add(waypoint)
}
// 传入RouteWaypoint列表进行路线计算
mCoreRouter.calculateRoute(waypoints, mRouteOptions, this)

3. 优化途经点数量

当前点位过于密集,HERE SDK可能会自动简化路线。可对点位进行抽稀,只保留关键转向点(如TP0、TP6、TP11、TP19等明显改变方向的点),减少不必要的途经点,让路由算法更聚焦于关键路径。

4. 检查并更新地图数据

确保使用的HERE SDK地图数据为最新版本,旧版地图可能存在道路数据缺失或不准确的情况,导致点位匹配偏差。

5. 调整运输模式参数

根据原始路线的实际情况,调整RouteOptions中的道路偏好设置,比如如果原始路线不走高速,需确保setHighwaysAllowed(false),避免算法自动选择偏离的高速路。

总结

通过以上调整,能够有效提升CoreRouter.calculateRoute的路线计算精度,让结果更接近谷歌地图的原始路线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:06:32