diff options
Diffstat (limited to 'examples')
16 files changed, 401 insertions, 28 deletions
diff --git a/examples/location/mapviewer/doc/images/mapviewer.png b/examples/location/mapviewer/doc/images/mapviewer.png Binary files differindex 4dc13f72..b55d7ff3 100644 --- a/examples/location/mapviewer/doc/images/mapviewer.png +++ b/examples/location/mapviewer/doc/images/mapviewer.png diff --git a/examples/location/mapviewer/main.cpp b/examples/location/mapviewer/main.cpp index 1b526435..c44e3d9e 100644 --- a/examples/location/mapviewer/main.cpp +++ b/examples/location/mapviewer/main.cpp @@ -84,11 +84,36 @@ static bool parseArgs(QStringList& args, QVariantMap& parameters) int main(int argc, char *argv[]) { + const QByteArray additionalLibraryPaths = qgetenv("QTLOCATION_EXTRA_LIBRARY_PATH"); + for (const QByteArray &p : additionalLibraryPaths.split(':')) + QCoreApplication::addLibraryPath(QString(p)); + + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication application(argc, argv); QVariantMap parameters; QStringList args(QCoreApplication::arguments()); + // Fetch tokens from the environment, if present + const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID"); + const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN"); + const QByteArray hereAppID = qgetenv("HERE_APP_ID"); + const QByteArray hereToken = qgetenv("HERE_TOKEN"); + const QByteArray esriToken = qgetenv("ESRI_TOKEN"); + + if (!mapboxMapID.isEmpty()) + parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID); + if (!mapboxAccessToken.isEmpty()) { + parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + parameters["mapboxgl.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + } + if (!hereAppID.isEmpty()) + parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID); + if (!hereToken.isEmpty()) + parameters["here.token"] = QString::fromLocal8Bit(hereToken); + if (!esriToken.isEmpty()) + parameters["esri.token"] = QString::fromLocal8Bit(esriToken); + if (parseArgs(args, parameters)) return 0; if (!args.contains(QStringLiteral("osm.useragent"))) diff --git a/examples/location/mapviewer/map/MapComponent.qml b/examples/location/mapviewer/map/MapComponent.qml index 008a4a00..570505a0 100644 --- a/examples/location/mapviewer/map/MapComponent.qml +++ b/examples/location/mapviewer/map/MapComponent.qml @@ -39,7 +39,7 @@ ****************************************************************************/ import QtQuick 2.5 import QtQuick.Controls 1.4 -import QtLocation 5.6 +import QtLocation 5.9 import QtPositioning 5.5 import "../helper.js" as Helper @@ -61,6 +61,7 @@ Map { property alias routeQuery: routeQuery property alias routeModel: routeModel property alias geocodeModel: geocodeModel + property alias slidersExpanded: sliders.expanded signal showGeocodeInfo() signal geocodeFinished() @@ -269,7 +270,7 @@ Map { //! [mapnavigation] // Enable pan, flick, and pinch gestures to zoom in and out - gesture.acceptedGestures: MapGestureArea.PanGesture | MapGestureArea.FlickGesture | MapGestureArea.PinchGesture + gesture.acceptedGestures: MapGestureArea.PanGesture | MapGestureArea.FlickGesture | MapGestureArea.PinchGesture | MapGestureArea.RotationGesture | MapGestureArea.TiltGesture gesture.flickDeceleration: 3000 gesture.enabled: true //! [mapnavigation] @@ -364,22 +365,11 @@ Map { anchorPoint: Qt.point(-poiTheQtComapny.sourceItem.width * 0.5,poiTheQtComapny.sourceItem.height * 1.5) } - - Slider { - id: zoomSlider; + MapSliders { + id: sliders z: map.z + 3 - minimumValue: map.minimumZoomLevel; - maximumValue: map.maximumZoomLevel; - anchors.margins: 10 - anchors.bottom: scale.top - anchors.top: parent.top - anchors.right: parent.right - orientation : Qt.Vertical - value: map.zoomLevel - onValueChanged: { - if (value >= 0) - map.zoomLevel = value - } + mapSource: map + edge: Qt.LeftEdge } Item { @@ -614,9 +604,9 @@ Map { var mouseGeoPos = map.toCoordinate(Qt.point(mouse.x, mouse.y)); var preZoomPoint = map.fromCoordinate(mouseGeoPos, false); if (mouse.button === Qt.LeftButton) { - map.zoomLevel++; + map.zoomLevel = Math.floor(map.zoomLevel + 1) } else if (mouse.button === Qt.RightButton) { - map.zoomLevel--; + map.zoomLevel = Math.floor(map.zoomLevel - 1) } var postZoomPoint = map.fromCoordinate(mouseGeoPos, false); var dx = postZoomPoint.x - preZoomPoint.x; diff --git a/examples/location/mapviewer/map/MapSliders.qml b/examples/location/mapviewer/map/MapSliders.qml new file mode 100644 index 00000000..8e24481f --- /dev/null +++ b/examples/location/mapviewer/map/MapSliders.qml @@ -0,0 +1,323 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Controls 2.0 as C2 + +Row { + id: containerRow + + property var mapSource + property real fontSize : 14 + property color labelBackground : "transparent" + property int edge: Qt.RightEdge + property alias expanded: sliderToggler.checked + + function rightEdge() { + return (containerRow.edge === Qt.RightEdge); + } + + layoutDirection: rightEdge() ? Qt.LeftToRight : Qt.RightToLeft + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: rightEdge() ? parent.right : undefined + anchors.left: rightEdge() ? undefined : parent.left + + Button { + id: sliderToggler + width: 32 + height: 96 + checkable: true + checked: true + anchors.verticalCenter: parent.verticalCenter + + transform: Scale { + origin.x: rightEdge() ? 0 : sliderToggler.width / 2 + xScale: rightEdge() ? 1 : -1 + } + + style: ButtonStyle { + background: Rectangle { + color: "transparent" + } + } + + property real shear: 0.333 + property real buttonOpacity: 0.5 + property real mirror : rightEdge() ? 1.0 : -1.0 + + Rectangle { + width: 16 + height: 48 + color: "seagreen" + antialiasing: true + opacity: sliderToggler.buttonOpacity + anchors.top: parent.top + anchors.left: sliderToggler.checked ? parent.left : parent.horizontalCenter + transform: Matrix4x4 { + property real d : sliderToggler.checked ? 1.0 : -1.0 + matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0) + } + } + + Rectangle { + width: 16 + height: 48 + color: "seagreen" + antialiasing: true + opacity: sliderToggler.buttonOpacity + anchors.top: parent.verticalCenter + anchors.right: sliderToggler.checked ? parent.right : parent.horizontalCenter + transform: Matrix4x4 { + property real d : sliderToggler.checked ? -1.0 : 1.0 + matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0) + } + } + } + + Rectangle { + id: sliderContainer + height: parent.height + width: sliderRow.width + 10 + visible: sliderToggler.checked + color: Qt.rgba( 0, 191 / 255.0, 255 / 255.0, 0.07) + + property var labelBorderColor: "transparent" + property var slidersHeight : sliderContainer.height + - rowSliderValues.height + - rowSliderLabels.height + - sliderColumn.spacing * 2 + - sliderColumn.topPadding + - sliderColumn.bottomPadding + + Column { + id: sliderColumn + spacing: 10 + topPadding: 16 + bottomPadding: 48 + anchors.centerIn: parent + + // the sliders value labels + Row { + id: rowSliderValues + spacing: sliderRow.spacing + width: sliderRow.width + height: 32 + property real entryWidth: zoomSlider.width + + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelZoomValue + text: zoomSlider.value.toFixed(3) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelBearingValue + text: bearingSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelTiltValue + text: tiltSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelFovValue + text: fovSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + } // rowSliderValues + + // The sliders row + Row { + spacing: -10 + id: sliderRow + height: sliderContainer.slidersHeight + + C2.Slider { + id: zoomSlider + height: parent.height + orientation : Qt.Vertical + from : containerRow.mapSource.minimumZoomLevel + to : containerRow.mapSource.maximumZoomLevel + value : containerRow.mapSource.zoomLevel + onValueChanged: { + containerRow.mapSource.zoomLevel = value + } + } + C2.Slider { + id: bearingSlider + height: parent.height + from: 0 + to: 360 + orientation : Qt.Vertical + value: containerRow.mapSource.bearing + onValueChanged: { + containerRow.mapSource.bearing = value; + } + } + C2.Slider { + id: tiltSlider + height: parent.height + orientation : Qt.Vertical + from: containerRow.mapSource.minimumTilt; + to: containerRow.mapSource.maximumTilt + value: containerRow.mapSource.tilt + onValueChanged: { + containerRow.mapSource.tilt = value; + } + } + C2.Slider { + id: fovSlider + height: parent.height + orientation : Qt.Vertical + from: containerRow.mapSource.minimumFieldOfView + to: containerRow.mapSource.maximumFieldOfView + value: containerRow.mapSource.fieldOfView + onValueChanged: { + containerRow.mapSource.fieldOfView = value; + } + } + } // Row sliders + + // The labels row + Row { + id: rowSliderLabels + spacing: sliderRow.spacing + width: sliderRow.width + property real entryWidth: zoomSlider.width + property real entryHeight: 64 + + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelZoom + text: "Zoom" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelBearing + text: "Bearing" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelTilt + text: "Tilt" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelFov + text: "FoV" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + } // rowSliderLabels + } // Column + } // sliderContainer +} // containerRow diff --git a/examples/location/mapviewer/mapviewer.pro b/examples/location/mapviewer/mapviewer.pro index 5f463c85..90d85e62 100644 --- a/examples/location/mapviewer/mapviewer.pro +++ b/examples/location/mapviewer/mapviewer.pro @@ -11,6 +11,7 @@ RESOURCES += \ OTHER_FILES +=mapviewer.qml \ helper.js \ map/MapComponent.qml \ + map/MapSliders.qml \ map/Marker.qml \ map/CircleItem.qml \ map/RectangleItem.qml \ diff --git a/examples/location/mapviewer/mapviewer.qml b/examples/location/mapviewer/mapviewer.qml index 08ef2663..debc329f 100644 --- a/examples/location/mapviewer/mapviewer.qml +++ b/examples/location/mapviewer/mapviewer.qml @@ -73,10 +73,18 @@ ApplicationWindow { } var zoomLevel = null + var tilt = null + var bearing = null + var fov = null var center = null + var panelExpanded = null if (map) { zoomLevel = map.zoomLevel + tilt = map.tilt + bearing = map.bearing + fov = map.fieldOfView center = map.center + panelExpanded = map.slidersExpanded map.destroy() } @@ -84,10 +92,17 @@ ApplicationWindow { map.plugin = plugin; if (zoomLevel != null) { + map.tilt = tilt + map.bearing = bearing + map.fieldOfView = fov map.zoomLevel = zoomLevel map.center = center + map.slidersExpanded = panelExpanded } else { - map.zoomLevel = (map.maximumZoomLevel - map.minimumZoomLevel)/2 + // Use an integer ZL to enable nearest interpolation, if possible. + map.zoomLevel = Math.floor((map.maximumZoomLevel - map.minimumZoomLevel)/2) + // defaulting to 45 degrees, if possible. + map.fieldOfView = Math.min(Math.max(45.0, map.minimumFieldOfView), map.maximumFieldOfView) } map.forceActiveFocus() diff --git a/examples/location/mapviewer/mapviewer.qrc b/examples/location/mapviewer/mapviewer.qrc index a84c67da..7a7d1f4c 100644 --- a/examples/location/mapviewer/mapviewer.qrc +++ b/examples/location/mapviewer/mapviewer.qrc @@ -2,6 +2,7 @@ <qresource prefix="/"> <file>mapviewer.qml</file> <file>map/MapComponent.qml</file> + <file>map/MapSliders.qml</file> <file>map/Marker.qml</file> <file>map/PolylineItem.qml</file> <file>map/RectangleItem.qml</file> diff --git a/examples/location/minimal_map/doc/images/minimal_map.png b/examples/location/minimal_map/doc/images/minimal_map.png Binary files differindex 31ad0f8b..73a16fd5 100644 --- a/examples/location/minimal_map/doc/images/minimal_map.png +++ b/examples/location/minimal_map/doc/images/minimal_map.png diff --git a/examples/location/minimal_map/main.qml b/examples/location/minimal_map/main.qml index 26f24986..58b1c54f 100644 --- a/examples/location/minimal_map/main.qml +++ b/examples/location/minimal_map/main.qml @@ -49,8 +49,8 @@ Window { visible: true Plugin { - id: osmPlugin - name: "osm" + id: mapPlugin + name: "osm" // "mapboxgl", "esri", ... // specify plugin parameters if necessary // PluginParameter { // name: @@ -60,8 +60,8 @@ Window { Map { anchors.fill: parent - plugin: osmPlugin + plugin: mapPlugin center: QtPositioning.coordinate(59.91, 10.75) // Oslo - zoomLevel: 10 + zoomLevel: 14 } } diff --git a/examples/location/places/doc/images/places.png b/examples/location/places/doc/images/places.png Binary files differindex 0b1ac8b7..c8ada27d 100644 --- a/examples/location/places/doc/images/places.png +++ b/examples/location/places/doc/images/places.png diff --git a/examples/location/places/main.cpp b/examples/location/places/main.cpp index 8c3b64ed..a30fb857 100644 --- a/examples/location/places/main.cpp +++ b/examples/location/places/main.cpp @@ -90,6 +90,24 @@ int main(int argc, char *argv[]) QVariantMap parameters; QStringList args(QCoreApplication::arguments()); + // Fetch tokens from the environment, if present + const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID"); + const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN"); + const QByteArray hereAppID = qgetenv("HERE_APP_ID"); + const QByteArray hereToken = qgetenv("HERE_TOKEN"); + const QByteArray esriToken = qgetenv("ESRI_TOKEN"); + + if (!mapboxMapID.isEmpty()) + parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID); + if (!mapboxAccessToken.isEmpty()) + parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + if (!hereAppID.isEmpty()) + parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID); + if (!hereToken.isEmpty()) + parameters["here.token"] = QString::fromLocal8Bit(hereToken); + if (!esriToken.isEmpty()) + parameters["esri.token"] = QString::fromLocal8Bit(esriToken); + if (parseArgs(args, parameters)) return 0; diff --git a/examples/location/places_map/doc/images/places_map.png b/examples/location/places_map/doc/images/places_map.png Binary files differindex 4982df23..72317e2d 100644 --- a/examples/location/places_map/doc/images/places_map.png +++ b/examples/location/places_map/doc/images/places_map.png diff --git a/examples/location/places_map/places_map.qml b/examples/location/places_map/places_map.qml index e7d20e7b..467a31de 100644 --- a/examples/location/places_map/places_map.qml +++ b/examples/location/places_map/places_map.qml @@ -51,7 +51,7 @@ Rectangle { //! [Initialize Plugin] Plugin { id: myPlugin - name: "osm" + name: "osm" // "mapboxgl", "esri", ... //specify plugin parameters if necessary //PluginParameter {...} //PluginParameter {...} diff --git a/examples/location/planespotter/doc/images/planespotter.png b/examples/location/planespotter/doc/images/planespotter.png Binary files differindex dcfd55fe..f68f6f22 100644 --- a/examples/location/planespotter/doc/images/planespotter.png +++ b/examples/location/planespotter/doc/images/planespotter.png diff --git a/examples/location/planespotter/main.cpp b/examples/location/planespotter/main.cpp index c71a6999..76b706c9 100644 --- a/examples/location/planespotter/main.cpp +++ b/examples/location/planespotter/main.cpp @@ -47,7 +47,7 @@ #include <QDebug> #include <QEasingCurve> #include <QGeoCoordinate> -#include <QtPositioning/private/qgeoprojection_p.h> +#include <QtPositioning/private/qwebmercator_p.h> #define ANIMATION_DURATION 4000 @@ -162,7 +162,7 @@ private: progress = ((qreal)startTime.msecsTo(current) / ANIMATION_DURATION); } - setPosition(QGeoProjection::coordinateInterpolation( + setPosition(QWebMercator::coordinateInterpolation( fromCoordinate, toCoordinate, easingCurve.valueForProgress(progress))); if (!timer.isActive()) diff --git a/examples/location/planespotter/planespotter.qml b/examples/location/planespotter/planespotter.qml index 624a015e..62930ba7 100644 --- a/examples/location/planespotter/planespotter.qml +++ b/examples/location/planespotter/planespotter.qml @@ -62,7 +62,7 @@ Window { anchors.centerIn: parent; anchors.fill: parent plugin: Plugin { - name: "osm" + name: "osm" // "mapboxgl", "esri", ... } Plane { |