Skip to content

Commit 91da1f5

Browse files
committed
[feature] Add support for square centimeters / square millimeter units
Note for documentation writers, centimers / millimeters support has been added as well in a previous commit.
1 parent 56163e2 commit 91da1f5

File tree

3 files changed

+167
-3
lines changed

3 files changed

+167
-3
lines changed

python/core/qgsunittypes.sip

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class QgsUnitTypes
3333
DistanceYards, /*!< imperial yards */
3434
DistanceMiles, /*!< terrestrial miles */
3535
DistanceDegrees, /*!< degrees, for planar geographic CRS distance measurements */
36+
DistanceCentimeters,
37+
DistanceMillimeters,
3638
DistanceUnknownUnit, /*!< unknown distance unit */
3739
};
3840

@@ -57,7 +59,9 @@ class QgsUnitTypes
5759
AreaAcres, /*!< acres */
5860
AreaSquareNauticalMiles, /*!< square nautical miles */
5961
AreaSquareDegrees, /*!< square degrees, for planar geographic CRS area measurements */
60-
AreaUnknownUnit, /*!< unknown areal unit */
62+
AreaSquareCentimeters,
63+
AreaSquareMillimeters,
64+
AreaUnknownUnit,
6165
};
6266

6367
//! Units of angles

src/core/qgsunittypes.cpp

