/*
* 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.util;
import org.geotools.factory.Hints;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.WKTReader;
/**
* Converter factory performing converstions among geometric types.
* <p>
* Supported conversions:
* <ul>
* <li>{@link String} to {@link com.vividsolutions.jts.geom.Geometry}
* <li>{@link com.vividsolutions.jts.geom.Geometry} to {@link String}
* <li>{@link com.vividsolutions.jts.geom.Envelope} to {@link com.vividsolutions.jts.geom.Geometry}
* <li>{@link com.vividsolutions.jts.geom.Geometry} to {@link com.vividsolutions.jts.geom.Envelope}
* <li>
* </ul>
* </p>
* @author Justin Deoliveira, The Open Planning Project
* @since 2.4
*
* @source $URL$
*/
public class GeometryConverterFactory implements ConverterFactory {
public Converter createConverter(Class source, Class target, Hints hints) {
if ( Geometry.class.isAssignableFrom( target ) ) {
//String to Geometry
if ( String.class.equals( source ) ) {
return new Converter() {
public Object convert(Object source, Class target) throws Exception {
return new WKTReader().read( (String) source );
}
};
}
//Envelope to Geometry
if ( Envelope.class.isAssignableFrom( source ) ) {
return new Converter() {
public Object convert(Object source, Class target) throws Exception {
Envelope e = (Envelope) source;
GeometryFactory factory = new GeometryFactory();
return factory.createPolygon(
factory.createLinearRing(
new Coordinate[] {
new Coordinate( e.getMinX(), e.getMinY() ),
new Coordinate( e.getMaxX(), e.getMinY() ),
new Coordinate( e.getMaxX(), e.getMaxY() ),
new Coordinate( e.getMinX(), e.getMaxY() ),
new Coordinate( e.getMinX(), e.getMinY() )
}
), null
);
}
};
}
}
if ( Geometry.class.isAssignableFrom( source ) ) {
//Geometry to envelope
if ( Envelope.class.equals( target ) ) {
return new Converter() {
public Object convert(Object source, Class target) throws Exception {
Geometry geometry = (Geometry) source;
return geometry.getEnvelopeInternal();
}
};
}
//Geometry to String
if ( String.class.equals( target ) ) {
return new Converter() {
public Object convert(Object source, Class target) throws Exception {
Geometry geometry = (Geometry) source;
return geometry.toText();
}
};
}
}
return null;
}
}