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

如何使用Qt Location及RouteMap QML在地图上显示多条路线?

嘿,我来帮你解决Qt Location显示多条路线的问题!你现在的代码是在同一个RouteModel里添加多个途经点,这其实是在创建单条带多个节点的路线,而不是多条独立路线。要实现多条路线,核心思路是给每条路线单独分配一个RouteModel实例,然后用Repeater来批量渲染它们。

具体实现方案

1. 核心逻辑:每条路线对应独立的RouteModel

一个RouteModel只能对应一条查询生成的路线,所以你需要为每条要展示的路线创建单独的RouteModel和RouteQuery,分别设置各自的起点、终点(或途经点)。

2. 用Repeater批量渲染多条路线

把所有RouteModel放到一个数组(或动态ListModel)里,通过Repeater遍历,每个项对应一个MapRoute组件,绑定对应的RouteModel结果。

完整示例代码

import QtQuick 2.15
import QtLocation 5.15
import QtPositioning 5.15

Item {
    width: 800
    height: 600

    Map {
        anchors.fill: parent
        plugin: Plugin { name: "osm" } // 替换成你自己的plugin实例,比如你的somePlugin

        // 用Repeater渲染多条路线
        Repeater {
            // 数组里每个元素是一条路线的RouteModel
            model: [
                // 第一条路线
                RouteModel {
                    plugin: parent.plugin
                    query: RouteQuery {}
                    Component.onCompleted: {
                        query.addWaypoint(QtPositioning.coordinate(26.328045523310905, 50.080033033011546));
                        query.addWaypoint(QtPositioning.coordinate(26.333615791655415, 50.097984054173025));
                        update();
                    }
                },
                // 第二条路线
                RouteModel {
                    plugin: parent.plugin
                    query: RouteQuery {}
                    Component.onCompleted: {
                        query.addWaypoint(QtPositioning.coordinate(26.320000, 50.070000));
                        query.addWaypoint(QtPositioning.coordinate(26.340000, 50.100000));
                        update();
                    }
                },
                // 可以继续添加更多RouteModel实现多条路线
            ]

            // 每条路线的渲染代理
            delegate: MapRoute {
                route: modelData.route // 绑定当前RouteModel的查询结果
                line.color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1) // 随机颜色区分不同路线
                line.width: 3
            }
        }
    }
}

动态添加路线的进阶写法

如果需要动态生成路线(比如根据用户输入批量添加),可以用ListModel来管理所有RouteModel:

ListModel {
    id: routesListModel

    // 封装添加路线的方法
    function addRoute(startCoord, endCoord) {
        let newRouteModel = RouteModel {
            plugin: map.plugin
            query: RouteQuery {}
            Component.onCompleted: {
                query.addWaypoint(startCoord);
                query.addWaypoint(endCoord);
                update();
            }
        }
        routesListModel.append({routeModel: newRouteModel});
    }
}

// 绑定到Repeater
Repeater {
    model: routesListModel
    delegate: MapRoute {
        route: routeModel.route
        line.color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
        line.width: 3
    }
}

// 调用添加路线
Component.onCompleted: {
    routesListModel.addRoute(
        QtPositioning.coordinate(26.328045, 50.080033), 
        QtPositioning.coordinate(26.333616, 50.097984)
    );
    routesListModel.addRoute(
        QtPositioning.coordinate(26.315000, 50.065000), 
        QtPositioning.coordinate(26.345000, 50.105000)
    );
}
关键注意点
  • 不要在同一个RouteModel里叠加多个waypoint,这只会生成一条带多个途经点的路线,不是多条独立路线。
  • 每条路线的RouteQuery可以单独设置导航模式(比如驾车、步行),只需给对应的RouteQuery添加travelMode属性即可。
  • 给不同路线设置不同颜色/线宽,能让用户更清晰地区分每条路线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:37