| /**************************************************************************** |
| ** |
| ** Copyright (C) 2020 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| import QtQuick 2.7 |
| import QtQuick.Window 2.2 |
| import QtQuick.Controls 2.2 as C2 |
| import QtPositioning 5.6 |
| import QtLocation 5.15 |
| import Qt.labs.location 1.0 |
| |
| Window { |
| id: win |
| objectName: "win" |
| visible: true |
| width: 1440 |
| height: 720 |
| title: qsTr("MapObjects tester") |
| |
| |
| property real initialZL: 5 |
| property var initialCenter: QtPositioning.coordinate(66.9961, -175.012) |
| property real rotation : 0 |
| |
| Shortcut { |
| sequence: "Ctrl+R" |
| onActivated: { |
| rotation = 57 |
| } |
| } |
| |
| function syncMaps(mFrom, mTo, propName) |
| { |
| if (mTo[propName] !== mFrom[propName]) { |
| mTo[propName] = mFrom[propName] |
| } |
| } |
| |
| Plugin { |
| id: osm // use only one plugin, to avoid messing up the cache |
| name: "osm" |
| } |
| Rectangle { |
| id: mapContainer |
| rotation: win.rotation |
| anchors.fill: parent |
| color: "lightsteelblue" |
| |
| Map { |
| id: map |
| rotation: win.rotation |
| gesture.enabled: true |
| objectName: "map1" |
| anchors { |
| bottom: parent.bottom |
| top: parent.top |
| left: parent.left |
| right: parent.horizontalCenter |
| } |
| |
| onCenterChanged: syncMaps(map, map2, "center") |
| onTiltChanged: syncMaps(map, map2, "tilt") |
| onBearingChanged: syncMaps(map, map2, "bearing") |
| onZoomLevelChanged: syncMaps(map, map2, "zoomLevel") |
| onFieldOfViewChanged: syncMaps(map, map2, "fieldOfView") |
| |
| opacity: 1.0 |
| color: 'transparent' |
| plugin: osm |
| center: initialCenter |
| activeMapType: map.supportedMapTypes[2] |
| zoomLevel: initialZL |
| z : parent.z + 1 |
| copyrightsVisible: false |
| |
| Component.onCompleted: { |
| var o = movComponent.createObject(map1MainMOV) |
| map1MainMOV.addMapObject(o); |
| } |
| MapObjectView { |
| id: map1MainMOV |
| } |
| |
| MouseArea { |
| anchors.fill: parent |
| onClicked: { |
| mouse.accepted = false |
| var crd = map.toCoordinate(Qt.point(mouse.x, mouse.y)) |
| var s = crd.toString(0) |
| console.log("Clicked on ",s) |
| } |
| } |
| } |
| Map { |
| id: map2 |
| rotation: win.rotation |
| gesture.enabled: true |
| objectName: "map2" |
| anchors { |
| bottom: parent.bottom |
| top: parent.top |
| left: parent.horizontalCenter |
| right: parent.right |
| } |
| |
| onCenterChanged: syncMaps(map2, map, "center") |
| onTiltChanged: syncMaps(map2, map, "tilt") |
| onBearingChanged: syncMaps(map2, map, "bearing") |
| onZoomLevelChanged: syncMaps(map2, map, "zoomLevel") |
| onFieldOfViewChanged: syncMaps(map2, map, "fieldOfView") |
| |
| color: 'transparent' |
| plugin: osm |
| activeMapType: map.supportedMapTypes[2] |
| center: initialCenter |
| zoomLevel: initialZL |
| copyrightsVisible: false |
| |
| Component.onCompleted: { |
| var o = migComponent.createObject(map2) |
| o.glPolygons = Qt.binding(function() {return switchPolygons2.checked}) |
| o.glPolylines = Qt.binding(function() {return switchPolylines2.currentText}) |
| o.glCircles = Qt.binding(function() {return switchCircles2.checked}) |
| o.glRectangles = Qt.binding(function() {return switchRectangles2.checked}) |
| map2.addMapItemGroup(o); |
| } |
| |
| C2.Switch { |
| text: qsTr("OGL Polygons") |
| id: switchPolygons2 |
| checked: false |
| anchors { |
| top: parent.top |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| } |
| C2.ComboBox { |
| model: ['Software','OpenGL','Triangulated'] |
| id: switchPolylines2 |
| anchors { |
| top: switchPolygons2.bottom |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| onCurrentTextChanged: console.log("CURRENT TEXT CHANGED ",currentText) |
| } |
| C2.Switch { |
| text: qsTr("OGL Circles") |
| id: switchCircles2 |
| anchors { |
| top: switchPolylines2.bottom |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| } |
| C2.Switch { |
| text: qsTr("OGL Rectangles") |
| id: switchRectangles2 |
| anchors { |
| top: switchCircles2.bottom |
| right: parent.right |
| topMargin: 12 |
| rightMargin: 12 |
| } |
| } |
| } |
| } |
| |
| Component { |
| id: migComponent |
| MapItemGroup { |
| id: polyGroup |
| property bool glPolygons : true |
| property string glPolylines : "Software" |
| property bool glCircles : true |
| property bool glRectangles : true |
| objectName: parent.objectName + "_MIG_" |
| function polylineBackend() |
| { |
| return (polyGroup.glPolylines === "OpenGL") |
| ? MapPolyline.OpenGLLineStrip |
| : ((polyGroup.glPolylines === "Software") |
| ? MapPolyline.Software : MapPolyline.OpenGLExtruded) |
| } |
| |
| function polygonBackend() |
| { |
| return (polyGroup.glPolygons) |
| ? MapPolygon.OpenGL : MapPolygon.Software |
| } |
| |
| function rectangleBackend() |
| { |
| return (polyGroup.glRectangles) |
| ? MapRectangle.OpenGL : MapRectangle.Software |
| } |
| |
| function circleBackend() |
| { |
| return (polyGroup.glCircles) |
| ? MapCircle.OpenGL : MapCircle.Software |
| } |
| MapPolyline { |
| id: tstPolyLine // to verify the polygon stays where it's supposed to |
| line.color: 'black' |
| objectName: parent.objectName + "black" |
| line.width: 1 |
| opacity: 1.0 |
| backend: polylineBackend() |
| path: [ |
| { latitude: 76.9965, longitude: -175.012 }, |
| { latitude: 26.9965, longitude: -175.012 } |
| ] |
| } |
| |
| MapPolyline { |
| id: timeline |
| line.color: "red" |
| objectName: parent.objectName + "timeline" |
| line.width: 4 |
| backend: polylineBackend() |
| path: [ |
| { latitude: 90, longitude: 180 }, |
| { latitude: -90, longitude: -180 } |
| ] |
| } |
| |
| MapPolygon { |
| id: poly1 |
| color: "red" |
| objectName: parent.objectName + "red" |
| backend: polygonBackend() |
| path: [ |
| { latitude: 55, longitude: 170 }, |
| { latitude: 66.9965, longitude: -175.012 }, |
| { latitude: 55, longitude: -160 }, |
| { latitude: 40, longitude: -165 }, |
| { latitude: 45, longitude: 178 } |
| ] |
| MouseArea { |
| anchors.fill: parent |
| onClicked: console.log("poly1 in "+parent.parent.objectName + "clicked") |
| |
| Rectangle { // this is technically unsupported, but practically works. |
| color: "transparent" |
| border.color: "red" |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| MapPolygon { |
| id: selfIntersectingPolygon |
| color: 'darkmagenta' |
| objectName: parent.objectName + "darkmagenta" |
| backend: polygonBackend() |
| opacity: 1.0 |
| path: [ |
| { latitude: 19, longitude: 49 }, |
| { latitude: 18, longitude: 49 }, |
| { latitude: 18, longitude: 51 }, |
| { latitude: 20, longitude: 51 }, |
| { latitude: 20, longitude: 50 }, |
| { latitude: 18.5, longitude: 50 }, |
| { latitude: 18.5, longitude: 52 }, |
| { latitude: 19, longitude: 52 } |
| ] |
| |
| MouseArea{ |
| anchors.fill: parent |
| drag.target: parent // This one might glitch as the tessellation done by earcut might be |
| // inaccurate, so clicking in an area that is covered by earcut but |
| // does not exist will not trigger the panning |
| |
| Rectangle { // this is technically unsupported, but practically works. |
| color: "transparent" |
| border.color: "red" |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| MapPolygon { |
| id: poly2 |
| color: "green" |
| border.color: "black" |
| border.width: 8 |
| objectName: parent.objectName + "green" |
| backend: polygonBackend() |
| path: [ |
| { latitude: -45, longitude: -170 }, |
| { latitude: -55, longitude: -155 }, |
| { latitude: -45, longitude: -130 }, |
| { latitude: -35, longitude: -155 } |
| ] |
| MouseArea{ |
| anchors.fill: parent |
| drag.target: parent |
| Rectangle { // this is technically unsupported, but practically works. |
| color: "transparent" |
| border.color: "red" |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| MapPolygon { |
| id: poly3 |
| color: "deepskyblue" |
| objectName: parent.objectName + "deepskyblue" |
| backend: polygonBackend() |
| opacity: 0.2 |
| path: [ |
| { latitude: 65, longitude: -20 }, |
| { latitude: 75, longitude: 140 }, |
| { latitude: 65, longitude: 80 }, |
| { latitude: 55, longitude: -30 } |
| ] |
| } |
| |
| MapRectangle { |
| id: rect |
| color: 'tomato' |
| border.color: 'black' |
| border.width: 6 |
| topLeft: QtPositioning.coordinate(10,-10) |
| bottomRight: QtPositioning.coordinate(-10,10) |
| backend: rectangleBackend() |
| MouseArea { |
| anchors.fill: parent |
| Rectangle { |
| color: "transparent" |
| border.color: "red" |
| border.width: 1 |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| LongPolyline { |
| id: longPoly |
| backend: polylineBackend() |
| Component.onCompleted: longPolyPath = path |
| } |
| |
| MapCircle { |
| center: QtPositioning.coordinate(52, 0) |
| radius: sliRadius.value |
| color: 'deepskyblue' |
| border.width: 6 |
| border.color: 'firebrick' |
| backend: circleBackend() |
| MouseArea { |
| anchors.fill: parent |
| Rectangle { |
| color: "transparent" |
| border.color: "red" |
| border.width: 1 |
| anchors.fill: parent |
| } |
| } |
| } |
| |
| MapCircle { |
| id: circle1 |
| border.color: 'deepskyblue' |
| border.width: 26 |
| backend: circleBackend() |
| center: QtPositioning.coordinate(17, 44); |
| radius: 200*1000 |
| color: "firebrick" |
| // layer.enabled: (backend == MapCircle.Software) |
| // layer.samples: 4 |
| } |
| } |
| } |
| |
| Component { |
| id: movComponent |
| MapObjectView { |
| id: polyGroup |
| MapPolylineObject { |
| id: tstPolyLine // to verify the polygon stays where it's supposed to |
| line.color: 'black' |
| objectName: parent.objectName + "black" |
| line.width: 1 |
| path: [ |
| { latitude: 76.9965, longitude: -175.012 }, |
| { latitude: 26.9965, longitude: -175.012 } |
| ] |
| } |
| |
| MapPolylineObject { |
| id: timeline |
| line.color: "red" |
| objectName: parent.objectName + "timeline" |
| line.width: 4 |
| path: [ |
| { latitude: 90, longitude: 180 }, |
| { latitude: -90, longitude: -180 } |
| ] |
| } |
| |
| MapPolygonObject { |
| id: poly1 |
| color: "red" |
| objectName: parent.objectName + "red" |
| path: [ |
| { latitude: 55, longitude: 170 }, |
| { latitude: 66.9965, longitude: -175.012 }, |
| { latitude: 55, longitude: -160 }, |
| { latitude: 40, longitude: -165 }, |
| { latitude: 45, longitude: 178 } |
| ] |
| } |
| |
| MapPolygonObject { |
| id: selfIntersectingPolygon |
| color: 'darkmagenta' |
| objectName: parent.objectName + "darkmagenta" |
| path: [ |
| { latitude: 19, longitude: 49 }, |
| { latitude: 18, longitude: 49 }, |
| { latitude: 18, longitude: 51 }, |
| { latitude: 20, longitude: 51 }, |
| { latitude: 20, longitude: 50 }, |
| { latitude: 18.5, longitude: 50 }, |
| { latitude: 18.5, longitude: 52 }, |
| { latitude: 19, longitude: 52 } |
| ] |
| } |
| |
| MapPolygonObject { |
| id: poly2 |
| color: "green" |
| border.color: "black" |
| border.width: 8 |
| objectName: parent.objectName + "green" |
| path: [ |
| { latitude: -45, longitude: -170 }, |
| { latitude: -55, longitude: -155 }, |
| { latitude: -45, longitude: -130 }, |
| { latitude: -35, longitude: -155 } |
| ] |
| } |
| |
| MapPolygonObject { |
| id: poly3 |
| color: Qt.rgba(0, 191.0/255.0, 1, 0.3) //"deepskyblue" |
| objectName: parent.objectName + "deepskyblue" |
| path: [ |
| { latitude: 65, longitude: -20 }, |
| { latitude: 75, longitude: 140 }, |
| { latitude: 65, longitude: 80 }, |
| { latitude: 55, longitude: -30 } |
| ] |
| } |
| |
| MapCircleObject { |
| center: QtPositioning.coordinate(52, 0) |
| radius: sliRadius.value |
| color: 'deepskyblue' |
| border.width: 6 |
| border.color: 'firebrick' |
| } |
| |
| MapPolylineObject { |
| id: longPolyline |
| line.color: "firebrick" |
| objectName: parent.objectName + "longPolyline" |
| line.width: 10 |
| path: longPolyPath |
| } |
| |
| MapCircleObject { |
| id: circle1 |
| border.color: 'deepskyblue' |
| border.width: 26 |
| center: QtPositioning.coordinate(17, 44); |
| radius: 200*1000 |
| color: "firebrick" |
| } |
| } |
| } |
| |
| property var longPolyPath |
| |
| C2.Slider { |
| id: sliRadius |
| orientation: Qt.Vertical |
| anchors { |
| left: parent.left |
| top: parent.top |
| bottom: parent.bottom |
| topMargin: 10 |
| leftMargin: 10 |
| bottomMargin: 10 |
| } |
| from: 30 * 1000 |
| to: 600 * 1000 |
| value: 100 * 1000 |
| } |
| } |