Clearing route and getting way points in QT,QML,C++

543 Views Asked by At

I have two questions which are somehow related.

  1. I have created a route on an open street map and I want to extract a list of points that correspond to the way points of the generated route (not just the start and the finish). How can this be achieved? For example I want to extract way points for the generated red route from the image bellow (of course I do not want to extract all the points from a route but from 10 in 10 meters).

enter image description here

  1. How do I erase the generated route with red, and have the original map (without the red route) I have tried many function on the map item but non of them worked. For example I have tried the code below but the red route remains.

    function clearMapDataForSession()
     {
        mapview.clearData();
        routeModel.update()
     }
    
1

There are 1 best solutions below

1
On BEST ANSWER

You can get a list of coordinates from the Route by using the properties path or segments. The path property directly gives you a list of coordinates on the given Route, the segments property on the other hand gives you a list of RouteSegments which in turn contain a list of coordinates given by its path property.

Print the list of Route coordinates via segments:

var segments = routeModel.get(0).segments
for (var i = 0; i < segments.length; i++) {
    var path = segments[i].path
    for (var j = 0; j < path.length; j++)
        console.log(path[j])
}

Print the list of Route coordinates via path:

var path = routeModel.get(0).path
for (var i = 0; i < path.length; i++) {
    console.log(path[i])
}

If you compare the list of coordinates given by the two options, they are the same. The benefit of RouteSegments is that you get the distance of the segment as a property. So if you want to generate a list of coordinates/points on the Route at the same distance, this would help you in writing some sort of an algorithm.

In order to erase a generated Route you need to call reset() on the RouteModel. If you want to also clear the waypoints of a RouteQuery you should call clearWaypoints() as well.

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtLocation 5.15
import QtPositioning 5.15

ApplicationWindow {
    id: window
    width: 800
    height: 600
    visible: true
    title: qsTr("Map")

    header: ToolBar {
        RowLayout {
            anchors.fill: parent
            ToolButton {
                text: qsTr("Reset")
                onClicked: {
                    routeQuery.clearWaypoints()
                    routeModel.reset()
                }
            }
        }
    }

    Plugin {
        id: mapPlugin
        name: "osm"
    }

    RouteQuery {
        id: routeQuery
    }

    RouteModel {
        id: routeModel
        plugin: mapPlugin
        query: routeQuery
        autoUpdate: false
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14

        MapItemView {
            model: routeModel
            delegate: MapRoute {
                route: routeData
                line.color: "blue"
                line.width: 5
                smooth: true
                opacity: 0.8
            }
        }

        MapItemView {
            model: routeModel.status == RouteModel.Ready ? routeModel.get(0).path : null
            delegate: MapQuickItem {
                anchorPoint.x: pathMarker.width / 2
                anchorPoint.y: pathMarker.height / 2
                coordinate: modelData

                sourceItem: Rectangle {
                    id: pathMarker
                    width: 8
                    height: 8
                    radius: 8
                    border.width: 1
                    border.color: "black"
                    color: "yellow"
                }
            }
        }

        MapItemView {
            model: routeQuery.waypoints
            delegate: MapQuickItem {
                anchorPoint.x: waypointMarker.width / 2
                anchorPoint.y: waypointMarker.height / 2
                coordinate: modelData

                sourceItem: Rectangle {
                    id: waypointMarker
                    width: 10
                    height: 10
                    radius: 10
                    border.width: 1
                    border.color: "black"
                    color: "red"
                }
            }
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                routeQuery.addWaypoint(map.toCoordinate(Qt.point(mouse.x,mouse.y)))
                routeModel.update()
            }
        }
    }
}

enter image description here