You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2017/08/12 09:56:14 UTC
svn commit: r1804863 - in /sis/branches/JDK8/core/sis-utility/src:
main/java/org/apache/sis/measure/ main/resources/org/apache/sis/measure/
test/java/org/apache/sis/measure/
Author: desruisseaux
Date: Sat Aug 12 09:56:14 2017
New Revision: 1804863
URL: http://svn.apache.org/viewvc?rev=1804863&view=rev
Log:
Add RADIANS_PER_SECOND unit and the corresponding AngularVelocity quantity. Add also a Salinity quantity.
Added:
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java (with props)
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java (with props)
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java (with props)
Modified:
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/UnitRegistry.java
sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties
sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties
sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java
Added: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java?rev=1804863&view=auto
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java (added)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.measure;
+
+import javax.measure.Quantity;
+
+
+/**
+ * The rate of change of an angular displacement with respect to time.
+ * The SI unit is radians per second (rad/s) and the EPSG code is 1035.
+ * This quantity is used for describing the rate of changes of {@code rX}, {@code rY} and {@code rZ} terms in
+ * {@linkplain org.apache.sis.referencing.datum.BursaWolfParameters Bursa-Wolf parameters}, under the effect
+ * of plate tectonics.
+ *
+ * <p>Most quantity types are defined in the {@link javax.measure.quantity}.
+ * This {@code AngularVelocity} type is an extension to the standard types.</p>
+ *
+ * @author Martin Desruisseaux (Geomatys)
+ * @version 0.8
+ * @since 0.8
+ * @module
+ *
+ * @see Units#RADIANS_PER_SECOND
+ * @see org.apache.sis.referencing.datum.TimeDependentBWP
+ */
+public interface AngularVelocity extends Quantity<AngularVelocity> {
+}
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/AngularVelocity.java
------------------------------------------------------------------------------
svn:mime-type = text/plain;charset=UTF-8
Added: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java?rev=1804863&view=auto
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java (added)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.measure;
+
+import javax.measure.Quantity;
+
+
+/**
+ * The Practical Salinity Scale (PSS-78).
+ * This is a dimensionless quantity for the measurement of sea water salinity.
+ * In principle, the unit of measurement associated to this quantity has no symbol.
+ * However Apache SIS uses the "psu" symbol for avoiding confusion with other dimensionless units.
+ *
+ * <p>Most quantity types are defined in the {@link javax.measure.quantity}.
+ * This {@code AngularVelocity} type is an extension to the standard types.</p>
+ *
+ * @author Martin Desruisseaux (Geomatys)
+ * @version 0.8
+ * @since 0.8
+ * @module
+ *
+ * @see Units#PSU
+ */
+public interface Salinity extends Quantity<Salinity> {
+}
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Salinity.java
------------------------------------------------------------------------------
svn:mime-type = text/plain;charset=UTF-8
Added: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java?rev=1804863&view=auto
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java (added)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sis.measure;
+
+import javax.measure.Quantity;
+
+
+/**
+ * The rate of change of a scale factor, in unity per second. This unit is specific to the EPSG database.
+ * It has the same units than frequency, but it still not the same thing.
+ *
+ * @author Martin Desruisseaux (Geomatys)
+ * @version 0.8
+ * @since 0.8
+ * @module
+ */
+interface ScaleRateOfChange extends Quantity<ScaleRateOfChange> {
+}
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/ScaleRateOfChange.java
------------------------------------------------------------------------------
svn:mime-type = text/plain;charset=UTF-8
Modified: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/UnitRegistry.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/UnitRegistry.java?rev=1804863&r1=1804862&r2=1804863&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/UnitRegistry.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/UnitRegistry.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -121,22 +121,34 @@ final class UnitRegistry implements Syst
*/
static <Q extends Quantity<Q>> SystemUnit<Q> init(final SystemUnit<Q> unit) {
assert !Units.initialized : unit; // This assertion happens during Units initialization, but it is okay.
- boolean existed;
- existed = HARD_CODED.put(unit.dimension, unit) != null;
- existed |= HARD_CODED.put(unit.quantity, unit) != null;
- existed |= HARD_CODED.put(unit.getSymbol(), unit) != null;
+ int existed;
+ existed = (HARD_CODED.put(unit.dimension, unit) == null) ? 0 : 1;
+ existed |= (HARD_CODED.put(unit.quantity, unit) == null) ? 0 : 2;
+ existed |= (HARD_CODED.put(unit.getSymbol(), unit) == null) ? 0 : 4;
if (unit.epsg != 0) {
- existed |= HARD_CODED.put(unit.epsg, unit) != null;
+ existed |= (HARD_CODED.put(unit.epsg, unit) == null) ? 0 : 8;
}
/*
* Key collision on dimension and quantity tolerated for dimensionless units only, with an
* an exception for "candela" because "lumen" is candela divided by a dimensionless unit.
+ * Another exception is "Hz" because it come after rad/s, which has the same dimension.
*/
- assert !existed || unit.dimension.isDimensionless() || "cd".equals(unit.getSymbol()) : unit;
+ assert filter(existed, unit) == 0 : unit;
return unit;
}
/**
+ * Clears the {@code existed} bits for the cases where we allow dimension or quantity type collisions.
+ * This method is invoked for assertions only.
+ */
+ private static int filter(int existed, final SystemUnit<?> unit) {
+ final String s = unit.getSymbol();
+ if (unit.dimension.isDimensionless()) existed &= ~(1 | 2); // Accepts dimension and quantity collisions.
+ if (s.equals("cd") || s.equals("Hz")) existed &= ~(1 ); // Accepts dimension collisions only;
+ return s.isEmpty() ? 0 : existed;
+ }
+
+ /**
* Invoked by {@link Units} static class initializer for registering SI conventional units.
* This method shall be invoked in a single thread by the {@code Units} class initializer only.
*/
Modified: sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java?rev=1804863&r1=1804862&r2=1804863&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/java/org/apache/sis/measure/Units.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -371,7 +371,7 @@ public final class Units extends Static
* <table class="compact" summary="Related units" style="margin-left:30px; line-height:1.25">
* <tr><td>SI angle units:</td> <td style="word-spacing:1em">{@link #MICRORADIAN}, <u><b>{@code RADIAN}</b></u>.</td></tr>
* <tr><td>In other systems:</td> <td style="word-spacing:1em">{@link #DEGREE}, {@link #ARC_MINUTE}, {@link #ARC_SECOND}, {@link #GRAD}.</td></tr>
- * <tr><td>Derived units:</td> <td style="word-spacing:1em">{@link #STERADIAN}.</td></tr>
+ * <tr><td>Derived units:</td> <td style="word-spacing:1em">{@link #STERADIAN}, {@link #RADIANS_PER_SECOND}.</td></tr>
* </table></div>
*
* @since 0.8
@@ -582,6 +582,19 @@ public final class Units extends Static
public static final Unit<Frequency> HERTZ;
/**
+ * The unit for angular velocity (rad/s).
+ * The identifier is EPSG:1035.
+ *
+ * <div class="note"><p class="simpleTagLabel" style="margin-bottom:0">Related units:</p>
+ * <table class="compact" summary="Related units" style="margin-left:30px; line-height:1.25">
+ * <tr><td>Components:</td> <td style="word-spacing:0.5em">{@link #RADIAN} ∕ {@link #SECOND}</td></tr>
+ * </table></div>
+ *
+ * @since 0.8
+ */
+ public static final Unit<AngularVelocity> RADIANS_PER_SECOND;
+
+ /**
* The SI derived unit for speed (m/s).
* The unlocalized name is “metres per second” and the identifier is EPSG:1026.
*
@@ -1020,10 +1033,9 @@ public final class Units extends Static
* Salinity measured using PSS-78. While this is a dimensionless measurement, the {@code "psu"} symbol
* is sometime added to PSS-78 measurement. However this is officially discouraged.
*
- * <p>If we make this field public in a future SIS version, we should consider introducing a
- * {@code Salinity} quantity type.</p>
+ * @since 0.8
*/
- static final Unit<Dimensionless> PSU;
+ public static final Unit<Salinity> PSU;
/**
* Sigma-level, used in oceanography. This is a way to measure a depth as a fraction of the sea floor depth.
@@ -1069,6 +1081,7 @@ public final class Units extends Static
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 force = mass.multiply(speed).divide(time);
@@ -1143,11 +1156,19 @@ public final class Units extends Static
WEEK = add(s, LinearConverter.scale( 7*24*60*60, 1), "wk", OTHER, (short) 0);
TROPICAL_YEAR = add(s, LinearConverter.scale(31556925445.0, 1000), "a", OTHER, (short) 1029);
/*
- * All Unit<Speed>.
- */
+ * All Unit<Speed>, 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(1);
METRES_PER_SECOND = mps;
- KILOMETRES_PER_HOUR = add(mps, LinearConverter.scale(10, 36), "km∕h", ACCEPTED, (short) 0);
+ KILOMETRES_PER_HOUR = add(mps, LinearConverter.scale(10, 36), "km∕h", ACCEPTED, (short) 0);
+ RADIANS_PER_SECOND = add(AngularVelocity.class, null, frequency, "rad∕s", SI, (short) 1035);
+ add(unityPerSecond, LinearConverter.scale(1, 31556925445E6), "ppm∕a", OTHER, (short) 1030);
/*
* All Unit<Pressure>.
*/
@@ -1177,8 +1198,9 @@ public final class Units extends Static
GRAM = add(kg, milli, "g", (byte) (ACCEPTED | PREFIXABLE), (short) 0);
/*
* Force, energy, electricity, magnetism and other units.
+ * Frequency must be defined after angular velocities.
*/
- HERTZ = add(Frequency.class, Scalar.Frequency::new, time.pow(-1), "Hz", (byte) (SI | PREFIXABLE), (short) 0);
+ 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);
@@ -1201,7 +1223,7 @@ public final class Units extends Static
*/
PERCENT = add(one, centi, "%", OTHER, (short) 0);
PPM = add(one, micro, "ppm", OTHER, (short) 9202);
- PSU = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "psu", OTHER, (short) 0);
+ PSU = add(Salinity.class, null, dimensionless, "psu", OTHER, (short) 0);
SIGMA = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "sigma", OTHER, (short) 0);
PIXEL = add(Dimensionless.class, Scalar.Dimensionless::new, dimensionless, "px", OTHER, (short) 0);
UNITY = UnitRegistry.init(one); // Must be last in order to take precedence over all other units associated to UnitDimension.NONE.
Modified: sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties?rev=1804863&r1=1804862&r2=1804863&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties [ISO-8859-1] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames.properties [ISO-8859-1] Sat Aug 12 09:56:14 2017
@@ -45,6 +45,7 @@ psu=practical salinity unit
pt=point
px=pixel
rad=radian
+rad\u2215s=radians per second
s=second
S=siemens
sr=steradian
Modified: sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties?rev=1804863&r1=1804862&r2=1804863&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties [ISO-8859-1] (original)
+++ sis/branches/JDK8/core/sis-utility/src/main/resources/org/apache/sis/measure/UnitNames_fr.properties [ISO-8859-1] Sat Aug 12 09:56:14 2017
@@ -24,6 +24,7 @@ mm=millimètre
ms=milliseconde
nm=nanomètre
ppm=parties par million
+rad\u2215s=radians par seconde
s=seconde
sr=stéradian
unity=unité
Modified: sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java?rev=1804863&r1=1804862&r2=1804863&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/measure/UnitFormatTest.java [UTF-8] Sat Aug 12 09:56:14 2017
@@ -90,6 +90,7 @@ public final strictfp class UnitFormatTe
verify(declared, "WEEK", "T", "wk", "week", Units.WEEK);
verify(declared, "TROPICAL_YEAR", "T", "a", "year", Units.TROPICAL_YEAR);
verify(declared, "HERTZ", "∕T", "Hz", "hertz", Units.HERTZ);
+ verify(declared, "RADIANS_PER_SECOND", "∕T", "rad∕s", "radians per second", Units.RADIANS_PER_SECOND);
verify(declared, "METRES_PER_SECOND", "L∕T", "m∕s", "metres per second", Units.METRES_PER_SECOND);
verify(declared, "KILOMETRES_PER_HOUR", "L∕T", "km∕h", "kilometres per hour", Units.KILOMETRES_PER_HOUR);
verify(declared, "PASCAL", "M∕(L⋅T²)", "Pa", "pascal", Units.PASCAL);