This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new d2a7a83 Geographic/Geocentric conversions shall work with two-dimensional geographic CRS (not only three-dimensional). https://issues.apache.org/jira/browse/SIS-376 d2a7a83 is described below commit d2a7a83e3bddc988910dcf4074ce9c5cd52c8e1c Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Tue Oct 30 10:35:30 2018 +0100 Geographic/Geocentric conversions shall work with two-dimensional geographic CRS (not only three-dimensional). https://issues.apache.org/jira/browse/SIS-376 --- .../referencing/provider/GeodeticOperation.java | 2 +- .../internal/referencing/provider/Molodensky.java | 4 +-- .../operation/CoordinateOperationFinder.java | 19 +++++++++++-- .../operation/CoordinateOperationFinderTest.java | 32 +++++++++++++++++++++- 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/GeodeticOperation.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/GeodeticOperation.java index 6882615..a6641d3 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/GeodeticOperation.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/GeodeticOperation.java @@ -26,7 +26,7 @@ import org.opengis.referencing.operation.Transformation; /** * Base class for providers that perform an operation on geographic or geocentric coordinates. * In the geographic case, those operations can have two-dimensional and three-dimensional variants - * by adding or omitting the ellipsoidal height. Sometime those variants are explicitely declared + * by adding or omitting the ellipsoidal height. Sometime those variants are explicitly declared * in the EPSG database and are implemented in this package as separated operations. Sometime those * variants are specific to Apache SIS and can be fetched only by a call to {@link #redimension(int, int)}. * diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java index b76e759..daf5272 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/Molodensky.java @@ -292,8 +292,8 @@ public final class Molodensky extends GeocentricAffineBetweenGeographic { } /** - * Tries to set the given parameter values. This method should be invoked only when completing parameters - * without explicit values. This approach complete the work done in {@code DefaultMathTransformFactory}, + * Tries to set the given parameter value. This method should be invoked only when completing parameters + * without explicit values. This approach completes the work done in {@code DefaultMathTransformFactory}, * which already completed the {@code src_semi_major}, {@code src_semi_minor}, {@code tgt_semi_major} and * {@code tgt_semi_minor} parameters. * diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java index d7853bc..a2b8a81 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationFinder.java @@ -34,6 +34,7 @@ import org.opengis.referencing.operation.*; import org.opengis.metadata.Identifier; import org.opengis.metadata.extent.GeographicBoundingBox; import org.opengis.parameter.ParameterValueGroup; +import org.opengis.parameter.ParameterDescriptorGroup; import org.apache.sis.internal.metadata.AxisDirections; import org.apache.sis.internal.referencing.CoordinateOperations; import org.apache.sis.internal.referencing.ReferencingUtilities; @@ -608,8 +609,22 @@ public class CoordinateOperationFinder extends CoordinateOperationRegistry { context.setTarget(normalized); } } else if (identifier == GEOCENTRIC_CONVERSION) { - parameters = (isGeographicToGeocentric ? GeographicToGeocentric.PARAMETERS - : GeocentricToGeographic.PARAMETERS).createValue(); + /* + * Geographic ↔︎ Geocentric conversion. The "dim" parameter is Apache SIS specific but is guaranteed + * to be present since we use SIS parameter descriptors directly. The default number of dimension is 3, + * but we specify the value unconditionally anyway as a safety. + */ + final ParameterDescriptorGroup descriptor; + final GeodeticCRS geographic; + if (isGeographicToGeocentric) { + geographic = sourceCRS; + descriptor = GeographicToGeocentric.PARAMETERS; + } else { + geographic = targetCRS; + descriptor = GeocentricToGeographic.PARAMETERS; + } + parameters = descriptor.createValue(); + parameters.parameter("dim").setValue(geographic.getCoordinateSystem().getDimension()); } else { /* * Coordinate system change (including change in the number of dimensions) without datum shift. diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java index 89986e9..b017868 100644 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/CoordinateOperationFinderTest.java @@ -70,7 +70,7 @@ import static org.apache.sis.test.Assert.*; * Contrarily to {@link CoordinateOperationRegistryTest}, tests in this class are run without EPSG geodetic dataset. * * @author Martin Desruisseaux (Geomatys) - * @version 0.8 + * @version 1.0 * @since 0.7 * @module */ @@ -403,6 +403,36 @@ public final strictfp class CoordinateOperationFinderTest extends MathTransformT } /** + * Tests conversion from geographic to geocentric coordinate reference system and conversely. + * Both two-dimensional and three-dimensional cases are tested. + * + * @throws FactoryException if the operation can not be created. + * + * @see <a href="https://issues.apache.org/jira/browse/SIS-376">SIS-376</a> + */ + @Test + public void testGeocentricConversions() throws FactoryException { + testGeocentricConversion(HardCodedCRS.WGS84_3D, HardCodedCRS.GEOCENTRIC); + testGeocentricConversion(HardCodedCRS.WGS84, HardCodedCRS.GEOCENTRIC); + testGeocentricConversion(HardCodedCRS.GEOCENTRIC, HardCodedCRS.WGS84_3D); + testGeocentricConversion(HardCodedCRS.GEOCENTRIC, HardCodedCRS.WGS84); + } + + /** + * Tests a single case of Geographic ↔︎ Geocentric conversions. + */ + private void testGeocentricConversion(final CoordinateReferenceSystem sourceCRS, + final CoordinateReferenceSystem targetCRS) + throws FactoryException + { + final CoordinateOperation operation = finder.createOperation(sourceCRS, targetCRS); + assertSame ("sourceCRS", sourceCRS, operation.getSourceCRS()); + assertSame ("targetCRS", targetCRS, operation.getTargetCRS()); + assertEquals ("name", "Geocentric conversion", operation.getName().getCode()); + assertInstanceOf("operation", Conversion.class, operation); + } + + /** * Tests conversion from a geographic to a projected CRS without datum of axis changes. * * @throws ParseException if a CRS used in this test can not be parsed.