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

RoutePreviewNavigationTemplate未显示地图及路线问题求助

问题解决思路

你的代码缺少地图渲染核心配置和路线数据关联,这就是地图不显示、路线无法绘制的直接原因。下面是具体修复方案:


1. 配置地图控制器以显示背景地图

RoutePreviewNavigationTemplate 必须绑定 CarMapController 才能渲染背景地图,同时需要将控制器传递给模板,并设置合适的地图初始视角。

2. 创建完整路线对象并关联到模板

你目前仅给列表项绑定了终点 Place,但未创建包含起点、终点、路径几何的完整 Route 实例,模板无法自动生成路线。需要用 Route.Builder 创建路线,再通过 setRoutes 方法添加到模板中。


修改后的完整代码

class RoutePreviewScreen(carContext: CarContext) : Screen(carContext) {
    @RequiresApi(Build.VERSION_CODES.O)
    @SuppressLint("UnsafeOptInUsageError")
    override fun onGetTemplate(): Template {
        val builder = RoutePreviewNavigationTemplate.Builder()

        // 获取并绑定地图控制器
        val carMapController = carContext.getCarService(CarMapController::class.java)
        builder.setMapController(carMapController)

        // 定义位置:模拟当前位置、终点A、终点B
        val currentLocation = CarLocation.create(19.2690, -103.7593)
        val locationA = CarLocation.create(19.2689369, -103.7636865)
        val locationB = CarLocation.create(19.269160, -103.754996)

        // 创建位置标记
        val currentMarker = PlaceMarker.Builder().setColor(CarColor.GREEN).build()
        val markerA = PlaceMarker.Builder().setColor(CarColor.RED).build()
        val markerB = PlaceMarker.Builder().setColor(CarColor.BLUE).build()

        // 创建Place对象
        val currentPlace = Place.Builder(currentLocation).setMarker(currentMarker).build()
        val placeA = Place.Builder(locationA).setMarker(markerA).build()
        val placeB = Place.Builder(locationB).setMarker(markerB).build()

        // 创建完整路线实例(示例用直线几何,实际需替换为导航SDK返回的真实路径)
        val routeA = Route.Builder()
            .setOrigin(currentPlace)
            .setDestination(placeA)
            .setGeometry(listOf(currentLocation, locationA))
            .build()

        val routeB = Route.Builder()
            .setOrigin(currentPlace)
            .setDestination(placeB)
            .setGeometry(listOf(currentLocation, locationB))
            .build()

        // 将路线添加到模板
        builder.setRoutes(listOf(routeA, routeB))

        // 构建路线列表项(关联对应Route实例)
        val routeItem = Row.Builder()
            .setTitle(CarText.create("从当前位置到A"))
            .addText(SpannableString(" ").apply {
                setSpan(
                    DistanceSpan.create(
                        Distance.create(Math.random() * 100, Distance.UNIT_KILOMETERS)
                    ), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE
                )
            })
            .addText(SpannableString(" ").apply {
                setSpan(
                    DurationSpan.create(
                        Duration.ofHours(3)
                    ), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE
                )
            })
            .setMetadata(
                Metadata.Builder()
                    .setRoute(routeA)
                    .build()
            )
            .build()

        val routeItem2 = Row.Builder()
            .setTitle(CarText.create("从当前位置到B"))
            .addText(SpannableString(" ").apply {
                setSpan(
                    DistanceSpan.create(
                        Distance.create(Math.random() * 200, Distance.UNIT_KILOMETERS)
                    ), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE
                )
            })
            .addText(SpannableString(" ").apply {
                setSpan(
                    DurationSpan.create(
                        Duration.ofHours(3)
                    ), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE
                )
            })
            .setMetadata(
                Metadata.Builder()
                    .setRoute(routeB)
                    .build()
            )
            .build()

        val itemList = ItemList.Builder()
            .addItem(routeItem)
            .addItem(routeItem2)
            .setOnSelectedListener { selectedItem ->
                // 选中路线时,让地图自动聚焦到该路线
                selectedItem.metadata?.route?.let {
                    carMapController.setCameraRoute(it)
                }
            }
            .build()

        builder.setItemList(itemList)

        val navigateAction = Action.Builder()
            .setTitle("开始导航")
            .setOnClickListener {
                // 此处可跳转至导航模板,传入选中的路线
            }
            .build()

        builder.setNavigateAction(navigateAction)

        return builder.build()
    }
}

关键说明

  • 地图控制器:通过 carContext.getCarService(CarMapController::class.java) 获取,必须绑定到模板才能触发地图渲染。
  • 路线实例:每个列表项需关联对应 Route 对象,模板才能在地图上绘制路线。示例中的直线几何仅做演示,实际开发需调用导航SDK获取真实路径点。
  • 地图交互:选中列表项时调用 setCameraRoute,可让地图自动聚焦到选中路线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:33:12