in endorsed/src/org.apache.sis.util/main/org/apache/sis/measure/Units.java [1202:1397]
static {
final UnitDimension length = new UnitDimension('L');
final UnitDimension mass = new UnitDimension('M');
final UnitDimension time = new UnitDimension('T');
final UnitDimension current = new UnitDimension('I');
final UnitDimension temperature = new UnitDimension('Θ');
final UnitDimension amount = new UnitDimension('N');
final UnitDimension luminous = new UnitDimension('J');
final UnitDimension frequency = time.pow(-1);
final UnitDimension area = length.pow(2);
final UnitDimension speed = length.divide(time);
final UnitDimension acceleration = speed.divide(time);
final UnitDimension force = mass.multiply(speed).divide(time);
final UnitDimension energy = force.multiply(length);
final UnitDimension power = energy.divide(time);
final UnitDimension charge = current.multiply(time);
final UnitDimension potential = power.divide(current);
final UnitDimension magneticFlux = potential.multiply(time);
final UnitDimension pressure = force.divide(area);
final UnitDimension dimensionless = UnitDimension.NONE;
/*
* Base, derived or alternate units that we need to reuse more than once in this static initializer.
*/
final SystemUnit<Length> m = add(Length.class, Scalar.Length::new, length, "m", (byte) (SI | PREFIXABLE), Constants.EPSG_METRE);
final SystemUnit<Area> m2 = add(Area.class, Scalar.Area::new, area, "m²", (byte) (SI | PREFIXABLE), (short) 0);
final SystemUnit<Volume> m3 = add(Volume.class, Scalar.Volume::new, length.pow(3), "m³", (byte) (SI | PREFIXABLE), (short) 0);
final SystemUnit<Time> s = add(Time.class, Scalar.Time::new, time, "s", (byte) (SI | PREFIXABLE), (short) 1040);
final SystemUnit<Temperature> K = add(Temperature.class, Scalar.Temperature.FACTORY, temperature, "K", (byte) (SI | PREFIXABLE), (short) 0);
final SystemUnit<Speed> mps = add(Speed.class, Scalar.Speed::new, speed, "m∕s", (byte) (SI | PREFIXABLE), (short) 1026);
final SystemUnit<Acceleration> mps2 = add(Acceleration.class, Scalar.Acceleration::new, acceleration, "m∕s²", (byte) (SI | PREFIXABLE), (short) 0);
final SystemUnit<Pressure> Pa = add(Pressure.class, Scalar.Pressure::new, pressure, "Pa", (byte) (SI | PREFIXABLE), (short) 0);
final SystemUnit<Angle> rad = add(Angle.class, Scalar.Angle::new, dimensionless, "rad", (byte) (SI | PREFIXABLE), (short) 9101);
final SystemUnit<Dimensionless> one = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "", SI, (short) 9201);
final SystemUnit<Mass> kg = add(Mass.class, Scalar.Mass::new, mass, "kg", SI, (short) 0);
/*
* All SI prefix to be used below, with additional converters to be used more than once.
*/
final LinearConverter nano = Prefixes.converter('n');
final LinearConverter micro = Prefixes.converter('µ');
final LinearConverter milli = Prefixes.converter('m');
final LinearConverter centi = Prefixes.converter('c');
final LinearConverter hecto = Prefixes.converter('h');
final LinearConverter kilo = Prefixes.converter('k');
final LinearConverter ten4 = LinearConverter.scale(10000, 1);
/*
* All Unit<Angle>.
* 20 is the greatest common denominator between 180 and 200. The intent is to have arguments as small
* as possible in the call to the scale(double, double) method, while keeping the right side integer.
* Staying closer to zero during conversions helo to reduce rounding errors.
*/
rad.related(4);
RADIAN = rad;
GRAD = add(rad, LinearConverter.scale(Math.PI / 20, 200 / 20), "grad", OTHER, (short) 9105);
DEGREE = add(rad, LinearConverter.scale(Math.PI / 20, 180 / 20), "°", ACCEPTED, Constants.EPSG_PARAM_DEGREES);
ARC_MINUTE = add(rad, LinearConverter.scale(Math.PI / 20, 180*60 / 20), "′", ACCEPTED, (short) 9103);
ARC_SECOND = add(rad, LinearConverter.scale(Math.PI / 20, 180*60*60 / 20), "″", ACCEPTED, (short) 9104);
MICRORADIAN = add(rad, micro, "µrad", SI, (short) 9109);
/*
* All Unit<Length>.
*/
m.related(7);
METRE = m;
NANOMETRE = add(m, nano, "nm", SI, (short) 0);
MILLIMETRE = add(m, milli, "mm", SI, (short) 1025);
CENTIMETRE = add(m, centi, "cm", SI, (short) 1033);
KILOMETRE = add(m, kilo, "km", SI, (short) 9036);
NAUTICAL_MILE = add(m, LinearConverter.scale( 1852, 1), "M", OTHER, (short) 9030);
STATUTE_MILE = add(m, LinearConverter.scale(1609344, 1000), "mi", IMPERIAL, (short) 9093);
US_SURVEY_FOOT = add(m, LinearConverter.scale( 1200, 3937), "ftUS", OTHER, (short) 9003);
CLARKE_FOOT = add(m, LinearConverter.scale(3047972654d, 1E10), "ftCla", OTHER, (short) 9005);
FOOT = add(m, LinearConverter.scale( 3048, 10000), "ft", IMPERIAL, (short) 9002);
INCH = add(m, LinearConverter.scale( 254, 10000), "in", IMPERIAL, (short) 0);
POINT = add(m, LinearConverter.scale( 996264, 72000000), "pt", OTHER, (short) 0);
/*
* All Unit<Time>.
*/
s.related(5);
SECOND = s;
NANOSECOND = add(s, nano, "ns", SI, (short) 0);
MILLISECOND = add(s, milli, "ms", SI, (short) 0);
MINUTE = add(s, LinearConverter.scale( 60, 1), "min", ACCEPTED, (short) 0);
HOUR = add(s, LinearConverter.scale( 60*60, 1), "h", ACCEPTED, (short) 0);
DAY = add(s, LinearConverter.scale( SECONDS_PER_DAY, 1), "d", ACCEPTED, (short) 0);
WEEK = add(s, LinearConverter.scale( 7*SECONDS_PER_DAY, 1), "wk", OTHER, (short) 0);
TROPICAL_YEAR = add(s, LinearConverter.scale(MILLIS_PER_TROPICAL_YEAR, 1000), "a", OTHER, (short) 1029);
/*
* All Unit<Speed>, Unit<Acceleration>, Unit<AngularVelocity> and Unit<ScaleRateOfChange>.
* The `unityPerSecond` unit is not added to the registry because it is specific to the EPSG database,
* has no clear symbol and is easy to confuse with Hertz. We create that unit only for allowing us to
* create the "ppm/a" units.
*/
final SystemUnit<ScaleRateOfChange> unityPerSecond;
unityPerSecond = new SystemUnit<>(ScaleRateOfChange.class, frequency, null, OTHER, (short) 1036, null);
unityPerSecond.related(1);
mps .related(2);
mps2.related(1);
METRES_PER_SECOND = mps;
METRES_PER_SECOND_SQUARED = mps2;
KILOMETRES_PER_HOUR = add(mps, LinearConverter.scale(10, 36), "km∕h", ACCEPTED, (short) 0);
KNOT = add(mps, LinearConverter.scale(1852, 3600), "kn", OTHER, (short) 0);
RADIANS_PER_SECOND = add(AngularVelocity.class, null, frequency, "rad∕s", SI, (short) 1035);
GAL = add(mps2, centi, "Gal", (byte) (CGS | PREFIXABLE | ACCEPTED), (short) 0);
add(unityPerSecond, LinearConverter.scale(1, 31556925445E6), "ppm∕a", OTHER, (short) 1030);
/*
* All Unit<Pressure>.
*/
Pa.related(3);
PASCAL = Pa;
HECTOPASCAL = add(Pa, hecto, "hPa", SI, (short) 0);
DECIBAR = add(Pa, ten4, "dbar", OTHER, (short) 0);
BAR = add(Pa, LinearConverter.scale(100000, 1), "bar", OTHER, (short) 0);
ATMOSPHERE = add(Pa, LinearConverter.scale(101325, 1), "atm", OTHER, (short) 0);
/*
* All Unit<Temperature>.
*/
K.related(2);
KELVIN = K;
CELSIUS = add(K, LinearConverter.offset( 27315, 100), "°C", SI, (short) 0);
FAHRENHEIT = add(K, new LinearConverter(100, 45967, 180), "°F", OTHER, (short) 0);
/*
* Unit<Volume> and Unit<Mass>. Those units need to be handled in a special way because:
* 1) The base unit of mass is "kg", not "g". This is handled by a hard-coded case in SystemUnit.
* 2) The liter unit is not a SI units, but despite that is commonly used with SI prefixes.
*/
SQUARE_METRE = m2;
CUBIC_METRE = m3;
KILOGRAM = kg;
TONNE = add(kg, kilo, "t", ACCEPTED, (short) 0);
HECTARE = add(m2, ten4, "ha", ACCEPTED, (short) 0);
LITRE = add(m3, milli, "L", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
GRAM = add(kg, milli, "g", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
/*
* Radioactivity must be defined after angular velocities, because it has the same dimensions.
* The dimensions are also the same as frequency.
*/
final SystemUnit<Radioactivity> Bq;
Bq = add(Radioactivity.class, null, frequency, "Bq", (byte) (SI | PREFIXABLE), (short) 0);
Bq.related(1);
BECQUEREL = Bq;
CURIE = add(Bq, LinearConverter.scale(3.7E10, 1), "Ci", OTHER, (short) 0);
/*
* Force, energy, electricity, magnetism and other units.
* Frequency must be defined after angular velocities.
*/
HERTZ = add(Frequency.class, Scalar.Frequency::new, frequency, "Hz", (byte) (SI | PREFIXABLE), (short) 0);
NEWTON = add(Force.class, Scalar.Force::new, force, "N", (byte) (SI | PREFIXABLE), (short) 0);
JOULE = add(Energy.class, Scalar.Energy::new, energy, "J", (byte) (SI | PREFIXABLE), (short) 0);
WATT = add(Power.class, Scalar.Power::new, power, "W", (byte) (SI | PREFIXABLE), (short) 0);
AMPERE = add(ElectricCurrent.class, null, current, "A", (byte) (SI | PREFIXABLE), (short) 0);
COULOMB = add(ElectricCharge.class, null, charge, "C", (byte) (SI | PREFIXABLE), (short) 0);
VOLT = add(ElectricPotential.class, null, potential, "V", (byte) (SI | PREFIXABLE), (short) 0);
FARAD = add(ElectricCapacitance.class, null, charge.divide(potential), "F", (byte) (SI | PREFIXABLE), (short) 0);
SIEMENS = add(ElectricConductance.class, null, current.divide(potential), "S", (byte) (SI | PREFIXABLE), (short) 0);
OHM = add(ElectricResistance.class, null, potential.divide(current), "Ω", (byte) (SI | PREFIXABLE), (short) 0);
WEBER = add(MagneticFlux.class, null, magneticFlux, "Wb", (byte) (SI | PREFIXABLE), (short) 0);
TESLA = add(MagneticFluxDensity.class, null, magneticFlux.divide(area), "T", (byte) (SI | PREFIXABLE), (short) 0);
HENRY = add(ElectricInductance.class, null, magneticFlux.divide(current), "H", (byte) (SI | PREFIXABLE), (short) 0);
LUX = add(Illuminance.class, null, luminous.divide(area), "lx", (byte) (SI | PREFIXABLE), (short) 0);
LUMEN = add(LuminousFlux.class, null, luminous, "lm", (byte) (SI | PREFIXABLE), (short) 0);
CANDELA = add(LuminousIntensity.class, null, luminous, "cd", (byte) (SI | PREFIXABLE), (short) 0); // Must be after Lumen.
MOLE = add(AmountOfSubstance.class, null, amount, "mol", (byte) (SI | PREFIXABLE), (short) 0);
STERADIAN = add(SolidAngle.class, null, dimensionless, "sr", (byte) (SI | PREFIXABLE), (short) 0);
/*
* All Unit<Dimensionless>.
*/
final SystemUnit<Salinity> sal;
ConventionalUnit<Dimensionless> bel;
SIGMA = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "sigma", OTHER, (short) 0);
PIXEL = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "px", OTHER, (short) 0);
sal = add(Salinity.class, null, dimensionless, null, OTHER, (short) 0);
PSU = add(sal, milli, "psu", OTHER, (short) 0);
PERCENT = add(one, centi, "%", OTHER, (short) 0);
PPM = add(one, micro, "ppm", OTHER, (short) 9202);
bel = add(one, PowerOf10.belToOne(), "B", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
DECIBEL = add(bel, Prefixes.converter('d'), "dB", ACCEPTED, (short) 0);
UNITY = UnitRegistry.init(one); // Must be last in order to take precedence over all other units associated to UnitDimension.NONE.
UnitRegistry.alias(UNITY, Short.valueOf((short) 9203));
UnitRegistry.alias(DEGREE, Short.valueOf(Constants.EPSG_AXIS_DEGREES));
UnitRegistry.alias(ARC_MINUTE, "'");
UnitRegistry.alias(ARC_SECOND, "\"");
UnitRegistry.alias(KNOT, "kt"); // Symbol used in aviation.
UnitRegistry.alias(KELVIN, "K"); // Ordinary "K" letter (not the dedicated Unicode character).
UnitRegistry.alias(CELSIUS, "℃");
UnitRegistry.alias(CELSIUS, "Cel");
UnitRegistry.alias(FAHRENHEIT, "℉");
UnitRegistry.alias(GRAD, "gon");
UnitRegistry.alias(GAL, "cm∕s²");
UnitRegistry.alias(HECTARE, "hm²");
UnitRegistry.alias(LITRE, "l");
UnitRegistry.alias(LITRE, "ℓ");
UnitRegistry.alias(PSU, "PSU");
UnitRegistry.alias(UNITY, SystemUnit.ONE);
initialized = true;
}