private static BBOX merge( BBOX bbox1, BBOX bbox2 ) { // TODO handle different SRS Envelope env = bbox1.getBoundingBox().merge( bbox2.getBoundingBox() ); Expression expr = bbox1.getParam1(); if ( expr == null || !expr.equals( bbox2.getParam1() ) ) { expr = null; } return new BBOX( expr, env ); }
@Override public <T> boolean evaluate( T obj, XPathEvaluator<T> xpathEvaluator ) throws FilterEvaluationException { Expression param1 = getParam1(); if ( param1 != null ) { for ( TypedObjectNode paramValue : param1.evaluate( obj, xpathEvaluator ) ) { Geometry param1Value = checkGeometryOrNull( paramValue ); if ( param1Value != null ) { Envelope transformedBBox = (Envelope) getCompatibleGeometry( param1Value, param2 ); return transformedBBox.intersects( param1Value ); } } } else if ( obj instanceof Feature ) { // handle the case where the property name is empty Feature f = (Feature) obj; Envelope env = f.getEnvelope(); if ( env != null ) { Envelope transformedBBox = (Envelope) getCompatibleGeometry( env, param2 ); return transformedBBox.intersects( env ); } } else { LOG.warn( "Evaluating BBOX on non-Feature object and property name not specified." ); } return false; }
try { if ( looseBBox != null ) { final OperatorFilter bboxFilter = new OperatorFilter( new BBOX( looseBBox ) ); blobWb = getWhereBuilderBlob( bboxFilter, conn );
case BBOX: BBOX bbox = (BBOX) op; Envelope env = bbox.getBoundingBox(); Envelope newEnv = gf.createEnvelope( env.getMin().get0(), env.getMin().get1(), env.getMax().get0(), env.getMax().get0(), env.getCoordinateSystem() ); return new BBOX( copy( bbox.getPropName() ), newEnv ); case BEYOND: Beyond beyond = (Beyond) op;
/** * Tries to extract an {@link Envelope} from the query {@link Filter} that can be used as a pre-filtering step to * narrow the result set. * <p> * The returned {@link Envelope} is determined by the following strategy: * <ul> * <li>If the filter is an {@link OperatorFilter}, it is attempted to extract an {@link BBOX} constraint from it.</li> * <li>If no {@link BBOX} constraint can be extracted from the filter (not presented or nested in <code>Or</code> or * <code>Not</code> expressions, <code>null</code> is returned.</li> * </ul> * </p> * * @return a {@link Envelope} suitable for pre-filtering feature candidates, can be <code>null</code> */ public Envelope getPrefilterBBoxEnvelope() { BBOX bbox = extractPrefilterBBoxConstraint( filter ); if ( bbox == null ) { return null; } return bbox.getBoundingBox(); }
propertyName = ( (BBOX) operator ).getPropName(); geometry = ( (BBOX) operator ).getBoundingBox(); break; case BEYOND:
case BBOX: { BBOX bbox = (BBOX) op; if ( !bbox.getAllowFalsePositives() ) { builder.add( " (" ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); if ( !bbox.getAllowFalsePositives() ) { builder.add( " AND " ); if ( useLegacyPredicates ) { builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( "))" );
BBOX bboxOperator = new BBOX( propName, bbox, allowFalsePositives ); if ( filter == null ) { bboxFilter = new OperatorFilter( bboxOperator );
/** * @param filter * can be null * @return the reverse of #addBBoxConstraint */ public static Pair<Filter, Envelope> splitOffBBoxConstraint( Filter filter ) { Pair<Filter, Envelope> p = new Pair<Filter, Envelope>(); if ( filter instanceof OperatorFilter ) { OperatorFilter f = (OperatorFilter) filter; if ( f.getOperator() instanceof BBOX ) { p.second = ( (BBOX) f.getOperator() ).getBoundingBox(); } else if ( f.getOperator() instanceof And && ( (And) f.getOperator() ).getParams()[0] instanceof BBOX ) { Operator[] ops = ( (And) f.getOperator() ).getParams(); p.second = ( (BBOX) ops[0] ).getBoundingBox(); if ( ops.length == 2 ) { p.first = new OperatorFilter( ops[1] ); } else { p.first = new OperatorFilter( new And( Arrays.copyOfRange( ops, 1, ops.length - 1 ) ) ); } } else { p.first = filter; } } else { p.first = filter; } return p; }
private static BBOX extractBBox( SpatialOperator oper ) { SubType type = oper.getSubType(); switch ( type ) { case BBOX: return (BBOX) oper; case CONTAINS: // Oracle does not like zero-extent bboxes if ( !( ( (Contains) oper ).getGeometry() instanceof Point ) ) return new BBOX( ( (Contains) oper ).getParam1(), ( (Contains) oper ).getGeometry().getEnvelope() ); return null; case CROSSES: return new BBOX( ( (Crosses) oper ).getParam1(), ( (Crosses) oper ).getGeometry().getEnvelope() ); case DWITHIN: // TOOD use enlarged bbox return null; case EQUALS: return new BBOX( ( (Equals) oper ).getParam1(), ( (Equals) oper ).getGeometry().getEnvelope() ); case INTERSECTS: return new BBOX( ( (Intersects) oper ).getParam1(), ( (Intersects) oper ).getGeometry().getEnvelope() ); case OVERLAPS: return new BBOX( ( (Overlaps) oper ).getParam1(), ( (Overlaps) oper ).getGeometry().getEnvelope() ); case WITHIN: return new BBOX( ( (Within) oper ).getParam1(), ( (Within) oper ).getGeometry().getEnvelope() ); default: { return null; } } }
switch ( operator.getSubType() ) { case BBOX: geometry = ( (BBOX) operator ).getBoundingBox(); break; case BEYOND:
spatialOperator = new BBOX( param1, (Envelope) param2 ); break;
BBOX bbox = (BBOX) op; builder.add( propNameExpr ).add( ".STIntersects(" ); builder.add( toProtoSQL( bbox.getBoundingBox(), storageCRS, srid ) ); builder.add( ")=1" ); break;
return new BBOX( (Expression) os[0], (Envelope) os[1] ); case BEYOND: Beyond b = (Beyond) o;
spatialOperator = new BBOX( param1, param2 ); break;
spatialOperator = new BBOX( param1, param2 ); break;
BBOX bboxOperator = new BBOX( bbox ); filter = new OperatorFilter( bboxOperator ); } else if ( wfsQuery instanceof FeatureIdQuery ) {