/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.geometry.jts.coordinatesequence; import org.geotools.geometry.jts.CoordinateSequenceTransformer; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.MismatchedDimensionException; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.impl.CoordinateArraySequence; import com.vividsolutions.jts.geom.impl.PackedCoordinateSequence; /** * A JTS CoordinateSequenceTransformer which transforms the values in place. * <p> * Paragraph ... * </p><p> * Responsibilities: * <ul> * <li> * <li> * </ul> * </p><p> * Example:<pre><code> * InPlaceCoordinateSequenceTransformer x = new InPlaceCoordinateSequenceTransformer( ... ); * TODO code example * </code></pre> * </p> * @author jeichar * @since 0.6.0 * * @source $URL$ */ public class InPlaceCoordinateSequenceTransformer implements CoordinateSequenceTransformer { /** * @see org.geotools.geometry.jts.CoordinateSequenceTransformer#transform(com.vividsolutions.jts.geom.CoordinateSequence, org.opengis.referencing.operation.MathTransform) */ public CoordinateSequence transform( CoordinateSequence cs, MathTransform transform ) throws TransformException { if( cs instanceof PackedCoordinateSequence ){ return transformInternal( (PackedCoordinateSequence) cs, transform); } throw new TransformException(cs.getClass().getName()+" is not a implementation that is known to be transformable in place"); } FlyWeightDirectPosition start=new FlyWeightDirectPosition(2); private CoordinateSequence transformInternal( PackedCoordinateSequence sequence, MathTransform transform ) throws TransformException{ start.setSequence(sequence); for(int i=0; i<sequence.size();i++ ){ start.setOffset(i); try { transform.transform(start, start); } catch (MismatchedDimensionException e) { throw new TransformException( "", e); } } return sequence; } private class FlyWeightDirectPosition implements DirectPosition { PackedCoordinateSequence sequence; int offset=0; private int dimension; /** * Construct <code>InPlaceCoordinateSequenceTransformer.FlyWeightDirectPosition</code>. * */ public FlyWeightDirectPosition(int dim) { dimension=dim; } /** * @param offset The offset to set. */ public void setOffset( int offset ) { this.offset = offset; } /** * @param sequence The sequence to set. */ public void setSequence( PackedCoordinateSequence sequence ) { this.sequence = sequence; } /** * @see org.opengis.geometry.coordinate.DirectPosition#getDimension() */ public int getDimension() { return dimension; } /** * @see org.opengis.geometry.coordinate.DirectPosition#getCoordinates() */ @Deprecated public double[] getCoordinates() { return getCoordinate(); } /** * @see org.opengis.geometry.coordinate.DirectPosition#getCoordinate() */ public double[] getCoordinate() { return new double[]{ sequence.getX(offset), sequence.getY(offset), sequence.getOrdinate(offset, CoordinateSequence.Z)}; } /** * @see org.opengis.geometry.coordinate.DirectPosition#getOrdinate(int) */ public double getOrdinate( int arg0 ) throws IndexOutOfBoundsException { return sequence.getOrdinate(offset, arg0); } /** * @see org.opengis.geometry.coordinate.DirectPosition#setOrdinate(int, double) */ public void setOrdinate( int arg0, double arg1 ) throws IndexOutOfBoundsException { sequence.setOrdinate(offset, arg0, arg1); } /** * @see org.opengis.geometry.coordinate.DirectPosition#getCoordinateReferenceSystem() */ public CoordinateReferenceSystem getCoordinateReferenceSystem() { //TODO implement method body throw new UnsupportedOperationException(); } /** * @see org.opengis.geometry.coordinate.DirectPosition#clone() */ public FlyWeightDirectPosition clone() { throw new UnsupportedOperationException(); } /** * @see org.opengis.geometry.coordinate.Position#getPosition() */ public DirectPosition getPosition() { return this; } /** * @see org.opengis.geometry.coordinate.Position#getDirectPosition() */ public DirectPosition getDirectPosition() { return this; } } }