/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-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.data.store; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.geotools.factory.FactoryRegistryException; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.geometry.jts.GeometryCoordinateSequenceTransformer; import org.geotools.referencing.ReferencingFactoryFinder; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransform2D; import org.opengis.referencing.operation.OperationNotFoundException; import org.opengis.referencing.operation.TransformException; import com.vividsolutions.jts.geom.Geometry; public class ReprojectingIterator implements Iterator { /** * decorated iterator */ Iterator delegate; /** * The target coordinate reference system */ CoordinateReferenceSystem target; /** * schema of reprojected features */ SimpleFeatureType schema; /** * Transformer */ GeometryCoordinateSequenceTransformer tx; public ReprojectingIterator( Iterator delegate, MathTransform transform, SimpleFeatureType schema, GeometryCoordinateSequenceTransformer transformer ) throws OperationNotFoundException, FactoryRegistryException, FactoryException { this.delegate = delegate; this.schema = schema; tx = transformer; tx.setMathTransform((MathTransform2D) transform); } public ReprojectingIterator( Iterator delegate, CoordinateReferenceSystem source, CoordinateReferenceSystem target, SimpleFeatureType schema, GeometryCoordinateSequenceTransformer transformer ) throws OperationNotFoundException, FactoryRegistryException, FactoryException { this.delegate = delegate; this.target = target; this.schema = schema; tx = transformer; MathTransform transform = ReferencingFactoryFinder.getCoordinateOperationFactory( null).createOperation(source, target).getMathTransform(); tx.setMathTransform((MathTransform2D) transform); } public Iterator getDelegate() { return delegate; } public void remove() { delegate.remove(); } public boolean hasNext() { return delegate.hasNext(); } public Object next() { SimpleFeature feature = (SimpleFeature) delegate.next(); try { return reproject(feature); } catch (IOException e) { throw new RuntimeException(e); } } SimpleFeature reproject(SimpleFeature feature) throws IOException { List attributes = feature.getAttributes(); for (int i = 0; i < attributes.size(); i++) { Object object = attributes.get(i); if (object instanceof Geometry) { // do the transformation Geometry geometry = (Geometry) object; try { attributes.set(i, tx.transform(geometry)); } catch (TransformException e) { String msg = "Error occured transforming " + geometry.toString(); throw (IOException) new IOException(msg).initCause(e); } } } try { return SimpleFeatureBuilder.build(schema, attributes, feature.getID()); } catch (IllegalAttributeException e) { String msg = "Error creating reprojeced feature"; throw (IOException) new IOException(msg).initCause(e); } } }