Skip to content

Commit fb18038

Browse files
committed
Merge pull request #1056 from ahuarte47/Issue_9060_B
[Feature]: Centralize conversion units in one unique function
2 parents 8c9f41c + 47d253e commit fb18038

10 files changed

Lines changed: 85 additions & 134 deletions

File tree

src/app/qgsdecorationscalebar.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,19 +139,10 @@ void QgsDecorationScaleBar::render( QPainter * theQPainter )
139139
QGis::UnitType myPreferredUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );
140140
QGis::UnitType myMapUnits = canvas->mapUnits();
141141

142-
// Adjust units meter/feet or vice versa
143-
if ( myMapUnits == QGis::Meters && myPreferredUnits == QGis::Feet )
144-
{
145-
// From meter to feet
146-
myMapUnits = QGis::Feet;
147-
myMapUnitsPerPixelDouble /= 0.3084;
148-
}
149-
else if ( myMapUnits == QGis::Feet && myPreferredUnits == QGis::Meters )
150-
{
151-
// From feet to meter
152-
myMapUnits = QGis::Meters;
153-
myMapUnitsPerPixelDouble *= 0.3084;
154-
}
142+
// Adjust units meter/feet/... or vice versa
143+
myMapUnitsPerPixelDouble *= QGis::fromUnitToUnitFactor( myMapUnits, myPreferredUnits );
144+
myMapUnits = myPreferredUnits;
145+
155146
//Calculate size of scale bar for preferred number of map units
156147
double myScaleBarWidth = mPreferredSize / myMapUnitsPerPixelDouble;
157148

src/app/qgsoptions.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,10 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
458458
{
459459
radNautical->setChecked( true );
460460
}
461+
else if ( myDisplayUnits == QGis::Degrees )
462+
{
463+
radDegrees->setChecked( true );
464+
}
461465
else
462466
{
463467
radMeters->setChecked( true );
@@ -1195,6 +1199,10 @@ void QgsOptions::saveOptions()
11951199
{
11961200
settings.setValue( "/qgis/measure/displayunits", QGis::toLiteral( QGis::NauticalMiles ) );
11971201
}
1202+
else if ( radDegrees->isChecked() )
1203+
{
1204+
settings.setValue( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Degrees ) );
1205+
}
11981206
else
11991207
{
12001208
settings.setValue( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) );

src/core/composer/qgscomposerscalebar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,11 @@ double QgsComposerScaleBar::mapWidth() const
196196
double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) );
197197
if ( mUnits == QgsComposerScaleBar::Feet )
198198
{
199-
measure /= 0.3048;
199+
measure /= QGis::fromUnitToUnitFactor( QGis::Feet, QGis::Meters );
200200
}
201201
else if ( mUnits == QgsComposerScaleBar::NauticalMiles )
202202
{
203-
measure /= 1852.0;
203+
measure /= QGis::fromUnitToUnitFactor( QGis::NauticalMiles, QGis::Meters );
204204
}
205205
return measure;
206206
}

src/core/dxf/qgsdxfexport.cpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -972,15 +972,7 @@ double QgsDxfExport::scaleToMapUnits( double value, QgsSymbolV2::OutputUnit symb
972972
}
973973

974974
//symbology in mm
975-
value *= mSymbologyScaleDenominator / 1000;
976-
if ( mapUnits == QGis::Feet )
977-
{
978-
value *= 0.3048;
979-
}
980-
else if ( mapUnits == QGis::Degrees )
981-
{
982-
value /= 111120;
983-
}
975+
value *= ( mSymbologyScaleDenominator * QGis::fromUnitToUnitFactor( mapUnits, QGis::Meters ) ) / 1000;
984976
return value;
985977
}
986978

@@ -1255,15 +1247,7 @@ double QgsDxfExport::dashSeparatorSize() const
12551247

12561248
double QgsDxfExport::sizeToMapUnits( double s ) const
12571249
{
1258-
double size = s;
1259-
if ( mMapUnits == QGis::Feet )
1260-
{
1261-
size /= 0.3048;
1262-
}
1263-
else if ( mMapUnits == QGis::Degrees )
1264-
{
1265-
size /= 111120;
1266-
}
1250+
double size = s * QGis::fromUnitToUnitFactor( QGis::Meters, mMapUnits );
12671251
return size;
12681252
}
12691253

src/core/qgis.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,56 @@ QString QGis::tr( QGis::UnitType unit )
112112
return QCoreApplication::translate( "QGis::UnitType", qPrintable( toLiteral( unit ) ) );
113113
}
114114

