/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2008 - 2010, Geomatys
*
* 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.geotoolkit.display2d.primitive.jts;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.MultiPolygon;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
/**
* A thin wrapper that adapts a JTS geometry to the Shape interface so that the geometry can be used
* by java2d without coordinate cloning.
*
* @author Johann Sorel (Puzzle-GIS)
* @version 2.9
* @module
*/
public class JTSGeometryJ2D extends AbstractJTSGeometryJ2D<Geometry> {
protected JTSGeometryIterator<? extends Geometry> iterator = null;
public JTSGeometryJ2D(final Geometry geom) {
super(geom);
}
/**
* Creates a new GeometryJ2D object.
*
* @param geom - the wrapped geometry
*/
public JTSGeometryJ2D(final Geometry geom, final AffineTransform trs) {
super(geom, trs);
}
/**
* Sets the geometry contained in this lite shape. Convenient to reuse this
* object instead of creating it again and again during rendering
*
* @param g
*/
@Override
public void setGeometry(final Geometry g) {
super.setGeometry(g);
//change iterator only if necessary
if(iterator != null && geometry != null){
if (this.geometry.isEmpty() && iterator instanceof JTSEmptyIterator) {
//nothing to do
}else if (this.geometry instanceof Point && iterator instanceof JTSPointIterator) {
((JTSPointIterator)iterator).setGeometry((Point)geometry);
} else if (this.geometry instanceof Polygon && iterator instanceof JTSPolygonIterator) {
((JTSPolygonIterator)iterator).setGeometry((Polygon)geometry);
} else if (this.geometry instanceof LineString && iterator instanceof JTSLineIterator) {
((JTSLineIterator)iterator).setGeometry((LineString)geometry);
} else if (this.geometry instanceof GeometryCollection && iterator instanceof JTSGeomCollectionIterator) {
((JTSGeomCollectionIterator)iterator).setGeometry((GeometryCollection)geometry);
}else{
//iterator does not match the new geometry type
iterator = null;
}
}
}
/**
* {@inheritDoc }
*/
@Override
public PathIterator getPathIterator(final AffineTransform at) {
final AffineTransform concat;
if(at == null){
concat = transform;
}else{
concat = (AffineTransform) transform.clone();
concat.preConcatenate(at);
}
if(iterator == null){
if (this.geometry.isEmpty()) {
iterator = JTSEmptyIterator.INSTANCE;
}else if (this.geometry instanceof Point) {
iterator = new JTSPointIterator((Point) geometry, concat);
} else if (this.geometry instanceof Polygon) {
iterator = new JTSPolygonIterator((Polygon) geometry, concat);
} else if (this.geometry instanceof LineString) {
iterator = new JTSLineIterator((LineString)geometry, concat);
} else if (this.geometry instanceof GeometryCollection) {
iterator = new JTSGeomCollectionIterator((GeometryCollection)geometry,concat);
}
}else{
iterator.setTransform(concat);
}
return iterator;
}
@Override
public AbstractJTSGeometryJ2D clone() {
return new JTSGeometryJ2D(this.geometry,this.transform);
}
public static AbstractJTSGeometryJ2D best(final Class clazz, final AffineTransform trs){
if(Point.class.isAssignableFrom(clazz)){
return new JTSGeometryJ2D(null,trs);
}else if(MultiPoint.class.isAssignableFrom(clazz)){
return new JTSGeometryJ2D(null,trs);
}else if(LineString.class.isAssignableFrom(clazz)){
return new JTSGeometryJ2D(null,trs);
}else if(MultiLineString.class.isAssignableFrom(clazz)){
return new JTSMultiLineStringJ2D(null,trs);
}else if(Polygon.class.isAssignableFrom(clazz)){
return new JTSGeometryJ2D(null,trs);
}else if(MultiPolygon.class.isAssignableFrom(clazz)){
return new JTSGeometryJ2D(null,trs);
}else if(Geometry.class.isAssignableFrom(clazz)){
//undeterminated type
return new JTSGeometryJ2D(null,trs);
}
throw new IllegalArgumentException("Unexpected geometry class : " + clazz);
}
}