@@ -58,6 +58,8 @@ QgsUnitTypes::DistanceUnitType QgsUnitTypes::unitType( QgsUnitTypes::AreaUnit un
58
58
case AreaHectares:
59
59
case AreaAcres:
60
60
case AreaSquareNauticalMiles:
61
+ case AreaSquareCentimeters:
62
+ case AreaSquareMillimeters:
61
63
return Standard;
62
64
63
65
case AreaSquareDegrees:
@@ -562,6 +564,10 @@ QString QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaUnit unit )
562
564
return QStringLiteral ( " nm2" );
563
565
case AreaSquareDegrees:
564
566
return QStringLiteral ( " deg2" );
567
+ case AreaSquareCentimeters:
568
+ return QStringLiteral ( " cm2" );
569
+ case AreaSquareMillimeters:
570
+ return QStringLiteral ( " mm2" );
565
571
case AreaUnknownUnit:
566
572
return QStringLiteral ( " <unknown>" );
567
573
}
@@ -593,6 +599,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::decodeAreaUnit( const QString &string, bool
593
599
return AreaSquareNauticalMiles;
594
600
if ( normalized == encodeUnit ( AreaSquareDegrees ) )
595
601
return AreaSquareDegrees;
602
+ if ( normalized == encodeUnit ( AreaSquareCentimeters ) )
603
+ return AreaSquareCentimeters;
604
+ if ( normalized == encodeUnit ( AreaSquareMillimeters ) )
605
+ return AreaSquareMillimeters;
596
606
if ( normalized == encodeUnit ( AreaUnknownUnit ) )
597
607
return AreaUnknownUnit;
598
608
@@ -624,6 +634,10 @@ QString QgsUnitTypes::toString( QgsUnitTypes::AreaUnit unit )
624
634
return QObject::tr ( " square nautical miles" , " area" );
625
635
case AreaSquareDegrees:
626
636
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" );
627
641
case AreaUnknownUnit:
628
642
return QObject::tr ( " <unknown>" , " area" );
629
643
}
@@ -652,6 +666,10 @@ QString QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::AreaUnit unit )
652
666
return QObject::trUtf8 ( " NM²" , " area" );
653
667
case AreaSquareDegrees:
654
668
return QObject::trUtf8 ( " deg²" , " area" );
669
+ case AreaSquareCentimeters:
670
+ return QObject::trUtf8 ( " cm²" , " area" );
671
+ case AreaSquareMillimeters:
672
+ return QObject::trUtf8 ( " mm²" , " area" );
655
673
case AreaUnknownUnit:
656
674
return QString ();
657
675
}
@@ -683,6 +701,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::stringToAreaUnit( const QString &string, bo
683
701
return AreaSquareNauticalMiles;
684
702
if ( normalized == toString ( AreaSquareDegrees ) )
685
703
return AreaSquareDegrees;
704
+ if ( normalized == toString ( AreaSquareMillimeters ) )
705
+ return AreaSquareMillimeters;
706
+ if ( normalized == toString ( AreaSquareCentimeters ) )
707
+ return AreaSquareCentimeters;
686
708
if ( normalized == toString ( AreaUnknownUnit ) )
687
709
return AreaUnknownUnit;
688
710
if ( ok )
@@ -694,6 +716,8 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::stringToAreaUnit( const QString &string, bo
694
716
double QgsUnitTypes::fromUnitToUnitFactor ( QgsUnitTypes::AreaUnit fromUnit, QgsUnitTypes::AreaUnit toUnit )
695
717
{
696
718
#define KM2_TO_M2 1000000.0
719
+ #define CM2_TO_M2 0.0001
720
+ #define MM2_TO_M2 0.000001
697
721
#define FT2_TO_M2 0.09290304
698
722
#define YD2_TO_M2 0.83612736
699
723
#define MI2_TO_M2 2589988.110336
@@ -727,6 +751,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
727
751
return 1.0 / NM2_TO_M2;
728
752
case AreaSquareDegrees:
729
753
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;
730
758
case AreaUnknownUnit:
731
759
break ;
732
760
}
@@ -755,6 +783,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
755
783
return KM2_TO_M2 / NM2_TO_M2;
756
784
case AreaSquareDegrees:
757
785
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;
758
790
case AreaUnknownUnit:
759
791
break ;
760
792
}
@@ -783,6 +815,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
783
815
return FT2_TO_M2 / NM2_TO_M2;
784
816
case AreaSquareDegrees:
785
817
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;
786
822
case AreaUnknownUnit:
787
823
break ;
788
824
}
@@ -812,6 +848,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
812
848
return YD2_TO_M2 / NM2_TO_M2;
813
849
case AreaSquareDegrees:
814
850
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;
815
855
case AreaUnknownUnit:
816
856
break ;
817
857
}
@@ -840,6 +880,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
840
880
return MI2_TO_M2 / NM2_TO_M2;
841
881
case AreaSquareDegrees:
842
882
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;
843
887
case AreaUnknownUnit:
844
888
break ;
845
889
}
@@ -869,6 +913,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
869
913
return HA_TO_M2 / NM2_TO_M2;
870
914
case AreaSquareDegrees:
871
915
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;
872
920
case AreaUnknownUnit:
873
921
break ;
874
922
}
@@ -898,6 +946,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
898
946
return AC_TO_FT2 * FT2_TO_M2 / NM2_TO_M2;
899
947
case AreaSquareDegrees:
900
948
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;
901
953
case AreaUnknownUnit:
902
954
break ;
903
955
}
@@ -927,6 +979,10 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
927
979
return 1.0 ;
928
980
case AreaSquareDegrees:
929
981
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;
930
986
case AreaUnknownUnit:
931
987
break ;
932
988
}
@@ -956,13 +1012,81 @@ double QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::AreaUnit fromUnit, QgsU
956
1012
return DEG2_TO_M2 / NM2_TO_M2;
957
1013
case AreaSquareDegrees:
958
1014
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;
959
1019
case AreaUnknownUnit:
960
1020
break ;
961
1021
}
962
1022
963
1023
break ;
964
1024
}
965
1025
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
+ }
966
1090
case AreaUnknownUnit:
967
1091
break ;
968
1092
}
@@ -980,10 +1104,10 @@ QgsUnitTypes::AreaUnit QgsUnitTypes::distanceToAreaUnit( DistanceUnit distanceUn
980
1104
return AreaSquareKilometers;
981
1105
982
1106
case DistanceCentimeters:
983
- return AreaSquareMeters ;
1107
+ return AreaSquareCentimeters ;
984
1108
985
1109
case DistanceMillimeters:
986
- return AreaSquareMeters ;
1110
+ return AreaSquareCentimeters ;
987
1111
988
1112
case DistanceFeet:
989
1113
return AreaSquareFeet;
@@ -1362,8 +1486,42 @@ QgsUnitTypes::AreaValue QgsUnitTypes::scaledArea( double area, QgsUnitTypes::Are
1362
1486
{
1363
1487
AreaValue result;
1364
1488
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
+
1365
1517
switch ( unit )
1366
1518
{
1519
+ case AreaSquareCentimeters:
1520
+ // handled in the if above
1521
+ break ;
1522
+ case AreaSquareMillimeters:
1523
+ // handled in the if above
1524
+ break ;
1367
1525
case AreaSquareMeters:
1368
1526
{
1369
1527
if ( keepBaseUnit )
0 commit comments