使用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

