18
18
#include " qgsmeasuredialog.h"
19
19
#include " qgsmeasuretool.h"
20
20
21
+ #include " qgslogger.h"
21
22
#include " qgscontexthelp.h"
22
23
#include " qgsdistancearea.h"
23
24
#include " qgsmapcanvas.h"
@@ -89,16 +90,22 @@ void QgsMeasureDialog::mouseMove( QgsPoint &point )
89
90
QList<QgsPoint> tmpPoints = mTool ->points ();
90
91
tmpPoints.append ( point );
91
92
double area = mTool ->canvas ()->mapRenderer ()->distanceArea ()->measurePolygon ( tmpPoints );
93
+ QGis::UnitType myDisplayUnits;
94
+ // Ignore units
95
+ convertMeasurement ( area, myDisplayUnits, true );
92
96
editTotal->setText ( formatArea ( area ) );
93
97
}
94
98
else if ( !mMeasureArea && mTool ->points ().size () > 0 )
95
99
{
96
100
QgsPoint p1 ( mTool ->points ().last () ), p2 ( point );
97
101
98
102
double d = mTool ->canvas ()->mapRenderer ()->distanceArea ()->measureLine ( p1, p2 );
103
+ editTotal->setText ( formatDistance ( mTotal + d ) );
104
+ QGis::UnitType myDisplayUnits;
105
+ // Ignore units
106
+ convertMeasurement ( d, myDisplayUnits, false );
99
107
QTreeWidgetItem *item = mTable ->topLevelItem ( mTable ->topLevelItemCount () - 1 );
100
108
item->setText ( 0 , QLocale::system ().toString ( d, ' f' , 2 ) );
101
- editTotal->setText ( formatDistance ( mTotal + d ) );
102
109
}
103
110
}
104
111
@@ -108,6 +115,9 @@ void QgsMeasureDialog::addPoint( QgsPoint &point )
108
115
if ( mMeasureArea && numPoints > 2 )
109
116
{
110
117
double area = mTool ->canvas ()->mapRenderer ()->distanceArea ()->measurePolygon ( mTool ->points () );
118
+ QGis::UnitType myDisplayUnits;
119
+ // Ignore units
120
+ convertMeasurement ( area, myDisplayUnits, true );
111
121
editTotal->setText ( formatArea ( area ) );
112
122
}
113
123
else if ( !mMeasureArea && numPoints > 1 )
@@ -121,6 +131,10 @@ void QgsMeasureDialog::addPoint( QgsPoint &point )
121
131
mTotal += d;
122
132
editTotal->setText ( formatDistance ( mTotal ) );
123
133
134
+ QGis::UnitType myDisplayUnits;
135
+ // Ignore units
136
+ convertMeasurement ( d, myDisplayUnits, false );
137
+
124
138
QTreeWidgetItem *item = mTable ->topLevelItem ( mTable ->topLevelItemCount () - 1 );
125
139
item->setText ( 0 , QLocale::system ().toString ( d, ' f' , 2 ) );
126
140
@@ -173,24 +187,26 @@ void QgsMeasureDialog::on_btnHelp_clicked()
173
187
174
188
QString QgsMeasureDialog::formatDistance ( double distance )
175
189
{
176
- QString txt;
177
- QString unitLabel;
178
-
179
- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
180
- return QgsDistanceArea::textUnit ( distance, 2 , myMapUnits, false );
190
+ QGis::UnitType myDisplayUnits;
191
+ convertMeasurement ( distance, myDisplayUnits, false );
192
+ return QgsDistanceArea::textUnit ( distance, 2 , myDisplayUnits, false );
181
193
}
182
194
183
195
QString QgsMeasureDialog::formatArea ( double area )
184
196
{
185
- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
186
- return QgsDistanceArea::textUnit ( area, 2 , myMapUnits, true );
197
+ QGis::UnitType myDisplayUnits;
198
+ convertMeasurement ( area, myDisplayUnits, true );
199
+ return QgsDistanceArea::textUnit ( area, 2 , myDisplayUnits, true );
187
200
}
188
201
189
202
void QgsMeasureDialog::updateUi ()
190
203
{
204
+ double dummy = 1.0 ;
205
+ QGis::UnitType myDisplayUnits;
206
+ // The dummy distance is ignored
207
+ convertMeasurement ( dummy, myDisplayUnits, false );
191
208
192
- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
193
- switch ( myMapUnits )
209
+ switch ( myDisplayUnits )
194
210
{
195
211
case QGis::Meters:
196
212
mTable ->setHeaderLabels ( QStringList ( tr ( " Segments (in meters)" ) ) );
@@ -218,3 +234,43 @@ void QgsMeasureDialog::updateUi()
218
234
219
235
}
220
236
237
+ void QgsMeasureDialog::convertMeasurement (double &measure, QGis::UnitType &u, bool isArea)
238
+ {
239
+ // Helper for converting between meters and feet
240
+ // The parameter &u is out only...
241
+
242
+ QGis::UnitType myUnits = mTool ->canvas ()->mapUnits ();
243
+ if ( myUnits == QGis::Degrees &&
244
+ mTool ->canvas ()->mapRenderer ()->distanceArea ()->ellipsoid () != " NONE" &&
245
+ mTool ->canvas ()->mapRenderer ()->distanceArea ()->hasCrsTransformEnabled () )
246
+ {
247
+ // Measuring on an ellipsoid returns meters
248
+ myUnits = QGis::Meters;
249
+ }
250
+
251
+ // Get the units for display
252
+ QSettings settings;
253
+ QString myDisplayUnitsTxt = settings.value ( " /qgis/measure/displayunits" , " meters" ).toString ();
254
+
255
+ // Only convert between meters and feet
256
+ if ( myUnits == QGis::Meters && myDisplayUnitsTxt == " feet" )
257
+ {
258
+ measure /= 0.3048 ;
259
+ if ( isArea )
260
+ {
261
+ measure /= 0.3048 ;
262
+ }
263
+ myUnits = QGis::Feet;
264
+ }
265
+ if ( myUnits == QGis::Feet && myDisplayUnitsTxt == " meters" )
266
+ {
267
+ measure *= 0.3048 * 0.3048 ;
268
+ if ( isArea )
269
+ {
270
+ measure *= 0.3048 ;
271
+ }
272
+ myUnits = QGis::Meters;
273
+ }
274
+
275
+ u = myUnits;
276
+ }
0 commit comments