Author: aaime Date: 2012-03-04 03:05:40 -0800 (Sun, 04 Mar 2012) New Revision: 38605 Modified: trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/AuthorityBackedFactory.java trunk/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java Log: [GEOT-4054] When axis flipping is involved AuthorityBackedFactory may not return an operation between the specified source and target crs Modified: trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/AuthorityBackedFactory.java =================================================================== --- trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/AuthorityBackedFactory.java 2012-03-04 11:04:51 UTC (rev 38604) +++ trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/AuthorityBackedFactory.java 2012-03-04 11:05:40 UTC (rev 38605) @@ -35,6 +35,7 @@ import org.geotools.factory.OptionalFactory; import org.geotools.factory.FactoryRegistryException; import org.geotools.referencing.AbstractIdentifiedObject; +import org.geotools.referencing.CRS; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.factory.BackingStoreException; import org.geotools.resources.i18n.Loggings; @@ -369,7 +370,12 @@ throws FactoryException { if ((prepend == null || prepend.isIdentity()) && (append == null || append.isIdentity())) { - return operation; + if(!CRS.equalsIgnoreMetadata(sourceCRS, operation.getSourceCRS()) || + !CRS.equalsIgnoreMetadata(targetCRS, operation.getTargetCRS())) { + return new ForcedCRSOperation(operation, sourceCRS, targetCRS); + } else { + return operation; + } } final Map<String,?> properties = AbstractIdentifiedObject.getProperties(operation); /* Modified: trunk/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java =================================================================== --- trunk/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java 2012-03-04 11:04:51 UTC (rev 38604) +++ trunk/modules/plugin/epsg-hsql/src/test/java/org/geotools/referencing/CRSTest.java 2012-03-04 11:05:40 UTC (rev 38605) @@ -32,6 +32,8 @@ import org.opengis.referencing.cs.CoordinateSystemAxis; import org.opengis.referencing.crs.CRSAuthorityFactory; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.CoordinateOperation; +import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.MathTransform; import org.geotools.factory.Hints; @@ -439,4 +441,21 @@ assertEquals(20000, src[0], 0.001); assertEquals(10000, src[1], 0.001); } + + public void testOperationSourceTarget() throws Exception{ + // flip one way + CoordinateReferenceSystem source = CRS.decode("EPSG:32638", true); // lon/lat + CoordinateReferenceSystem target = CRS.decode("EPSG:4326", false); // lat/lon + CoordinateOperationFactory coordinateOperationFactory = CRS.getCoordinateOperationFactory(true); + CoordinateOperation co = coordinateOperationFactory.createOperation(source, target); + assertEquals(source, co.getSourceCRS()); + assertEquals(target, co.getTargetCRS()); + + // flip the other + source = CRS.decode("EPSG:32638", false); // lat/lon + target = CRS.decode("EPSG:4326", true); // lon/lat + co = coordinateOperationFactory.createOperation(source, target); + assertEquals(source, co.getSourceCRS()); + assertEquals(target, co.getTargetCRS()); + } } |