+160-2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ QgsUnitTypes::DistanceUnitType QgsUnitTypes::unitType( QgsUnitTypes::AreaUnit un
5858
case AreaHectares:
5959
case AreaAcres:
6060
case AreaSquareNauticalMiles:
61+
case AreaSquareCentimeters:
62+
case AreaSquareMillimeters:
6163
return Standard;
6264

6365
case AreaSquareDegrees:
@@ -562,6 +564,10 @@ QString QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaUnit unit )
562564
return QStringLiteral( "nm2" );
563565
case AreaSquareDegrees:
564566
return QStringLiteral( "deg2" );
567+
case AreaSquareCentimeters:
568+
return QStringLiteral( "cm2" );
569+
case AreaSquareMillimeters:
570+
return QStringLiteral( "mm2" );
565571
case AreaUnknownUnit:
566572
return QStringLiteral( "<unknown>" );
567573
}
@@ -593,6 +599,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::decodeAreaUnit( const QString &string, bool
593599
return AreaSquareNauticalMiles;
594600
if ( normalized == encodeUnit( AreaSquareDegrees ) )
595601
return AreaSquareDegrees;
602+
if ( normalized == encodeUnit( AreaSquareCentimeters ) )
603+
return AreaSquareCentimeters;
604+
if ( normalized == encodeUnit( AreaSquareMillimeters ) )
605+
return AreaSquareMillimeters;
596606
if ( normalized == encodeUnit( AreaUnknownUnit ) )
597607
return AreaUnknownUnit;
598608

@@ -624,6 +634,10 @@ QString QgsUnitTypes::toString( QgsUnitTypes::AreaUnit unit )
624634
return QObject::tr( "square nautical miles", "area" );
625635
case AreaSquareDegrees:
626636
return QObject::tr( "square degrees", "area" );
637+
case AreaSquareMillimeters:
638+
return QObject::tr( "square millimeters", "area" );
639+
case AreaSquareCentimeters:
640+
return QObject::tr( "square centimeters", "area" );
627641
case AreaUnknownUnit:
628642
return QObject::tr( "<unknown>", "area" );
629643
}
@@ -652,6 +666,10 @@ QString QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::AreaUnit unit )
652666
return QObject::trUtf8( "NM²", "area" );
653667
case AreaSquareDegrees:
654668
return QObject::trUtf8( "deg²", "area" );
669+
case AreaSquareCentimeters:
670+
return QObject::trUtf8( "cm²", "area" );
671+
case AreaSquareMillimeters:
672+
return QObject::trUtf8( "mm²", "area" );
655673
case AreaUnknownUnit:
656674
return QString();
657675
}
@@ -683,6 +701,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::stringToAreaUnit( const QString &string, bo
683701
return AreaSquareNauticalMiles;
684702
if ( normalized == toString( AreaSquareDegrees ) )
685703
return AreaSquareDegrees;
704+
if ( normalized == toString( AreaSquareMillimeters ) )
705+
return AreaSquareMillimeters;
706+
if ( normalized == toString( AreaSquareCentimeters ) )
707+
return AreaSquareCentimeters;
686708
if ( normalized == toString( AreaUnknownUnit ) )
687709
return AreaUnknownUnit;
688710
if ( ok )
@@ -694,6 +716,8 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::stringToAreaUnit( const QString &string, bo
694716
double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsUnitTypes::AreaUnit toUnit )
695717
{
696718
#define KM2_TO_M2 1000000.0
719+
#define CM2_TO_M2 0.0001
720+
#define MM2_TO_M2 0.000001
697721
#define FT2_TO_M2 0.09290304
698722
#define YD2_TO_M2 0.83612736
699723
#define MI2_TO_M2 2589988.110336
@@ -727,6 +751,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
727751
return 1.0 / NM2_TO_M2;
728752
case AreaSquareDegrees:
729753
return 1.0 / DEG2_TO_M2;
754+
case AreaSquareCentimeters:
755+
return 1.0 / CM2_TO_M2;
756+
case AreaSquareMillimeters:
757+
return 1.0 / MM2_TO_M2;
730758
case AreaUnknownUnit:
731759
break;
732760
}
@@ -755,6 +783,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
755783
return KM2_TO_M2 / NM2_TO_M2;
756784
case AreaSquareDegrees:
757785
return KM2_TO_M2 / DEG2_TO_M2;
786+
case AreaSquareCentimeters:
787+
return KM2_TO_M2 / CM2_TO_M2;
788+
case AreaSquareMillimeters:
789+
return KM2_TO_M2 / MM2_TO_M2;
758790
case AreaUnknownUnit:
759791
break;
760792
}
@@ -783,6 +815,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
783815
return FT2_TO_M2 / NM2_TO_M2;
784816
case AreaSquareDegrees:
785817
return FT2_TO_M2 / DEG2_TO_M2;
818+
case AreaSquareCentimeters:
819+
return FT2_TO_M2 / CM2_TO_M2;
820+
case AreaSquareMillimeters:
821+
return FT2_TO_M2 / MM2_TO_M2;
786822
case AreaUnknownUnit:
787823
break;
788824
}
@@ -812,6 +848,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
812848
return YD2_TO_M2 / NM2_TO_M2;
813849
case AreaSquareDegrees:
814850
return YD2_TO_M2 / DEG2_TO_M2;
851+
case AreaSquareCentimeters:
852+
return YD2_TO_M2 / CM2_TO_M2;
853+
case AreaSquareMillimeters:
854+
return YD2_TO_M2 / MM2_TO_M2;
815855
case AreaUnknownUnit:
816856
break;
817857
}
@@ -840,6 +880,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
840880
return MI2_TO_M2 / NM2_TO_M2;
841881
case AreaSquareDegrees:
842882
return MI2_TO_M2 / DEG2_TO_M2;
883+
case AreaSquareCentimeters:
884+
return MI2_TO_M2 / CM2_TO_M2;
885+
case AreaSquareMillimeters:
886+
return MI2_TO_M2 / MM2_TO_M2;
843887
case AreaUnknownUnit:
844888
break;
845889
}
@@ -869,6 +913,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
869913
return HA_TO_M2 / NM2_TO_M2;
870914
case AreaSquareDegrees:
871915
return HA_TO_M2 / DEG2_TO_M2;
916+
case AreaSquareCentimeters:
917+
return HA_TO_M2 / CM2_TO_M2;
918+
case AreaSquareMillimeters:
919+
return HA_TO_M2 / MM2_TO_M2;
872920
case AreaUnknownUnit:
873921
break;
874922
}
@@ -898,6 +946,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
898946
return AC_TO_FT2 * FT2_TO_M2 / NM2_TO_M2;
899947
case AreaSquareDegrees:
900948
return AC_TO_FT2 * FT2_TO_M2 / DEG2_TO_M2;
949+
case AreaSquareCentimeters:
950+
return AC_TO_FT2 * FT2_TO_M2 / CM2_TO_M2;
951+
case AreaSquareMillimeters:
952+
return AC_TO_FT2 * FT2_TO_M2 / MM2_TO_M2;
901953
case AreaUnknownUnit:
902954
break;
903955
}
@@ -927,6 +979,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
927979
return 1.0;
928980
case AreaSquareDegrees:
929981
return NM2_TO_M2 / DEG2_TO_M2;
982+
case AreaSquareCentimeters:
983+
return NM2_TO_M2 / CM2_TO_M2;
984+
case AreaSquareMillimeters:
985+
return NM2_TO_M2 / MM2_TO_M2;
930986
case AreaUnknownUnit:
931987
break;
932988
}
@@ -956,13 +1012,81 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
9561012
return DEG2_TO_M2 / NM2_TO_M2;
9571013
case AreaSquareDegrees:
9581014
return 1.0;
1015+
case AreaSquareCentimeters:
1016+
return DEG2_TO_M2 / CM2_TO_M2;
1017+
case AreaSquareMillimeters:
1018+
return DEG2_TO_M2 / MM2_TO_M2;
9591019
case AreaUnknownUnit:
9601020
break;
9611021
}
9621022

9631023
break;
9641024
}
9651025