115+
double QGis::fromUnitToUnitFactor( QGis::UnitType fromUnit, QGis::UnitType toUnit )
116+
{
117+
#define DEGREE_TO_METER 111319.49079327358
118+
#define FEET_TO_METER 0.3048
119+
#define NMILE_TO_METER 1852.0
120+
121+
// Unify degree units
122+
if ( fromUnit == QGis::DecimalDegrees || fromUnit == QGis::DegreesMinutesSeconds || fromUnit == QGis::DegreesDecimalMinutes )
123+
fromUnit = QGis::Degrees;
124+
if ( toUnit == QGis::DecimalDegrees || toUnit == QGis::DegreesMinutesSeconds || toUnit == QGis::DegreesDecimalMinutes )
125+
toUnit = QGis::Degrees;
126+
127+
// Calculate the conversion factor between the specified units
128+
if ( fromUnit != toUnit && fromUnit != QGis::UnknownUnit && toUnit != QGis::UnknownUnit )
129+
{
130+
switch ( fromUnit )
131+
{
132+
case QGis::Meters:
133+
{
134+
if ( toUnit == QGis::Feet ) return 1.0 / FEET_TO_METER;
135+
if ( toUnit == QGis::Degrees ) return 1.0 / DEGREE_TO_METER;
136+
if ( toUnit == QGis::NauticalMiles ) return 1.0 / NMILE_TO_METER;
137+
break;
138+
}
139+
case QGis::Feet:
140+
{
141+
if ( toUnit == QGis::Meters ) return FEET_TO_METER;
142+
if ( toUnit == QGis::Degrees ) return FEET_TO_METER / DEGREE_TO_METER;
143+
if ( toUnit == QGis::NauticalMiles ) return FEET_TO_METER / NMILE_TO_METER;
144+
break;
145+
}
146+
case QGis::Degrees:
147+
{
148+
if ( toUnit == QGis::Meters ) return DEGREE_TO_METER;
149+
if ( toUnit == QGis::Feet ) return DEGREE_TO_METER / FEET_TO_METER;
150+
if ( toUnit == QGis::NauticalMiles ) return DEGREE_TO_METER / NMILE_TO_METER;
151+
break;
152+
}
153+
case QGis::NauticalMiles:
154+
{
155+
if ( toUnit == QGis::Meters ) return NMILE_TO_METER;
156+
if ( toUnit == QGis::Feet ) return NMILE_TO_METER / FEET_TO_METER;
157+
if ( toUnit == QGis::Degrees ) return NMILE_TO_METER / DEGREE_TO_METER;
158+
break;
159+
}
160+
}
161+
}
162+
return 1.0;
163+
}
164+
115165
void *qgsMalloc( size_t size )
116166
{
117167
if ( size == 0 || long( size ) < 0 )

src/core/qgis.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ class CORE_EXPORT QGis
248248
//! Provides translated version of the type value
249249
// Added in version 2.0
250250
static QString tr( QGis::UnitType unit );
251+
//! Returns the conversion factor between the specified units
252+
static double fromUnitToUnitFactor( QGis::UnitType fromUnit, QGis::UnitType toUnit );
251253

252254
//! User defined event types
253255
enum UserEvent

src/core/qgsdistancearea.cpp

Lines changed: 8 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ QString QgsDistanceArea::textUnit( double value, int decimals, QGis::UnitType u,
989989

990990
void QgsDistanceArea::convertMeasurement( double &measure, QGis::UnitType &measureUnits, QGis::UnitType displayUnits, bool isArea )
991991
{
992-
// Helper for converting between meters and feet
992+
// Helper for converting between meters and feet and degrees and NauticalMiles...
993993
// The parameters measure and measureUnits are in/out
994994

995995
if (( measureUnits == QGis::Degrees || measureUnits == QGis::Feet || measureUnits == QGis::NauticalMiles ) &&
@@ -1001,73 +1001,12 @@ void QgsDistanceArea::convertMeasurement( double &measure, QGis::UnitType &measu
10011001
QgsDebugMsg( "We're measuring on an ellipsoid or using projections, the system is returning meters" );
10021002
}
10031003

1004-
// Only convert between meters and feet
1005-
if ( measureUnits == QGis::Meters && displayUnits == QGis::Feet )
1006-
{
1007-
QgsDebugMsg( QString( "Converting %1 meters" ).arg( QString::number( measure ) ) );
1008-
measure /= 0.3048;
1009-
if ( isArea )
1010-
{
1011-
measure /= 0.3048;
1012-
}
1013-
QgsDebugMsg( QString( "to %1 feet" ).arg( QString::number( measure ) ) );
1014-
measureUnits = QGis::Feet;
1015-
}
1016-
if ( measureUnits == QGis::Feet && displayUnits == QGis::Meters )
1017-
{
1018-
QgsDebugMsg( QString( "Converting %1 feet" ).arg( QString::number( measure ) ) );
1019-
measure *= 0.3048;
1020-
if ( isArea )
1021-
{
1022-
measure *= 0.3048;
1023-
}
1024-
QgsDebugMsg( QString( "to %1 meters" ).arg( QString::number( measure ) ) );
1025-
measureUnits = QGis::Meters;
1026-
}
1004+
// Gets the conversion factor between the specified units
1005+
double factorUnits = QGis::fromUnitToUnitFactor( measureUnits, displayUnits );
1006+
if ( isArea ) factorUnits *= factorUnits;
10271007

1028-
if ( measureUnits == QGis::Meters && displayUnits == QGis::NauticalMiles )
1029-
{
1030-
QgsDebugMsg( QString( "Converting %1 meters" ).arg( QString::number( measure ) ) );
1031-
measure /= 1852.0;
1032-
if ( isArea )
1033-
{
1034-
measure /= 1852.0;
1035-
}
1036-
QgsDebugMsg( QString( "to %1 nautical miles" ).arg( QString::number( measure ) ) );
1037-
measureUnits = QGis::NauticalMiles;
1038-
}
1039-
if ( measureUnits == QGis::NauticalMiles && displayUnits == QGis::Meters )
1040-
{
1041-
QgsDebugMsg( QString( "Converting %1 nautical miles" ).arg( QString::number( measure ) ) );
1042-
measure *= 1852.0;
1043-
if ( isArea )
1044-
{
1045-
measure *= 1852.0;
1046-
}
1047-
QgsDebugMsg( QString( "to %1 meters" ).arg( QString::number( measure ) ) );
1048-
measureUnits = QGis::Meters;
1049-
}
1050-
1051-
if ( measureUnits == QGis::Feet && displayUnits == QGis::NauticalMiles )
1052-
{
1053-
QgsDebugMsg( QString( "Converting %1 meters" ).arg( QString::number( measure ) ) );
1054-
measure /= 6076.12;
1055-
if ( isArea )
1056-
{
1057-
measure /= 6076.12;
1058-
}
1059-
QgsDebugMsg( QString( "to %1 nautical miles" ).arg( QString::number( measure ) ) );
1060-
measureUnits = QGis::Feet;
1061-
}
1062-
if ( measureUnits == QGis::NauticalMiles && displayUnits == QGis::Feet )
1063-
{
1064-
QgsDebugMsg( QString( "Converting %1 nautical miles" ).arg( QString::number( measure ) ) );
1065-
measure *= 6076.12;
1066-
if ( isArea )
1067-
{
1068-
measure *= 6076.12;
1069-
}
1070-
QgsDebugMsg( QString( "to %1 meters" ).arg( QString::number( measure ) ) );
1071-
measureUnits = QGis::Feet;
1072-
}
1008+
QgsDebugMsg( QString( "Converting %1 %2" ).arg( QString::number( measure ), QGis::toLiteral( measureUnits ) ) );
1009+
measure *= factorUnits;
1010+
QgsDebugMsg( QString( "to %1 %2" ).arg( QString::number( measure ), QGis::toLiteral( displayUnits ) ) );
1011+
measureUnits = displayUnits;
10731012
}

src/providers/grass/qgsgrassgislib.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,17 +1064,7 @@ int GRASS_LIB_EXPORT G_get_cellhd( const char *name, const char *mapset, struct
10641064

10651065
double QgsGrassGisLib::G_database_units_to_meters_factor( void )
10661066
{
1067-
switch ( mCrs.mapUnits() )
1068-
{
1069-
case QGis::Meters:
1070-
return 1.;
1071-
case QGis::Feet:
1072-
return .3048;
1073-
case QGis::Degrees:
1074-
return 1.;
1075-
default:
1076-
return 0.;
1077-
}
1067+
return QGis::fromUnitToUnitFactor( mCrs.mapUnits(), QGis::Meters );
10781068
}
10791069

10801070
double QgsGrassGisLib::G_area_of_cell_at_row( int row )

src/providers/wms/qgswmsprovider.cpp

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2776,27 +2776,7 @@ void QgsWmsProvider::parseWMTSContents( QDomElement const &e )
27762776

27772777
s.wkScaleSet = n0.firstChildElement( "WellKnownScaleSet" ).text();
27782778

2779-
double metersPerUnit;
2780-
switch ( crs.mapUnits() )
2781-
{
2782-
case QGis::Meters:
2783-
metersPerUnit = 1.0;
2784-
break;
2785-
2786-
case QGis::Feet:
2787-
metersPerUnit = 0.3048;
2788-
break;
2789-
2790-
case QGis::Degrees:
2791-
metersPerUnit = 111319.49079327358;
2792-
break;
2793-
2794-
default:
2795-
case QGis::UnknownUnit:
2796-
QgsDebugMsg( "Unknown CRS units - assuming meters" );
2797-
metersPerUnit = 1.0;
2798-
break;
2799-
}
2779+
double metersPerUnit = QGis::fromUnitToUnitFactor( crs.mapUnits(), QGis::Meters );
28002780

28012781
s.crs = crs.authid();
28022782

src/ui/qgsoptionsbase.ui

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2594,6 +2594,13 @@
25942594
</property>
25952595
</widget>
25962596
</item>
2597+
<item row="5" column="4">
2598+
<widget class="QRadioButton" name="radDegrees">
2599+
<property name="text">
2600+
<string>Degrees</string>
2601+
</property>
2602+
</widget>
2603+
</item>
25972604
<item row="6" column="0">
25982605
<widget class="QLabel" name="mAngleUnitsLabel">
25992606
<property name="text">

0 commit comments

Comments
 (0)