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 && 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 Connections {
134 target: QGroundControl.unitsConversion
135 function onUnitsChanged() { triggerRecalc() }
136 }
137
138 PropertyAnimation {
139 id: autoHideAnimation
140 target: control
141 property: "opacity"
142 from: 1
143 to: 0
144 duration: 500
145 }
146
147 Timer {
148 id: autoHideTimer
149 interval: 3000
150 onTriggered: autoHideAnimation.start()
151 }
152
153 QGCMapLabel {
154 id: scaleText
155 objectName: "scaleText"
156 map: mapControl
157 font.bold: true
158 anchors.left: parent.left
159 anchors.right: rightEnd.right
160 horizontalAlignment:Text.AlignRight
161 text: "0 m"
162 }
163
164 Rectangle {
165 id: leftEnd
166 anchors.top: scaleText.bottom
167 anchors.left: parent.left
168 width: 2
169 height: ScreenTools.defaultFontPixelHeight
170 color: _color
171 }
172
173 Rectangle {
174 id: centerLine
175 anchors.bottomMargin: 2
176 anchors.bottom: leftEnd.bottom
177 anchors.left: leftEnd.right
178 height: 2
179 color: _color
180 }
181
182 Rectangle {
183 id: rightEnd
184 anchors.top: leftEnd.top
185 anchors.left: centerLine.right
186 width: 2
187 height: ScreenTools.defaultFontPixelHeight
188 color: _color
189 }
190}