1026+
case AreaSquareMillimeters:
1027+
{
1028+
switch ( toUnit )
1029+
{
1030+
case AreaSquareMeters:
1031+
return MM2_TO_M2;
1032+
case AreaSquareKilometers:
1033+
return MM2_TO_M2 / KM2_TO_M2;
1034+
case AreaSquareFeet:
1035+
return MM2_TO_M2 / FT2_TO_M2 ;
1036+
case AreaSquareYards:
1037+
return MM2_TO_M2 / YD2_TO_M2;
1038+
case AreaSquareMiles:
1039+
return MM2_TO_M2 / MI2_TO_M2;
1040+
case AreaHectares:
1041+
return MM2_TO_M2 / HA_TO_M2;
1042+
case AreaAcres:
1043+
return MM2_TO_M2 / AC_TO_FT2 / FT2_TO_M2;
1044+
case AreaSquareNauticalMiles:
1045+
return MM2_TO_M2 / NM2_TO_M2;
1046+
case AreaSquareDegrees:
1047+
return MM2_TO_M2 / DEG2_TO_M2;
1048+
case AreaSquareCentimeters:
1049+
return MM2_TO_M2 / CM2_TO_M2;
1050+
case AreaSquareMillimeters:
1051+
return 1.0;
1052+
case AreaUnknownUnit:
1053+
break;
1054+
}
1055+
1056+
break;
1057+
}
1058+
case AreaSquareCentimeters:
1059+
{
1060+
switch ( toUnit )
1061+
{
1062+
case AreaSquareMeters:
1063+
return CM2_TO_M2;
1064+
case AreaSquareKilometers:
1065+
return CM2_TO_M2 / KM2_TO_M2;
1066+
case AreaSquareFeet:
1067+
return CM2_TO_M2 / FT2_TO_M2 ;
1068+
case AreaSquareYards:
1069+
return CM2_TO_M2 / YD2_TO_M2;
1070+
case AreaSquareMiles:
1071+
return CM2_TO_M2 / MI2_TO_M2;
1072+
case AreaHectares:
1073+
return CM2_TO_M2 / HA_TO_M2;
1074+
case AreaAcres:
1075+
return CM2_TO_M2 / AC_TO_FT2 / FT2_TO_M2;
1076+
case AreaSquareNauticalMiles:
1077+
return CM2_TO_M2 / NM2_TO_M2;
1078+
case AreaSquareDegrees:
1079+
return CM2_TO_M2 / DEG2_TO_M2;
1080+
case AreaSquareCentimeters:
1081+
return 1.0;
1082+
case AreaSquareMillimeters:
1083+
return CM2_TO_M2 / MM2_TO_M2;
1084+
case AreaUnknownUnit:
1085+
break;
1086+
}
1087+
1088+
break;
1089+
}
9661090
case AreaUnknownUnit:
9671091
break;
9681092
}
@@ -980,10 +1104,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::distanceToAreaUnit( DistanceUnit distanceUn
9801104
return AreaSquareKilometers;
9811105

9821106
case DistanceCentimeters:
983-
return AreaSquareMeters;
1107+
return AreaSquareCentimeters;
9841108

9851109
case DistanceMillimeters:
986-
return AreaSquareMeters;
1110+
return AreaSquareCentimeters;
9871111

9881112
case DistanceFeet:
9891113
return AreaSquareFeet;
@@ -1362,8 +1486,42 @@ QgsUnitTypes::AreaValue QgsUnitTypes::scaledArea( double area, QgsUnitTypes::Are
13621486
{
13631487
AreaValue result;
13641488

1489+
// If we are not forced to keep the base units, switch to meter calculation
1490+
if ( unit == AreaSquareMillimeters )
1491+
{
1492+
if ( keepBaseUnit )
1493+
{
1494+
result.value = qgsRound( area, decimals );
1495+
result.unit = QgsUnitTypes::AreaSquareMillimeters;
1496+
}
1497+
else
1498+
{
1499+
area /= 1000000.0;
1500+
unit = QgsUnitTypes::AreaSquareMeters;
1501+
}
1502+
}
1503+
else if ( unit == AreaSquareCentimeters )
1504+
{
1505+
if ( keepBaseUnit )
1506+
{
1507+
result.value = qgsRound( area, decimals );
1508+
result.unit = QgsUnitTypes::AreaSquareCentimeters;
1509+
}
1510+
else
1511+
{
1512+
area /= 10000.0;
1513+
unit = QgsUnitTypes::AreaSquareMeters;
1514+
}
1515+
}
1516+
13651517
switch ( unit )
13661518
{
1519+
case AreaSquareCentimeters:
1520+
// handled in the if above
1521+
break;
1522+
case AreaSquareMillimeters:
1523+
// handled in the if above
1524+
break;
13671525
case AreaSquareMeters:
13681526
{
13691527
if ( keepBaseUnit )

src/core/qgsunittypes.h

+2
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class CORE_EXPORT QgsUnitTypes
7474
AreaAcres, //!< Acres
7575
AreaSquareNauticalMiles, //!< Square nautical miles
7676
AreaSquareDegrees, //!< Square degrees, for planar geographic CRS area measurements
77+
AreaSquareCentimeters, //! Square centimeters
78+
AreaSquareMillimeters, //! Square millimeters
7779
AreaUnknownUnit, //!< Unknown areal unit
7880
};
7981

0 commit comments

Comments
 (0)