diff --git a/src/ol/expression/expression.js b/src/ol/expression/expression.js index dd2cc27e2b..a773b6cd8f 100644 --- a/src/ol/expression/expression.js +++ b/src/ol/expression/expression.js @@ -1,6 +1,10 @@ goog.provide('ol.expression'); +goog.require('ol.Extent'); +goog.require('ol.Feature'); goog.require('ol.expression.Parser'); +goog.require('ol.extent'); +goog.require('ol.geom.GeometryType'); /** @@ -13,3 +17,49 @@ ol.expression.parse = function(source) { var parser = new ol.expression.Parser(); return parser.parse(source); }; + + +/** + * Library of well-known functions. These are available to expressions parsed + * with `ol.expression.parse`. + * + * @type {Object} + */ +ol.expression.lib = { + + /** + * Determine if a feature's extent intersects the provided extent. + * @param {number} minX Minimum x-coordinate value. + * @param {number} maxX Maximum x-coordinate value. + * @param {number} minY Minimum y-coordinate value. + * @param {number} maxY Maximum y-coordinate value. + * @return {boolean} The provided extent intersects the feature's extent. + * @this {ol.Feature} + */ + 'extent': function(minX, maxX, minY, maxY) { + var intersects = false; + var geometry = this.getGeometry(); + if (geometry) { + intersects = ol.extent.intersects(geometry.getBounds(), + [minX, maxX, minY, maxY]); + } + return intersects; + }, + + + /** + * Determine if a feature's default geometry is of the given type. + * @param {ol.geom.GeometryType} type Geometry type. + * @return {boolean} The feature's default geometry is of the given type. + * @this {ol.Feature} + */ + 'geometryType': function(type) { + var same = false; + var geometry = this.getGeometry(); + if (geometry) { + same = geometry.getType() === type; + } + return same; + } + +}; diff --git a/test/spec/ol/expression/expression.test.js b/test/spec/ol/expression/expression.test.js index 1c73a46ee5..d29700f31b 100644 --- a/test/spec/ol/expression/expression.test.js +++ b/test/spec/ol/expression/expression.test.js @@ -522,6 +522,48 @@ describe('ol.expression.parse', function() { }); +describe('ol.expression.lib', function() { + + var lib = ol.expression.lib; + var parse = ol.expression.parse; + + function evaluate(expression, feature) { + return expression.evaluate(feature.getAttributes(), lib, feature); + } + + describe('extent()', function() { + + var nw = new ol.Feature({ + geom: new ol.geom.Polygon([[ + [-180, 90], [0, 90], [0, 0], [-180, 0], [-180, 90] + ]]) + }); + + var se = new ol.Feature({ + geom: new ol.geom.Polygon([[ + [180, -90], [0, -90], [0, 0], [180, 0], [180, -90] + ]]) + }); + + var north = parse('extent(-100, 100, 40, 60)'); + var south = parse('extent(-100, 100, -60, -40)'); + var east = parse('extent(80, 100, -50, 50)'); + var west = parse('extent(-100, -80, -50, 50)'); + + expect(evaluate(north, nw), true); + expect(evaluate(south, nw), false); + expect(evaluate(east, nw), false); + expect(evaluate(west, nw), true); + + expect(evaluate(north, se), false); + expect(evaluate(south, se), true); + expect(evaluate(east, se), true); + expect(evaluate(west, se), false); + + }); + +}); + goog.require('ol.expression'); goog.require('ol.expression.Call');