QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MapScale.qml
Go to the documentation of this file.
1import QtQuick
2import QtQuick.Controls
3
4import QGroundControl
5import QGroundControl.Controls
6
7/// Map scale control
8Item {
9 id: control
10 width: rightEnd.x + rightEnd.width
11 height: rightEnd.y + rightEnd.height
12
13 property var mapControl ///< Map control for which this scale control is being used
14 property bool autoHide: false ///< true: disappears after a timeout on scale change
15
16 property var _scaleLengthsMeters: [5, 10, 25, 50, 100, 150, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000]
17 property var _scaleLengthsFeet: [10, 25, 50, 100, 250, 500, 1000, 2000, 3000, 4000, 5280, 5280*2, 5280*5, 5280*10, 5280*25, 5280*50, 5280*100, 5280*250, 5280*500, 5280*1000]
18 property var _color: mapControl.isSatelliteMap ? "white" : "black"
19
20 function formatDistanceMeters(meters) {
21 var dist = Math.round(meters)
22 if (dist > 1000 ){
23 if (dist > 100000){
24 dist = Math.round(dist / 1000)
25 } else {
26 dist = Math.round(dist / 100)
27 dist = dist / 10
28 }
29 dist = dist + qsTr(" km")
30 } else {
31 dist = dist + qsTr(" m")
32 }
33 return dist
34 }
35
36 function formatDistanceFeet(feet) {
37 var dist = Math.round(feet)
38 if (dist >= 5280) {
39 dist = Math.round(dist / 5280)
40 dist = dist
41 if (dist == 1) {
42 dist += qsTr(" mile")
43 } else {
44 dist += qsTr(" miles")
45 }
46 } else {
47 dist = dist + qsTr(" ft")
48 }
49 return dist
50 }
51
52 function calculateMetersRatio(scaleLineMeters, scaleLinePixelLength) {
53 var scaleLineRatio = 0
54
55 if (scaleLineMeters === 0) {
56 // not visible
57 } else {
58 for (var i = 0; i < _scaleLengthsMeters.length - 1; i++) {
59 if (scaleLineMeters < (_scaleLengthsMeters[i] + _scaleLengthsMeters[i+1]) / 2 ) {
60 scaleLineRatio = _scaleLengthsMeters[i] / scaleLineMeters
61 scaleLineMeters = _scaleLengthsMeters[i]
62 break;
63 }
64 }
65 if (scaleLineRatio === 0) {
66 scaleLineRatio = scaleLineMeters / _scaleLengthsMeters[i]
67 scaleLineMeters = _scaleLengthsMeters[i]
68 }
69 }
70
71 var text = formatDistanceMeters(scaleLineMeters)
72 centerLine.width = (scaleLinePixelLength * scaleLineRatio) - (2 * leftEnd.width)
73 scaleText.text = text
74 }
75
76 function calculateFeetRatio(scaleLineMeters, scaleLinePixelLength) {
77 var scaleLineRatio = 0
78 var scaleLineFeet = scaleLineMeters * 3.2808399
79
80 if (scaleLineFeet === 0) {
81 // not visible
82 } else {
83 for (var i = 0; i < _scaleLengthsFeet.length - 1; i++) {
84 if (scaleLineFeet < (_scaleLengthsFeet[i] + _scaleLengthsFeet[i+1]) / 2 ) {
85 scaleLineRatio = _scaleLengthsFeet[i] / scaleLineFeet
86 scaleLineFeet = _scaleLengthsFeet[i]
87 break;
88 }
89 }
90 if (scaleLineRatio === 0) {
91 scaleLineRatio = scaleLineFeet / _scaleLengthsFeet[i]
92 scaleLineFeet = _scaleLengthsFeet[i]
93 }
94 }
95
96 var text = formatDistanceFeet(scaleLineFeet)
97 centerLine.width = (scaleLinePixelLength * scaleLineRatio) - (2 * leftEnd.width)
98 scaleText.text = text
99 }
100
101 function calculateScale() {
102 if(mapControl) {
103 var scaleLinePixelLength = 100
104 var leftCoord = mapControl.toCoordinate(Qt.point(0, control.y), false /* clipToViewPort */)
105 var rightCoord = mapControl.toCoordinate(Qt.point(scaleLinePixelLength, control.y), false /* clipToViewPort */)
106 var scaleLineMeters = Math.round(leftCoord.distanceTo(rightCoord))
107 if (QGroundControl.settingsManager.unitsSettings.horizontalDistanceUnits.value === UnitsSettings.HorizontalDistanceUnitsFeet) {
108 calculateFeetRatio(scaleLineMeters, scaleLinePixelLength)
109 } else {
110 calculateMetersRatio(scaleLineMeters, scaleLinePixelLength)
111 }
112 }
113 }
114
115 function triggerRecalc() {
116 calculateScale()
117 if (control.autoHide) {
118 autoHideTimer.restart()
119 autoHideAnimation.stop()
120 control.opacity = 1
121 }
122 }
123
124 Component.onCompleted: calculateScale()
125
126 Connections {
127 target: mapControl
128 function onWidthChanged() { triggerRecalc() }
129 function onHeightChanged() { triggerRecalc() }
130 function onZoomLevelChanged() { triggerRecalc() }
131 }
132
133 PropertyAnimation {
134 id: autoHideAnimation
135 target: control
136 property: "opacity"
137 from: 1
138 to: 0
139 duration: 500
140 }
141
142 Timer {
143 id: autoHideTimer
144 interval: 3000
145 onTriggered: autoHideAnimation.start()
146 }
147
148 QGCMapLabel {
149 id: scaleText
150 map: mapControl
151 font.bold: true
152 anchors.left: parent.left
153 anchors.right: rightEnd.right
154 horizontalAlignment:Text.AlignRight
155 text: "0 m"
156 }
157
158 Rectangle {
159 id: leftEnd
160 anchors.top: scaleText.bottom
161 anchors.left: parent.left
162 width: 2
163 height: ScreenTools.defaultFontPixelHeight
164 color: _color
165 }
166
167 Rectangle {
168 id: centerLine
169 anchors.bottomMargin: 2
170 anchors.bottom: leftEnd.bottom
171 anchors.left: leftEnd.right
172 height: 2
173 color: _color
174 }
175
176 Rectangle {
177 id: rightEnd
178 anchors.top: leftEnd.top
179 anchors.left: centerLine.right
180 width: 2
181 height: ScreenTools.defaultFontPixelHeight
182 color: _color
183 }
184}