package org.geotools.filter.function;
import org.geotools.filter.visitor.DefaultFilterVisitor;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Function;
/**
* Given an original rendering envelope it visits an expression, finds all
* {@link GeometryTransformation}, collects and merges all the returned query envelopes
*
* @source $URL: http://svn.osgeo.org/geotools/branches/2.7.x/build/maven/javadoc/../../../modules/library/main/src/main/java/org/geotools/filter/function/GeometryTransformationVisitor.java $
*/
public class GeometryTransformationVisitor extends DefaultFilterVisitor {
public GeometryTransformationVisitor() {
}
@Override
public Object visit(Function expression, Object data) {
// drill down and merge
ReferencedEnvelope merged = new ReferencedEnvelope((ReferencedEnvelope) data);
for(Expression param : expression.getParameters()) {
ReferencedEnvelope result = (ReferencedEnvelope) param.accept(this, data);
if(result != null)
merged.expandToInclude(result);
}
// apply the current function is possible
if (expression instanceof GeometryTransformation) {
merged = ((GeometryTransformation) expression).invert(merged);
}
return merged;
}
}