1818#include " qgsmeasuredialog.h"
1919#include " qgsmeasuretool.h"
2020
21+ #include " qgslogger.h"
2122#include " qgscontexthelp.h"
2223#include " qgsdistancearea.h"
2324#include " qgsmapcanvas.h"
@@ -96,9 +97,12 @@ void QgsMeasureDialog::mouseMove( QgsPoint &point )
9697 QgsPoint p1 ( mTool ->points ().last () ), p2 ( point );
9798
9899 double d = mTool ->canvas ()->mapRenderer ()->distanceArea ()->measureLine ( p1, p2 );
100+ editTotal->setText ( formatDistance ( mTotal + d ) );
101+ QGis::UnitType myDisplayUnits;
102+ // Ignore units
103+ convertMeasurement ( d, myDisplayUnits, false );
99104 QTreeWidgetItem *item = mTable ->topLevelItem ( mTable ->topLevelItemCount () - 1 );
100105 item->setText ( 0 , QLocale::system ().toString ( d, ' f' , 2 ) );
101- editTotal->setText ( formatDistance ( mTotal + d ) );
102106 }
103107}
104108
@@ -121,6 +125,10 @@ void QgsMeasureDialog::addPoint( QgsPoint &point )
121125 mTotal += d;
122126 editTotal->setText ( formatDistance ( mTotal ) );
123127
128+ QGis::UnitType myDisplayUnits;
129+ // Ignore units
130+ convertMeasurement ( d, myDisplayUnits, false );
131+
124132 QTreeWidgetItem *item = mTable ->topLevelItem ( mTable ->topLevelItemCount () - 1 );
125133 item->setText ( 0 , QLocale::system ().toString ( d, ' f' , 2 ) );
126134
@@ -173,24 +181,26 @@ void QgsMeasureDialog::on_btnHelp_clicked()
173181
174182QString QgsMeasureDialog::formatDistance ( double distance )
175183{
176- QString txt;
177- QString unitLabel;
178-
179- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
180- return QgsDistanceArea::textUnit ( distance, 2 , myMapUnits, false );
184+ QGis::UnitType myDisplayUnits;
185+ convertMeasurement ( distance, myDisplayUnits, false );
186+ return QgsDistanceArea::textUnit ( distance, 2 , myDisplayUnits, false );
181187}
182188
183189QString QgsMeasureDialog::formatArea ( double area )
184190{
185- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
186- return QgsDistanceArea::textUnit ( area, 2 , myMapUnits, true );
191+ QGis::UnitType myDisplayUnits;
192+ convertMeasurement ( area, myDisplayUnits, true );
193+ return QgsDistanceArea::textUnit ( area, 2 , myDisplayUnits, true );
187194}
188195
189196void QgsMeasureDialog::updateUi ()
190197{
198+ double dummy = 1.0 ;
199+ QGis::UnitType myDisplayUnits;
200+ // The dummy distance is ignored
201+ convertMeasurement ( dummy, myDisplayUnits, false );
191202
192- QGis::UnitType myMapUnits = mTool ->canvas ()->mapUnits ();
193- switch ( myMapUnits )
203+ switch ( myDisplayUnits )
194204 {
195205 case QGis::Meters:
196206 mTable ->setHeaderLabels ( QStringList ( tr ( " Segments (in meters)" ) ) );
@@ -218,3 +228,48 @@ void QgsMeasureDialog::updateUi()
218228
219229}
220230
231+ void QgsMeasureDialog::convertMeasurement (double &measure, QGis::UnitType &u, bool isArea)
232+ {
233+ // Helper for converting between meters and feet
234+ // The parameter &u is out only...
235+
236+ QGis::UnitType myUnits = mTool ->canvas ()->mapUnits ();
237+ if ( myUnits == QGis::Degrees &&
238+ mTool ->canvas ()->mapRenderer ()->distanceArea ()->ellipsoid () != " NONE" &&
239+ mTool ->canvas ()->mapRenderer ()->distanceArea ()->hasCrsTransformEnabled () )
240+ {
241+ // Measuring on an ellipsoid returns meters
242+ myUnits = QGis::Meters;
243+ QgsDebugMsg ( " We're measuring on an ellipsoid, returning meters" );
244+ }
245+
246+ // Get the units for display
247+ QSettings settings;
248+ QString myDisplayUnitsTxt = settings.value ( " /qgis/measure/displayunits" , " meters" ).toString ();
249+
250+ // Only convert between meters and feet
251+ if ( myUnits == QGis::Meters && myDisplayUnitsTxt == " feet" )
252+ {
253+ QgsDebugMsg ( QString ( " Converting %1 meters" ).arg ( QString::number ( measure ) ) );
254+ measure /= 0.3048 ;
255+ if ( isArea )
256+ {
257+ measure /= 0.3048 ;
258+ }
259+ QgsDebugMsg ( QString ( " to %1 feet" ).arg ( QString::number ( measure ) ) );
260+ myUnits = QGis::Feet;
261+ }
262+ if ( myUnits == QGis::Feet && myDisplayUnitsTxt == " meters" )
263+ {
264+ QgsDebugMsg ( QString ( " Converting %1 feet" ).arg ( QString::number ( measure ) ) );
265+ measure *= 0.3048 ;
266+ if ( isArea )
267+ {
268+ measure *= 0.3048 ;
269+ }
270+ QgsDebugMsg ( QString ( " to %1 meters" ).arg ( QString::number ( measure ) ) );
271+ myUnits = QGis::Meters;
272+ }
273+
274+ u = myUnits;
275+ }
0 commit comments