diff --git a/python/core/qgsunittypes.sip b/python/core/qgsunittypes.sip index 2e050937970..b5f778e8a36 100644 --- a/python/core/qgsunittypes.sip +++ b/python/core/qgsunittypes.sip @@ -31,6 +31,7 @@ class QgsUnitTypes SquareMiles, /*!< square miles */ Hectares, /*!< hectares */ Acres, /*!< acres */ + SquareNauticalMiles, /*!< square nautical miles */ SquareDegrees, /*!< square degrees, for planar geographic CRS area measurements */ UnknownAreaUnit, /*!< unknown areal unit */ }; @@ -113,5 +114,11 @@ class QgsUnitTypes */ static double fromUnitToUnitFactor( AreaUnit fromUnit, AreaUnit toUnit ); + /** Converts a distance unit to its corresponding area unit, eg meters to square meters + * @param distanceUnit distance unit to convert + * @return matching areal unit + */ + static AreaUnit distanceToAreaUnit( QGis::UnitType distanceUnit ); + }; diff --git a/src/core/qgsunittypes.cpp b/src/core/qgsunittypes.cpp index 450351fefe6..671b5d2fa4e 100644 --- a/src/core/qgsunittypes.cpp +++ b/src/core/qgsunittypes.cpp @@ -52,6 +52,7 @@ QgsUnitTypes::DistanceUnitType QgsUnitTypes::unitType( QgsUnitTypes::AreaUnit un case SquareMiles: case Hectares: case Acres: + case SquareNauticalMiles: return Standard; case SquareDegrees: @@ -193,30 +194,74 @@ double QgsUnitTypes::fromUnitToUnitFactor( QGis::UnitType fromUnit, QGis::UnitTy { case QGis::Meters: { - if ( toUnit == QGis::Feet ) return 1.0 / FEET_TO_METER; - if ( toUnit == QGis::Degrees ) return 1.0 / DEGREE_TO_METER; - if ( toUnit == QGis::NauticalMiles ) return 1.0 / NMILE_TO_METER; + switch ( toUnit ) + { + case QGis::Meters: + return 1.0; + case QGis::Feet: + return 1.0 / FEET_TO_METER; + case QGis::Degrees: + return 1.0 / DEGREE_TO_METER; + case QGis::NauticalMiles: + return 1.0 / NMILE_TO_METER; + case QGis::UnknownUnit: + break; + } + break; } case QGis::Feet: { - if ( toUnit == QGis::Meters ) return FEET_TO_METER; - if ( toUnit == QGis::Degrees ) return FEET_TO_METER / DEGREE_TO_METER; - if ( toUnit == QGis::NauticalMiles ) return FEET_TO_METER / NMILE_TO_METER; + switch ( toUnit ) + { + case QGis::Meters: + return FEET_TO_METER; + case QGis::Feet: + return 1.0; + case QGis::Degrees: + return FEET_TO_METER / DEGREE_TO_METER; + case QGis::NauticalMiles: + return FEET_TO_METER / NMILE_TO_METER; + case QGis::UnknownUnit: + break; + } + break; } case QGis::Degrees: { - if ( toUnit == QGis::Meters ) return DEGREE_TO_METER; - if ( toUnit == QGis::Feet ) return DEGREE_TO_METER / FEET_TO_METER; - if ( toUnit == QGis::NauticalMiles ) return DEGREE_TO_METER / NMILE_TO_METER; + switch ( toUnit ) + { + case QGis::Meters: + return DEGREE_TO_METER; + case QGis::Feet: + return DEGREE_TO_METER / FEET_TO_METER; + case QGis::Degrees: + return 1.0; + case QGis::NauticalMiles: + return DEGREE_TO_METER / NMILE_TO_METER; + case QGis::UnknownUnit: + break; + } + break; } case QGis::NauticalMiles: { - if ( toUnit == QGis::Meters ) return NMILE_TO_METER; - if ( toUnit == QGis::Feet ) return NMILE_TO_METER / FEET_TO_METER; - if ( toUnit == QGis::Degrees ) return NMILE_TO_METER / DEGREE_TO_METER; + switch ( toUnit ) + { + case QGis::Meters: + return NMILE_TO_METER; + case QGis::Feet: + return NMILE_TO_METER / FEET_TO_METER; + case QGis::Degrees: + return NMILE_TO_METER / DEGREE_TO_METER; + case QGis::NauticalMiles: + return 1.0; + case QGis::UnknownUnit: + break; + } + break; } case QGis::UnknownUnit: @@ -244,6 +289,8 @@ QString QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaUnit unit ) return "ha"; case Acres: return "ac"; + case SquareNauticalMiles: + return "nm2"; case SquareDegrees: return "deg2"; case UnknownAreaUnit: @@ -273,8 +320,8 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::decodeAreaUnit( const QString& string, bool return Hectares; if ( normalized == encodeUnit( Acres ) ) return Acres; - if ( normalized == encodeUnit( SquareMiles ) ) - return SquareMiles; + if ( normalized == encodeUnit( SquareNauticalMiles ) ) + return SquareNauticalMiles; if ( normalized == encodeUnit( SquareDegrees ) ) return SquareDegrees; if ( normalized == encodeUnit( UnknownAreaUnit ) ) @@ -304,6 +351,8 @@ QString QgsUnitTypes::toString( QgsUnitTypes::AreaUnit unit ) return QCoreApplication::translate( "QgsUnitTypes::AreaUnit", "hectares" ); case Acres: return QCoreApplication::translate( "QgsUnitTypes::AreaUnit", "acres" ); + case SquareNauticalMiles: + return QCoreApplication::translate( "QgsUnitTypes::AreaUnit", "square nautical miles" ); case SquareDegrees: return QCoreApplication::translate( "QgsUnitTypes::AreaUnit", "square degrees" ); case UnknownAreaUnit: @@ -333,6 +382,8 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::stringToAreaUnit( const QString& string, bo return Hectares; if ( normalized == toString( Acres ) ) return Acres; + if ( normalized == toString( SquareNauticalMiles ) ) + return SquareNauticalMiles; if ( normalized == toString( SquareDegrees ) ) return SquareDegrees; if ( normalized == toString( UnknownAreaUnit ) ) @@ -352,6 +403,7 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU #define HA_TO_M2 10000.0 #define AC_TO_FT2 43560.0 #define DEG2_TO_M2 12392029030.5 +#define NM2_TO_M2 3429904.0 // Calculate the conversion factor between the specified units if ( fromUnit != toUnit ) @@ -360,98 +412,259 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU { case SquareMeters: { - if ( toUnit == SquareKilometers ) return 1.0 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return 1.0 / FT2_TO_M2; - if ( toUnit == SquareYards ) return 1.0 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return 1.0 / MI2_TO_M2; - if ( toUnit == Hectares ) return 1.0 / HA_TO_M2; - if ( toUnit == Acres ) return 1.0 / AC_TO_FT2 / FT2_TO_M2; - if ( toUnit == SquareDegrees ) return 1.0 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return 1.0; + case SquareKilometers: + return 1.0 / KM2_TO_M2; + case SquareFeet: + return 1.0 / FT2_TO_M2; + case SquareYards: + return 1.0 / YD2_TO_M2; + case SquareMiles: + return 1.0 / MI2_TO_M2; + case Hectares: + return 1.0 / HA_TO_M2; + case Acres: + return 1.0 / AC_TO_FT2 / FT2_TO_M2; + case SquareNauticalMiles: + return 1.0 / NM2_TO_M2; + case SquareDegrees: + return 1.0 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } break; } case SquareKilometers: { - if ( toUnit == SquareMeters ) return KM2_TO_M2; - if ( toUnit == SquareFeet ) return KM2_TO_M2 / FT2_TO_M2 ; - if ( toUnit == SquareYards ) return KM2_TO_M2 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return KM2_TO_M2 / MI2_TO_M2; - if ( toUnit == Hectares ) return KM2_TO_M2 / HA_TO_M2; - if ( toUnit == Acres ) return KM2_TO_M2 / AC_TO_FT2 / FT2_TO_M2 ; - if ( toUnit == SquareDegrees ) return KM2_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return KM2_TO_M2; + case SquareKilometers: + return 1.0; + case SquareFeet: + return KM2_TO_M2 / FT2_TO_M2 ; + case SquareYards: + return KM2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return KM2_TO_M2 / MI2_TO_M2; + case Hectares: + return KM2_TO_M2 / HA_TO_M2; + case Acres: + return KM2_TO_M2 / AC_TO_FT2 / FT2_TO_M2; + case SquareNauticalMiles: + return KM2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return KM2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } break; } case SquareFeet: { - if ( toUnit == SquareMeters ) return FT2_TO_M2; - if ( toUnit == SquareKilometers ) return FT2_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareYards ) return FT2_TO_M2 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return FT2_TO_M2 / MI2_TO_M2; - if ( toUnit == Hectares ) return FT2_TO_M2 / HA_TO_M2; - if ( toUnit == Acres ) return 1.0 / AC_TO_FT2; - if ( toUnit == SquareDegrees ) return FT2_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return FT2_TO_M2; + case SquareKilometers: + return FT2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return 1.0; + case SquareYards: + return FT2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return FT2_TO_M2 / MI2_TO_M2; + case Hectares: + return FT2_TO_M2 / HA_TO_M2; + case Acres: + return 1.0 / AC_TO_FT2; + case SquareNauticalMiles: + return FT2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return FT2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } break; } case SquareYards: { - if ( toUnit == SquareMeters ) return YD2_TO_M2; - if ( toUnit == SquareKilometers ) return YD2_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return YD2_TO_M2 / FT2_TO_M2; - if ( toUnit == SquareMiles ) return YD2_TO_M2 / MI2_TO_M2; - if ( toUnit == Hectares ) return YD2_TO_M2 / HA_TO_M2; - if ( toUnit == Acres ) return YD2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; - if ( toUnit == SquareDegrees ) return YD2_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return YD2_TO_M2; + case SquareKilometers: + return YD2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return YD2_TO_M2 / FT2_TO_M2; + case SquareYards: + return 1.0; + case SquareMiles: + return YD2_TO_M2 / MI2_TO_M2; + case Hectares: + return YD2_TO_M2 / HA_TO_M2; + case Acres: + return YD2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + case SquareNauticalMiles: + return YD2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return YD2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } break; } case SquareMiles: { - if ( toUnit == SquareMeters ) return MI2_TO_M2; - if ( toUnit == SquareKilometers ) return MI2_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return MI2_TO_M2 / FT2_TO_M2; - if ( toUnit == SquareYards ) return MI2_TO_M2 / YD2_TO_M2; - if ( toUnit == Hectares ) return MI2_TO_M2 / HA_TO_M2; - if ( toUnit == Acres ) return MI2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; - if ( toUnit == SquareDegrees ) return MI2_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return MI2_TO_M2; + case SquareKilometers: + return MI2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return MI2_TO_M2 / FT2_TO_M2; + case SquareYards: + return MI2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return 1.0; + case Hectares: + return MI2_TO_M2 / HA_TO_M2; + case Acres: + return MI2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + case SquareNauticalMiles: + return MI2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return MI2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } + break; } case Hectares: { - if ( toUnit == SquareMeters ) return HA_TO_M2; - if ( toUnit == SquareKilometers ) return HA_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return HA_TO_M2 / FT2_TO_M2; - if ( toUnit == SquareYards ) return HA_TO_M2 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return HA_TO_M2 / MI2_TO_M2; - if ( toUnit == Acres ) return HA_TO_M2 / FT2_TO_M2 / AC_TO_FT2; - if ( toUnit == SquareDegrees ) return HA_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return HA_TO_M2; + case SquareKilometers: + return HA_TO_M2 / KM2_TO_M2; + case SquareFeet: + return HA_TO_M2 / FT2_TO_M2; + case SquareYards: + return HA_TO_M2 / YD2_TO_M2; + case SquareMiles: + return HA_TO_M2 / MI2_TO_M2; + case Hectares: + return 1.0; + case Acres: + return HA_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + case SquareNauticalMiles: + return HA_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return HA_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } + break; } case Acres: { - if ( toUnit == SquareMeters ) return AC_TO_FT2 * FT2_TO_M2; - if ( toUnit == SquareKilometers ) return AC_TO_FT2 * FT2_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return AC_TO_FT2; - if ( toUnit == SquareYards ) return AC_TO_FT2 * FT2_TO_M2 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return AC_TO_FT2 * FT2_TO_M2 / MI2_TO_M2; - if ( toUnit == Hectares ) return AC_TO_FT2 * FT2_TO_M2 / HA_TO_M2; - if ( toUnit == SquareDegrees ) return AC_TO_FT2 * FT2_TO_M2 / DEG2_TO_M2; + switch ( toUnit ) + { + case SquareMeters: + return AC_TO_FT2 * FT2_TO_M2; + case SquareKilometers: + return AC_TO_FT2 * FT2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return AC_TO_FT2; + case SquareYards: + return AC_TO_FT2 * FT2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return AC_TO_FT2 * FT2_TO_M2 / MI2_TO_M2; + case Hectares: + return AC_TO_FT2 * FT2_TO_M2 / HA_TO_M2; + case Acres: + return 1.0; + case SquareNauticalMiles: + return AC_TO_FT2 * FT2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return AC_TO_FT2 * FT2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } + + break; + } + + case SquareNauticalMiles: + { + switch ( toUnit ) + { + case SquareMeters: + return NM2_TO_M2; + case SquareKilometers: + return NM2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return NM2_TO_M2 / FT2_TO_M2; + case SquareYards: + return NM2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return NM2_TO_M2 / MI2_TO_M2; + case Hectares: + return NM2_TO_M2 / HA_TO_M2; + case Acres: + return NM2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + case SquareNauticalMiles: + return 1.0; + case SquareDegrees: + return NM2_TO_M2 / DEG2_TO_M2; + case UnknownAreaUnit: + break; + } + break; } case SquareDegrees: { - if ( toUnit == SquareMeters ) return DEG2_TO_M2; - if ( toUnit == SquareKilometers ) return DEG2_TO_M2 / KM2_TO_M2; - if ( toUnit == SquareFeet ) return DEG2_TO_M2 / FT2_TO_M2; - if ( toUnit == SquareYards ) return DEG2_TO_M2 / YD2_TO_M2; - if ( toUnit == SquareMiles ) return DEG2_TO_M2 / MI2_TO_M2; - if ( toUnit == Hectares ) return DEG2_TO_M2 / HA_TO_M2; - if ( toUnit == Acres ) return DEG2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + switch ( toUnit ) + { + case SquareMeters: + return DEG2_TO_M2; + case SquareKilometers: + return DEG2_TO_M2 / KM2_TO_M2; + case SquareFeet: + return DEG2_TO_M2 / FT2_TO_M2; + case SquareYards: + return DEG2_TO_M2 / YD2_TO_M2; + case SquareMiles: + return DEG2_TO_M2 / MI2_TO_M2; + case Hectares: + return DEG2_TO_M2 / HA_TO_M2; + case Acres: + return DEG2_TO_M2 / FT2_TO_M2 / AC_TO_FT2; + case SquareNauticalMiles: + return DEG2_TO_M2 / NM2_TO_M2; + case SquareDegrees: + return 1.0; + case UnknownAreaUnit: + break; + } + break; } @@ -462,6 +675,29 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU return 1.0; } +QgsUnitTypes::AreaUnit QgsUnitTypes::distanceToAreaUnit( QGis::UnitType distanceUnit ) +{ + switch ( distanceUnit ) + { + case QGis::Meters: + return SquareMeters; + + case QGis::Feet: + return SquareFeet; + + case QGis::Degrees: + return SquareDegrees; + + case QGis::UnknownUnit: + return UnknownAreaUnit; + + case QGis::NauticalMiles: + return SquareNauticalMiles; + } + + return UnknownAreaUnit; +} + // enable for QGIS 3.0 #if 0 diff --git a/src/core/qgsunittypes.h b/src/core/qgsunittypes.h index 3f2e717e065..4e20cf239bf 100644 --- a/src/core/qgsunittypes.h +++ b/src/core/qgsunittypes.h @@ -55,6 +55,7 @@ class CORE_EXPORT QgsUnitTypes SquareMiles, /*!< square miles */ Hectares, /*!< hectares */ Acres, /*!< acres */ + SquareNauticalMiles, /*!< square nautical miles */ SquareDegrees, /*!< square degrees, for planar geographic CRS area measurements */ UnknownAreaUnit, /*!< unknown areal unit */ }; @@ -141,6 +142,12 @@ class CORE_EXPORT QgsUnitTypes */ static double fromUnitToUnitFactor( AreaUnit fromUnit, AreaUnit toUnit ); + /** Converts a distance unit to its corresponding area unit, eg meters to square meters + * @param distanceUnit distance unit to convert + * @return matching areal unit + */ + static AreaUnit distanceToAreaUnit( QGis::UnitType distanceUnit ); + //TODO QGIS 3.0 - enable and move symbol units here! Otherwise creates circular dependancies... #if 0 // SYMBOL UNITS diff --git a/tests/src/python/test_qgsunittypes.py b/tests/src/python/test_qgsunittypes.py index 85653ddf09a..d1a18ac562c 100644 --- a/tests/src/python/test_qgsunittypes.py +++ b/tests/src/python/test_qgsunittypes.py @@ -92,6 +92,7 @@ class TestQgsUnitTypes(unittest.TestCase): QgsUnitTypes.SquareMiles: QgsUnitTypes.Standard, QgsUnitTypes.Hectares: QgsUnitTypes.Standard, QgsUnitTypes.Acres: QgsUnitTypes.Standard, + QgsUnitTypes.SquareNauticalMiles: QgsUnitTypes.Standard, QgsUnitTypes.SquareDegrees: QgsUnitTypes.Geographic, QgsUnitTypes.UnknownAreaUnit: QgsUnitTypes.UnknownType, } @@ -108,6 +109,7 @@ class TestQgsUnitTypes(unittest.TestCase): QgsUnitTypes.SquareMiles, QgsUnitTypes.Hectares, QgsUnitTypes.Acres, + QgsUnitTypes.SquareNauticalMiles, QgsUnitTypes.SquareDegrees, QgsUnitTypes.UnknownAreaUnit] @@ -135,6 +137,7 @@ class TestQgsUnitTypes(unittest.TestCase): QgsUnitTypes.SquareMiles, QgsUnitTypes.Hectares, QgsUnitTypes.Acres, + QgsUnitTypes.SquareNauticalMiles, QgsUnitTypes.SquareDegrees, QgsUnitTypes.UnknownAreaUnit] @@ -206,14 +209,15 @@ class TestQgsUnitTypes(unittest.TestCase): def testAreaFromUnitToUnitFactor(self): """Test calculation of conversion factor between areal units""" - expected = {QgsUnitTypes.SquareMeters: {QgsUnitTypes.SquareMeters: 1.0, QgsUnitTypes.SquareKilometers: 1e-6, QgsUnitTypes.SquareFeet: 10.7639104, QgsUnitTypes.SquareYards: 1.19599, QgsUnitTypes.SquareMiles: 3.86102e-7, QgsUnitTypes.Hectares: 0.0001, QgsUnitTypes.Acres: 0.000247105, QgsUnitTypes.SquareDegrees: 0.000000000080697, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.SquareKilometers: {QgsUnitTypes.SquareMeters: 1e6, QgsUnitTypes.SquareKilometers: 1, QgsUnitTypes.SquareFeet: 10763910.4167097, QgsUnitTypes.SquareYards: 1195990.04630108, QgsUnitTypes.SquareMiles: 0.386102158, QgsUnitTypes.Hectares: 100, QgsUnitTypes.Acres: 247.105381467, QgsUnitTypes.SquareDegrees: 0.000080697034968, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.SquareFeet: {QgsUnitTypes.SquareMeters: 0.092903, QgsUnitTypes.SquareKilometers: 9.2903e-8, QgsUnitTypes.SquareFeet: 1.0, QgsUnitTypes.SquareYards: 0.11111111111, QgsUnitTypes.SquareMiles: 3.58701e-8, QgsUnitTypes.Hectares: 9.2903e-6, QgsUnitTypes.Acres: 2.29568e-5, QgsUnitTypes.SquareDegrees: 0.000000000007497, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.SquareYards: {QgsUnitTypes.SquareMeters: 0.836127360, QgsUnitTypes.SquareKilometers: 8.36127e-7, QgsUnitTypes.SquareFeet: 9.0, QgsUnitTypes.SquareYards: 1.0, QgsUnitTypes.SquareMiles: 3.22831e-7, QgsUnitTypes.Hectares: 8.3612736E-5, QgsUnitTypes.Acres: 0.00020661157, QgsUnitTypes.SquareDegrees: 0.000000000067473, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.SquareMiles: {QgsUnitTypes.SquareMeters: 2589988.110336, QgsUnitTypes.SquareKilometers: 2.589988110, QgsUnitTypes.SquareFeet: 27878400, QgsUnitTypes.SquareYards: 3097600, QgsUnitTypes.SquareMiles: 1.0, QgsUnitTypes.Hectares: 258.998811, QgsUnitTypes.Acres: 640, QgsUnitTypes.SquareDegrees: 0.000209004361107, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.Hectares: {QgsUnitTypes.SquareMeters: 10000, QgsUnitTypes.SquareKilometers: 0.01, QgsUnitTypes.SquareFeet: 107639.1041670972, QgsUnitTypes.SquareYards: 11959.9004630, QgsUnitTypes.SquareMiles: 0.00386102, QgsUnitTypes.Hectares: 1.0, QgsUnitTypes.Acres: 2.471053814, QgsUnitTypes.SquareDegrees: 0.000000806970350, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.Acres: {QgsUnitTypes.SquareMeters: 4046.8564224, QgsUnitTypes.SquareKilometers: 0.00404686, QgsUnitTypes.SquareFeet: 43560, QgsUnitTypes.SquareYards: 4840, QgsUnitTypes.SquareMiles: 0.0015625, QgsUnitTypes.Hectares: 0.404685642, QgsUnitTypes.Acres: 1.0, QgsUnitTypes.SquareDegrees: 0.000000326569314, QgsUnitTypes.UnknownAreaUnit: 1.0}, - QgsUnitTypes.SquareDegrees: {QgsUnitTypes.SquareMeters: 12392029030.5, QgsUnitTypes.SquareKilometers: 12392.029030499, QgsUnitTypes.SquareFeet: 133386690365.5682220, QgsUnitTypes.SquareYards: 14820743373.9520263, QgsUnitTypes.SquareMiles: 4784.5891573967, QgsUnitTypes.Hectares: 1239202.903050, QgsUnitTypes.Acres: 3062137.060733889, QgsUnitTypes.SquareDegrees: 1.0, QgsUnitTypes.UnknownAreaUnit: 1.0}} + expected = {QgsUnitTypes.SquareMeters: {QgsUnitTypes.SquareMeters: 1.0, QgsUnitTypes.SquareKilometers: 1e-6, QgsUnitTypes.SquareFeet: 10.7639104, QgsUnitTypes.SquareYards: 1.19599, QgsUnitTypes.SquareMiles: 3.86102e-7, QgsUnitTypes.Hectares: 0.0001, QgsUnitTypes.Acres: 0.000247105, QgsUnitTypes.SquareNauticalMiles: 2.91553e-7, QgsUnitTypes.SquareDegrees: 0.000000000080697, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareKilometers: {QgsUnitTypes.SquareMeters: 1e6, QgsUnitTypes.SquareKilometers: 1, QgsUnitTypes.SquareFeet: 10763910.4167097, QgsUnitTypes.SquareYards: 1195990.04630108, QgsUnitTypes.SquareMiles: 0.386102158, QgsUnitTypes.Hectares: 100, QgsUnitTypes.Acres: 247.105381467, QgsUnitTypes.SquareNauticalMiles: 0.291553349598, QgsUnitTypes.SquareDegrees: 0.000080697034968, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareFeet: {QgsUnitTypes.SquareMeters: 0.092903, QgsUnitTypes.SquareKilometers: 9.2903e-8, QgsUnitTypes.SquareFeet: 1.0, QgsUnitTypes.SquareYards: 0.11111111111, QgsUnitTypes.SquareMiles: 3.58701e-8, QgsUnitTypes.Hectares: 9.2903e-6, QgsUnitTypes.Acres: 2.29568e-5, QgsUnitTypes.SquareNauticalMiles: 2.70862e-8, QgsUnitTypes.SquareDegrees: 0.000000000007497, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareYards: {QgsUnitTypes.SquareMeters: 0.836127360, QgsUnitTypes.SquareKilometers: 8.36127e-7, QgsUnitTypes.SquareFeet: 9.0, QgsUnitTypes.SquareYards: 1.0, QgsUnitTypes.SquareMiles: 3.22831e-7, QgsUnitTypes.Hectares: 8.3612736E-5, QgsUnitTypes.Acres: 0.00020661157, QgsUnitTypes.SquareNauticalMiles: 2.43776e-7, QgsUnitTypes.SquareDegrees: 0.000000000067473, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareMiles: {QgsUnitTypes.SquareMeters: 2589988.110336, QgsUnitTypes.SquareKilometers: 2.589988110, QgsUnitTypes.SquareFeet: 27878400, QgsUnitTypes.SquareYards: 3097600, QgsUnitTypes.SquareMiles: 1.0, QgsUnitTypes.Hectares: 258.998811, QgsUnitTypes.Acres: 640, QgsUnitTypes.SquareNauticalMiles: 0.75511970898, QgsUnitTypes.SquareDegrees: 0.000209004361107, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.Hectares: {QgsUnitTypes.SquareMeters: 10000, QgsUnitTypes.SquareKilometers: 0.01, QgsUnitTypes.SquareFeet: 107639.1041670972, QgsUnitTypes.SquareYards: 11959.9004630, QgsUnitTypes.SquareMiles: 0.00386102, QgsUnitTypes.Hectares: 1.0, QgsUnitTypes.Acres: 2.471053814, QgsUnitTypes.SquareNauticalMiles: 0.00291553, QgsUnitTypes.SquareDegrees: 0.000000806970350, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.Acres: {QgsUnitTypes.SquareMeters: 4046.8564224, QgsUnitTypes.SquareKilometers: 0.00404686, QgsUnitTypes.SquareFeet: 43560, QgsUnitTypes.SquareYards: 4840, QgsUnitTypes.SquareMiles: 0.0015625, QgsUnitTypes.Hectares: 0.404685642, QgsUnitTypes.Acres: 1.0, QgsUnitTypes.SquareNauticalMiles: 0.00117987, QgsUnitTypes.SquareDegrees: 0.000000326569314, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareNauticalMiles: {QgsUnitTypes.SquareMeters: 3429904, QgsUnitTypes.SquareKilometers: 3.4299040, QgsUnitTypes.SquareFeet: 36919179.39391434, QgsUnitTypes.SquareYards: 4102131.04376826, QgsUnitTypes.SquareMiles: 1.324293337, QgsUnitTypes.Hectares: 342.9904000000, QgsUnitTypes.Acres: 847.54773631, QgsUnitTypes.SquareNauticalMiles: 1.0, QgsUnitTypes.SquareDegrees: 0.000276783083025, QgsUnitTypes.UnknownAreaUnit: 1.0}, + QgsUnitTypes.SquareDegrees: {QgsUnitTypes.SquareMeters: 12392029030.5, QgsUnitTypes.SquareKilometers: 12392.029030499, QgsUnitTypes.SquareFeet: 133386690365.5682220, QgsUnitTypes.SquareYards: 14820743373.9520263, QgsUnitTypes.SquareMiles: 4784.5891573967, QgsUnitTypes.Hectares: 1239202.903050, QgsUnitTypes.Acres: 3062137.060733889, QgsUnitTypes.SquareNauticalMiles: 3612.93757215, QgsUnitTypes.SquareDegrees: 1.0, QgsUnitTypes.UnknownAreaUnit: 1.0}} for from_unit in expected.keys(): for to_unit in expected[from_unit].keys(): @@ -231,6 +235,18 @@ class TestQgsUnitTypes(unittest.TestCase): msg='got {:.7f}, expected 1.0 when converting from {} to unknown units'.format(res, expected_factor, QgsUnitTypes.toString(from_unit))) + def testDistanceToAreaUnit(self): + """Test distanceToAreaUnit conversion""" + expected = {QGis.Meters: QgsUnitTypes.SquareMeters, + QGis.Feet: QgsUnitTypes.SquareFeet, + QGis.Degrees: QgsUnitTypes.SquareDegrees, + QGis.UnknownUnit: QgsUnitTypes.UnknownAreaUnit, + QGis.NauticalMiles: QgsUnitTypes.SquareNauticalMiles + } + + for t in expected.keys(): + self.assertEqual(QgsUnitTypes.distanceToAreaUnit(t), expected[t]) + if __name__ == "__main__": unittest.main()