mapviewer.qml Example File
mapviewer/mapviewer.qml
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** 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.
**
** BSD License Usage
** Alternatively, 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.5
import QtQuick.Controls 1.4
import QtLocation 5.6
import QtPositioning 5.5
import "map"
import "menus"
import "helper.js" as Helper
ApplicationWindow {
id: appWindow
property variant map
property variant minimap
property variant parameters
//defaults
property variant fromCoordinate: QtPositioning.coordinate(59.9483, 10.7695)
property variant toCoordinate: QtPositioning.coordinate(59.9645, 10.671)
function createMap(provider)
{
var plugin
if (parameters && parameters.length>0)
plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin{ name:"' + provider + '"; parameters: appWindow.parameters}', appWindow)
else
plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin{ name:"' + provider + '"}', appWindow)
if (minimap) {
minimap.destroy()
minimap = null
}
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()
}
map = mapComponent.createObject(page);
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 {
// 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()
}
function getPlugins()
{
var plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin {}', appWindow)
var myArray = new Array()
for (var i = 0; i" + qsTr("Distance:") + " " + distance)
break
case "drawImage":
map.addGeoItem("ImageItem")
break
case "drawRectangle":
map.addGeoItem("RectangleItem")
break
case "drawCircle":
map.addGeoItem("CircleItem")
break;
case "drawPolyline":
map.addGeoItem("PolylineItem")
break;
case "drawPolygonMenu":
map.addGeoItem("PolygonItem")
break
default:
console.log("Unsupported operation")
}
}
}
ItemPopupMenu {
id: itemPopupMenu
function show(type,coordinate)
{
stackView.pop(page)
itemPopupMenu.type = type
itemPopupMenu.update()
itemPopupMenu.popup()
}
onItemClicked: {
stackView.pop(page)
switch (item) {
case "showRouteInfo":
stackView.showRouteListPage()
break;
case "deleteRoute":
map.routeModel.reset();
break;
case "showPointInfo":
map.showGeocodeInfo()
break;
case "deletePoint":
map.geocodeModel.reset()
break;
default:
console.log("Unsupported operation")
}
}
}
StackView {
id: stackView
anchors.fill: parent
focus: true
initialItem: Item {
id: page
}
function showMessage(title,message,backPage)
{
push({ item: Qt.resolvedUrl("forms/Message.qml") ,
properties: {
"title" : title,
"message" : message,
"backPage" : backPage
}})
currentItem.closeForm.connect(closeMessage)
}
function closeMessage(backPage)
{
pop(backPage)
}
function closeForm()
{
pop(page)
}
function showRouteListPage()
{
push({ item: Qt.resolvedUrl("forms/RouteList.qml") ,
properties: {
"routeModel" : map.routeModel
}})
currentItem.closeForm.connect(closeForm)
}
}
Component {
id: mapComponent
MapComponent{
width: page.width
height: page.height
onFollowmeChanged: mainMenu.isFollowMe = map.followme
onSupportedMapTypesChanged: mainMenu.mapTypeMenu.createMenu(map)
onCoordinatesCaptured: {
var text = "" + qsTr("Latitude:") + " " + Helper.roundNumber(latitude,4) + "
" + qsTr("Longitude:") + " " + Helper.roundNumber(longitude,4)
stackView.showMessage(qsTr("Coordinates"),text);
}
onGeocodeFinished:{
if (map.geocodeModel.status == GeocodeModel.Ready) {
if (map.geocodeModel.count == 0) {
stackView.showMessage(qsTr("Geocode Error"),qsTr("Unsuccessful geocode"))
} else if (map.geocodeModel.count > 1) {
stackView.showMessage(qsTr("Ambiguous geocode"), map.geocodeModel.count + " " +
qsTr("results found for the given address, please specify location"))
} else {
stackView.showMessage(qsTr("Location"), geocodeMessage(),page)
}
} else if (map.geocodeModel.status == GeocodeModel.Error) {
stackView.showMessage(qsTr("Geocode Error"),qsTr("Unsuccessful geocode"))
}
}
onRouteError: stackView.showMessage(qsTr("Route Error"),qsTr("Unable to find a route for the given points"),page)
onShowGeocodeInfo: stackView.showMessage(qsTr("Location"),geocodeMessage(),page)
onErrorChanged: {
if (map.error != Map.NoError) {
var title = qsTr("ProviderError")
var message = map.errorString + "
" + qsTr("Try to select other provider") + ""
if (map.error == Map.MissingRequiredParameterError)
message += "
" + qsTr("or see") + " \'mapviewer --help\' "
+ qsTr("how to pass plugin parameters.")
stackView.showMessage(title,message);
}
}
onShowMainMenu: mapPopupMenu.show(coordinate)
onShowMarkerMenu: markerPopupMenu.show(coordinate)
onShowRouteMenu: itemPopupMenu.show("Route",coordinate)
onShowPointMenu: itemPopupMenu.show("Point",coordinate)
onShowRouteList: stackView.showRouteListPage()
}
}
}