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:
@@ -195,6 +195,7 @@
|
|||||||
"OpenLayers/Filter/FeatureId.js",
|
"OpenLayers/Filter/FeatureId.js",
|
||||||
"OpenLayers/Filter/Logical.js",
|
"OpenLayers/Filter/Logical.js",
|
||||||
"OpenLayers/Filter/Comparison.js",
|
"OpenLayers/Filter/Comparison.js",
|
||||||
|
"OpenLayers/Filter/Spatial.js",
|
||||||
"OpenLayers/Format.js",
|
"OpenLayers/Format.js",
|
||||||
"OpenLayers/Format/XML.js",
|
"OpenLayers/Format/XML.js",
|
||||||
"OpenLayers/Format/GML.js",
|
"OpenLayers/Format/GML.js",
|
||||||
|
|||||||
109
lib/OpenLayers/Filter/Spatial.js
Normal file
109
lib/OpenLayers/Filter/Spatial.js
Normal 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
78
tests/Filter/Spatial.html
Normal 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>
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
<li>Filter/Comparison.html</li>
|
<li>Filter/Comparison.html</li>
|
||||||
<li>Filter/FeatureId.html</li>
|
<li>Filter/FeatureId.html</li>
|
||||||
<li>Filter/Logical.html</li>
|
<li>Filter/Logical.html</li>
|
||||||
|
<li>Filter/Spatial.html</li>
|
||||||
<li>Format.html</li>
|
<li>Format.html</li>
|
||||||
<li>Format/GeoJSON.html</li>
|
<li>Format/GeoJSON.html</li>
|
||||||
<li>Format/GeoRSS.html</li>
|
<li>Format/GeoRSS.html</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user