import QtQuick 2.0
import QtLocation 5.0
import QtLocation.examples 5.0
Map {
id: map
zoomLevel: (maximumZoomLevel - minimumZoomLevel)/2
center: brisbaneCoordinate
pinch.activeGestures: MapPinchArea.ZoomGesture
pinch.enabled: true
flick.enabled: true
flick.deceleration: 3000
signal mapPressed()
property bool followme: false
property variant scaleLengths: [5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
Coordinate {
id: brisbaneCoordinate
latitude: -27.5
longitude: 153
}
PositionSource{
id: positionSource
active: followme
onPositionChanged: {
map.center = positionSource.position.coordinate
}
}
Slider {
id: zoomSlider;
minimum: map.minimumZoomLevel;
maximum: map.maximumZoomLevel;
opacity: 1
visible: parent.visible
z: map.z+1
anchors {
bottom: parent.bottom;
bottomMargin: 56; rightMargin: 10; leftMargin: 10
left: parent.left
}
width: parent.width - anchors.rightMargin - anchors.leftMargin
value: map.zoomLevel
onReleasedChanged: {
if (released == true){
map.cameraStopped()
released = false
}
}
onValueChanged: {
map.zoomLevel = value
}
}
signal coordinatesCaptured(double latitude, double longitude)
Item {
id: scale
parent: zoomSlider.parent
visible: scaleText.text != "0 m"
z: map.z
opacity: 0.6
anchors {
bottom: zoomSlider.top;
bottomMargin: 8;
leftMargin: 20
left: zoomSlider.left
}
Image {
id: scaleImageLeft
source: "../../resources/scale_end.png"
anchors.bottom: parent.bottom
anchors.left: parent.left
}
Image {
id: scaleImage
source: "../../resources/scale.png"
anchors.bottom: parent.bottom
anchors.left: scaleImageLeft.right
}
Image {
id: scaleImageRight
source: "../../resources/scale_end.png"
anchors.bottom: parent.bottom
anchors.left: scaleImage.right
}
Text {
id: scaleText
color: "#004EAE"
horizontalAlignment: Text.AlignHCenter
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.bottomMargin: 3
text: "0 m"
font.pixelSize: 14
}
Component.onCompleted: {
map.calculateScale();
}
}
Timer {
id: scaleTimer
interval: 100
running: false
repeat: false
onTriggered: {
map.calculateScale()
}
}
onCenterChanged:{
scaleTimer.restart()
if (map.followme)
if (map.center != positionSource.position.coordinate) map.followme = false
}
onZoomLevelChanged:{
scaleTimer.restart()
if (map.followme) map.center = positionSource.position.coordinate
}
onWidthChanged:{
scaleTimer.restart()
}
onHeightChanged:{
scaleTimer.restart()
}
Keys.onPressed: {
if ((event.key == Qt.Key_Plus) || (event.key == Qt.Key_VolumeUp)) {
map.zoomLevel += 1
} else if ((event.key == Qt.Key_Minus) || (event.key == Qt.Key_VolumeDown)){
map.zoomLevel -= 1
}
}
function calculateScale(){
var coord1, coord2, dist, text, f
f = 0
coord1 = map.toCoordinate(Qt.point(0,scale.y))
coord2 = map.toCoordinate(Qt.point(0+scaleImage.sourceSize.width,scale.y))
dist = Math.round(coord1.distanceTo(coord2))
if (dist === 0) {
} else {
for (var i = 0; i < scaleLengths.length-1; i++) {
if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) {
f = scaleLengths[i] / dist
dist = scaleLengths[i]
break;
}
}
if (f === 0) {
f = dist / scaleLengths[i]
dist = scaleLengths[i]
}
}
text = formatDistance(dist)
scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width
scaleText.text = text
}
function roundNumber(number, digits) {
var multiple = Math.pow(10, digits);
return Math.round(number * multiple) / multiple;
}
function formatTime(sec){
var value = sec
var seconds = value % 60
value /= 60
value = (value > 1) ? Math.round(value) : 0
var minutes = value % 60
value /= 60
value = (value > 1) ? Math.round(value) : 0
var hours = value
if (hours > 0) value = hours + "h:"+ minutes + "m"
else value = minutes + "min"
return value
}
function formatDistance(meters)
{
var dist = Math.round(meters)
if (dist > 1000 ){
if (dist > 100000){
dist = Math.round(dist / 1000)
}
else{
dist = Math.round(dist / 100)
dist = dist / 10
}
dist = dist + " km"
}
else{
dist = dist + " m"
}
return dist
}
}