Package org.geoserver.filter.function

Source Code of org.geoserver.filter.function.CollectGeometriesFunction

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
*/
package org.geoserver.filter.function;

import java.util.Iterator;
import java.util.List;

import org.geotools.filter.FunctionImpl;
import org.geotools.filter.capability.FunctionNameImpl;
import org.geotools.geometry.jts.GeometryCollector;
import org.opengis.feature.type.Name;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Literal;

import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;

/**
* Collects all geometries provided in a list into a single {@link GeometryCollection} object (a
* type specific subclass of it if possible)
*
* @author Andrea Aime - GeoSolutions
*
*/
public class CollectGeometriesFunction extends FunctionImpl {

    long maxCoordinates;

    public CollectGeometriesFunction(Name name, List<Expression> args, Literal fallback, long maxCoordinates) {
        functionName = new FunctionNameImpl(name, args != null ? args.size() : -1);
        setName(name.getLocalPart());
        setFallbackValue(fallback);
        setParameters(args);
        this.maxCoordinates = maxCoordinates;

        if (args.size() != 1) {
            throw new IllegalArgumentException("CollectGeometries function requires a single"
                    + " argument, a collection of geometries");
        }
    }

    public Object evaluate(Object object) {
        List geometries = getParameters().get(0).evaluate(object, List.class);
        if (geometries == null || geometries.size() == 0) {
            return new GeometryCollection(null, new GeometryFactory());
        }

        // collect but don't clone, unfortunately we're already stuck with a list, by cloning
        // we'd just increase memory usage
        GeometryCollector collector = new GeometryCollector();
        collector.setFactory(null);
        collector.setMaxCoordinates(maxCoordinates);
        for (Iterator it = geometries.iterator(); it.hasNext();) {
            Geometry geometry = (Geometry) it.next();
            collector.add(geometry);
        }

        return collector.collect();
    }

}
TOP

Related Classes of org.geoserver.filter.function.CollectGeometriesFunction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.