Adding OpenLayers.Filter.Spatial. Thanks to bartvde for the original patch. Thanks elemoine for adding the evaluate method and test. I'm putting this in so we can move on some other tickets. r=me (closes #1719)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@7952 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2008-09-04 20:52:05 +00:00
parent c83403fa67
commit 89cc9f157f
4 changed files with 189 additions and 0 deletions

View File

@@ -195,6 +195,7 @@
"OpenLayers/Filter/FeatureId.js",
"OpenLayers/Filter/Logical.js",
"OpenLayers/Filter/Comparison.js",
"OpenLayers/Filter/Spatial.js",
"OpenLayers/Format.js",
"OpenLayers/Format/XML.js",
"OpenLayers/Format/GML.js",

View File

@@ -0,0 +1,109 @@
/* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD
* license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the
* full text of the license. */
/**
* @requires OpenLayers/Filter.js
*/
/**
* Class: OpenLayers.Filter.Spatial
* This class represents a spatial filter.
* Currently implemented: BBOX, DWithin and Intersects
*
* Inherits from
* - <OpenLayers.Filter>
*/
OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
/**
* APIProperty: type
* {String} Type of spatial filter.
*
* The type should be one of:
* - OpenLayers.Filter.Spatial.BBOX
* - OpenLayers.Filter.Spatial.INTERSECTS
* - OpenLayers.Filter.Spatial.DWITHIN
*/
type: null,
/**
* APIProperty: property
* {String} Name of the context property to compare.
*/
property: null,
/**
* APIProperty: value
* {<OpenLayers.Bounds> || <OpenLayers.Geometry>} The bounds or geometry
* to be used by the filter. Use bounds for BBOX filters and geometry
* for INTERSECTS or DWITHIN filters.
*/
value: null,
/**
* APIProperty: distance
* {Number} The distance to use in a DWithin spatial filter.
*/
distance: null,
/**
* APIProperty: distanceUnits
* {String} The units to use for the distance, e.g. 'm'.
*/
distanceUnits: null,
/**
* Constructor: OpenLayers.Filter.Spatial
* Creates a spatial filter.
*
* Parameters:
* options - {Object} An optional object with properties to set on the
* filter.
*
* Returns:
* {<OpenLayers.Filter.Spatial>}
*/
initialize: function(options) {
OpenLayers.Filter.prototype.initialize.apply(this, [options]);
},
/**
* Method: evaluate
* Evaluates this filter for a specific feature.
*
* Parameters:
* feature - {<OpenLayers.Feature.Vector>} feature to apply the filter to.
*
* Returns:
* {Boolean} The feature meets filter criteria.
*/
evaluate: function(feature) {
var intersect = false;
switch(this.type) {
case OpenLayers.Filter.Spatial.BBOX:
case OpenLayers.Filter.Spatial.INTERSECTS:
if(feature.geometry) {
var geom = this.value;
if(this.value.CLASS_NAME == "OpenLayers.Bounds") {
geom = this.value.toGeometry();
}
if(feature.geometry.intersects(geom)) {
intersect = true;
}
}
break;
default:
OpenLayers.Console.error(
OpenLayers.i18n("filterEvaluateNotImplemented"));
break;
}
return intersect;
},
CLASS_NAME: "OpenLayers.Filter.Spatial"
});
OpenLayers.Filter.Spatial.BBOX = "BBOX";
OpenLayers.Filter.Spatial.INTERSECTS = "INTERSECTS";
OpenLayers.Filter.Spatial.DWITHIN = "DWITHIN";

78
tests/Filter/Spatial.html Normal file
View File

@@ -0,0 +1,78 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script type="text/javascript">
function test_constructor(t) {
t.plan(3);
var options = {'foo': 'bar'};
var filter = new OpenLayers.Filter.Spatial(options);
t.ok(filter instanceof OpenLayers.Filter.Spatial,
"new OpenLayers.Filter.Spatial returns object" );
t.eq(filter.foo, "bar", "constructor sets options correctly");
t.eq(typeof filter.evaluate, "function", "filter has an evaluate function");
}
function test_destroy(t) {
t.plan(1);
var filter = new OpenLayers.Filter.Spatial();
filter.destroy();
t.eq(filter.symbolizer, null, "symbolizer hash nulled properly");
}
function test_evaluate(t) {
t.plan(4);
var filer, feature, res, geom, bounds;
bounds = new OpenLayers.Bounds(0, 0, 10, 10);
filter = new OpenLayers.Filter.Spatial({
type: OpenLayers.Filter.Spatial.BBOX,
value: bounds
});
// 1 test
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(2, 2));
res = filter.evaluate(feature);
t.eq(res, true,
"evaluates returns correct value when feature intersects bounds");
// 1 test
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(20, 20));
res = filter.evaluate(feature);
t.eq(res, false,
"evaluates returns correct value when feature does not intersect bounds");
// 1 test
geom = bounds.toGeometry();
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(2, 2));
filter = new OpenLayers.Filter.Spatial({
type: OpenLayers.Filter.Spatial.INTERSECTS,
value: geom
});
res = filter.evaluate(feature);
t.eq(res, true,
"evaluates returns correct value when feature intersects bounds");
// 1 test
geom = bounds.toGeometry();
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(20, 20));
filter = new OpenLayers.Filter.Spatial({
type: OpenLayers.Filter.Spatial.INTERSECTS,
value: geom
});
res = filter.evaluate(feature);
t.eq(res, false,
"evaluates returns correct value when feature does not intersect bounds");
}
</script>
</head>
<body>
</body>
</html>

View File

@@ -38,6 +38,7 @@
<li>Filter/Comparison.html</li>
<li>Filter/FeatureId.html</li>
<li>Filter/Logical.html</li>
<li>Filter/Spatial.html</li>
<li>Format.html</li>
<li>Format/GeoJSON.html</li>
<li>Format/GeoRSS.html</li>