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
*/
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;
}
}