package jeql.std.aggfunction; import java.util.ArrayList; import java.util.Collection; import java.util.List; import jeql.api.function.AggregateFunction; import jeql.api.function.Aggregator; import jeql.engine.Scope; import jeql.std.geom.GeomFunction; import com.vividsolutions.jts.algorithm.ConvexHull; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateArrays; import com.vividsolutions.jts.geom.CoordinateFilter; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; public class GeomConvexHullAggFunction implements AggregateFunction { public GeomConvexHullAggFunction() { } public void bind(Scope scope, List args) { } public String getName() { return "GeomConvexHull"; } public Class getType() { return Geometry.class; } public Aggregator createAggregator() { return new GeomConvexHullAggregator(); } private static class GeomConvexHullAggregator implements Aggregator { private GeometryFactory fact = null; private List pts = new ArrayList(); private CoordinateExtracter coordExtracter = new CoordinateExtracter(pts); public void addValue(Object obj) { ((Geometry) obj).apply(coordExtracter); } public Object getResult() { if (fact == null) fact = GeomFunction.geomFactory; Coordinate[] coords = CoordinateArrays.toCoordinateArray(pts); ConvexHull convexHull = new ConvexHull(coords, fact); return convexHull.getConvexHull(); } } private static class CoordinateExtracter implements CoordinateFilter { private Collection coords; public CoordinateExtracter(Collection coords) { this.coords = coords; } public void filter(Coordinate coord) { coords.add(coord); } } }