Add square nautical miles as a supported areal unit, add API

method for converting a distance unit to corresponding area unit
This commit is contained in:
Nyall Dawson 2016-02-15 10:46:20 +11:00
parent bd3bbc4707
commit 35c2d185fb
4 changed files with 344 additions and 78 deletions

View File

@ -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 );
};

View File

@ -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

View File

@ -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

View File

@ -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()