Index: CRS.java =================================================================== --- CRS.java (revision 31482) +++ CRS.java (working copy) @@ -16,6 +16,9 @@ */ package org.geotools.referencing; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Set; import java.util.Map; import java.util.HashSet; @@ -35,8 +38,11 @@ import org.opengis.referencing.crs.*; import org.opengis.referencing.datum.*; import org.opengis.referencing.operation.*; +import org.opengis.referencing.cs.AxisDirection; +import static org.opengis.referencing.cs.AxisDirection.*; import org.opengis.referencing.cs.CoordinateSystem; import org.opengis.referencing.cs.CoordinateSystemAxis; +import org.opengis.referencing.cs.EllipsoidalCS; import org.opengis.referencing.operation.CoordinateOperation; import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.MathTransform; @@ -57,6 +63,8 @@ import org.geotools.geometry.GeneralDirectPosition; import org.geotools.metadata.iso.citation.Citations; import org.geotools.metadata.iso.extent.GeographicBoundingBoxImpl; +import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.geotools.referencing.cs.DefaultEllipsoidalCS; import org.geotools.referencing.factory.AbstractAuthorityFactory; import org.geotools.referencing.factory.IdentifiedObjectFinder; import org.geotools.referencing.operation.projection.MapProjection; @@ -597,6 +605,31 @@ } } } + if(crs instanceof DefaultGeographicCRS && crs.getCoordinateSystem().getDimension() > 2) { + DefaultGeographicCRS originalCRS = (DefaultGeographicCRS) crs; + EllipsoidalCS originalCS = originalCRS.getCoordinateSystem(); + + // extract the horizontal axis using a list of known horizontal directions + List flatAxis = new ArrayList(); + Set flatDirections = new HashSet( + Arrays.asList(NORTH, NORTH_EAST, NORTH_NORTH_EAST, NORTH_NORTH_WEST, NORTH_WEST, + SOUTH, SOUTH_EAST, SOUTH_WEST, SOUTH_SOUTH_EAST, SOUTH_SOUTH_WEST, + EAST, EAST_NORTH_EAST, EAST_SOUTH_EAST, + WEST_NORTH_WEST, WEST_SOUTH_WEST)); + for (int i = 0; i < originalCS.getDimension(); i++) { + CoordinateSystemAxis axis = originalCS.getAxis(i); + if(flatDirections.contains(axis.getDirection())) + flatAxis.add(axis); + } + + // build the derivative CS and CRS... not sure what to make of the original properties... + if(flatAxis.size() != 2) + throw new IllegalArgumentException("Cannot extract flat component, there are " + + flatAxis.size() + " axis recognized as 'flat', expected 2"); + EllipsoidalCS flatCS = null; + flatCS = new DefaultEllipsoidalCS(originalCS.getName().getCode() + "_2d", flatAxis.get(0), flatAxis.get(1)); + return new DefaultGeographicCRS(originalCRS.getName().getCode() + "_2d", originalCRS.getDatum(), flatCS); + } return null; }