/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.kml.sequence;
import java.util.NoSuchElementException;
import org.geoserver.kml.utils.KmlCentroidBuilder;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.collection.DecoratingSimpleFeatureCollection;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeDescriptor;
import org.opengis.feature.type.GeometryDescriptor;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
/**
* Wraps a generic feature collection and returns a collection whose feature geometries
* are the centroids of the original features
*
* @author Andrea Aime - GeoSolutions
*/
class KMLCentroidFeatureCollection extends DecoratingSimpleFeatureCollection {
private SimpleFeatureType schema;
protected KMLCentroidFeatureCollection(
FeatureCollection<SimpleFeatureType, SimpleFeature> delegate) {
super(delegate);
// build the centroid collection schema
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
for (AttributeDescriptor ad : delegate.getSchema().getAttributeDescriptors()) {
if (ad instanceof GeometryDescriptor) {
GeometryDescriptor gd = (GeometryDescriptor) ad;
Class<?> binding = ad.getType().getBinding();
if (Point.class.isAssignableFrom(binding)) {
tb.add(ad);
} else {
tb.minOccurs(ad.getMinOccurs());
tb.maxOccurs(ad.getMaxOccurs());
tb.nillable(ad.isNillable());
tb.add(ad.getLocalName(), Point.class, gd.getCoordinateReferenceSystem());
}
} else {
tb.add(ad);
}
}
tb.setName(delegate.getSchema().getName());
this.schema = tb.buildFeatureType();
}
@Override
public SimpleFeatureIterator features() {
return new KMLCentroidFeatureIterator(delegate.features(), this.schema);
}
static class KMLCentroidFeatureIterator implements SimpleFeatureIterator {
private SimpleFeatureIterator delegate;
private SimpleFeatureBuilder builder;
private KmlCentroidBuilder centroids;
public KMLCentroidFeatureIterator(SimpleFeatureIterator features, SimpleFeatureType schema) {
this.delegate = features;
this.builder = new SimpleFeatureBuilder(schema);
this.centroids = new KmlCentroidBuilder();
}
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public SimpleFeature next() throws NoSuchElementException {
SimpleFeature f = delegate.next();
for (Object attribute : f.getAttributes()) {
if ((attribute instanceof Geometry) &&
!(attribute instanceof Point)) {
Geometry geom = (Geometry) attribute;
Coordinate point = centroids.geometryCentroid(geom);
attribute = geom.getFactory().createPoint(point);
}
builder.add(attribute);
}
return builder.buildFeature(f.getID());
}
@Override
public void close() {
delegate.close();
}
}
}