Give Layer.Vector a method getFeaturesByAttribute, p=marcjansen, r=me (closes #2979)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@10960 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -876,6 +876,36 @@ OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
|
|||||||
getFeatureByFid: function(featureFid) {
|
getFeatureByFid: function(featureFid) {
|
||||||
return this.getFeatureBy('fid', featureFid);
|
return this.getFeatureBy('fid', featureFid);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APIMethod: getFeaturesByAttribute
|
||||||
|
* Returns an array of features that have the given attribute key set to the
|
||||||
|
* given value. Comparison of attribute values takes care of datatypes, e.g.
|
||||||
|
* the string '1234' is not equal to the number 1234.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* attrName - {String}
|
||||||
|
* attrValue - {Mixed}
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* Array(<OpenLayers.Feature.Vector>) An array of features that have the
|
||||||
|
* passed named attribute set to the given value.
|
||||||
|
*/
|
||||||
|
getFeaturesByAttribute: function(attrName, attrValue) {
|
||||||
|
var i,
|
||||||
|
feature,
|
||||||
|
len = this.features.length,
|
||||||
|
foundFeatures = [];
|
||||||
|
for(i = 0; i < len; i++) {
|
||||||
|
feature = this.features[i];
|
||||||
|
if(feature && feature.attributes) {
|
||||||
|
if (feature.attributes[attrName] === attrValue) {
|
||||||
|
foundFeatures.push(feature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return foundFeatures;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unselect the selected features
|
* Unselect the selected features
|
||||||
|
|||||||
@@ -194,6 +194,83 @@
|
|||||||
t.ok(layer.getFeatureBy('fid', 'some_fid_that_does_not_exist') == null,
|
t.ok(layer.getFeatureBy('fid', 'some_fid_that_does_not_exist') == null,
|
||||||
"OpenLayers.Layer.Vector.getFeatureBy('fid', ...) works like getFeatureByFid on non-existing feature fid");
|
"OpenLayers.Layer.Vector.getFeatureBy('fid', ...) works like getFeatureByFid on non-existing feature fid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function test_Layer_Vector_getFeaturesByAttribute(t) {
|
||||||
|
t.plan( 9 );
|
||||||
|
// setup layer
|
||||||
|
var layer = new OpenLayers.Layer.Vector(name);
|
||||||
|
|
||||||
|
// feature_1
|
||||||
|
var geometry_1 = new OpenLayers.Geometry.Point(-28.63, 153.64);
|
||||||
|
var attributes_1 = {
|
||||||
|
humpty: 'dumpty',
|
||||||
|
clazz: 1
|
||||||
|
};
|
||||||
|
var feature_1 = new OpenLayers.Feature.Vector(geometry_1, attributes_1);
|
||||||
|
feature_1.fid = 'f_01'; // to identify later
|
||||||
|
|
||||||
|
// feature_2
|
||||||
|
var geometry_2 = new OpenLayers.Geometry.Point(-27.48, 153.05);
|
||||||
|
var attributes_2 = {
|
||||||
|
// this feature has attribute humpty === undefined
|
||||||
|
clazz: '1'
|
||||||
|
};
|
||||||
|
var feature_2 = new OpenLayers.Feature.Vector(geometry_2, attributes_2);
|
||||||
|
feature_2.fid = 'f_02'; // to identify later
|
||||||
|
|
||||||
|
// feature_3
|
||||||
|
var geometry_3 = new OpenLayers.Geometry.Point(-33.74, 150.3);
|
||||||
|
var attributes_3 = {
|
||||||
|
humpty: 'foobar',
|
||||||
|
clazz: 1
|
||||||
|
};
|
||||||
|
var feature_3 = new OpenLayers.Feature.Vector(geometry_3, attributes_3);
|
||||||
|
feature_3.fid = 'f_03'; // to identify later
|
||||||
|
|
||||||
|
// Tests
|
||||||
|
|
||||||
|
// don't find anything... no features added
|
||||||
|
// 1 test
|
||||||
|
t.ok(layer.getFeaturesByAttribute('humpty', 'dumpty').length === 0,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns an empty array while the layer is empty");
|
||||||
|
|
||||||
|
layer.addFeatures([feature_1, feature_2, feature_3]);
|
||||||
|
|
||||||
|
// simple use case: find 1 feature with an attribute and matching value
|
||||||
|
// 2 tests
|
||||||
|
var dumptyResults = layer.getFeaturesByAttribute('humpty', 'dumpty');
|
||||||
|
t.ok(dumptyResults.length === 1,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns an array with one feature for attribute 'humpty' with value 'dumpty'");
|
||||||
|
t.ok(dumptyResults[0].fid === 'f_01',
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns the correct feature with attribute 'humpty' set to 'dumpty'");
|
||||||
|
|
||||||
|
// simple use case: find 1 feature with an attribute and matching value
|
||||||
|
// and respect data types
|
||||||
|
// 2 tests
|
||||||
|
var strOneResults = layer.getFeaturesByAttribute('clazz', '1');
|
||||||
|
t.ok(strOneResults.length === 1,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns an array with one feature for attribute 'clazz' with value '1' (a string)");
|
||||||
|
t.ok(strOneResults[0].fid === 'f_02',
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns the correct feature with attribute 'clazz' set to the string '1'");
|
||||||
|
|
||||||
|
// simple use case: find 2 features with an attribute and matching value
|
||||||
|
// and respect data types
|
||||||
|
// 2 tests
|
||||||
|
var numOneResults = layer.getFeaturesByAttribute('clazz', 1);
|
||||||
|
t.ok(numOneResults.length === 2,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns an array with two features for attribute 'clazz' with value 1 (a number)");
|
||||||
|
var bothFound = !!((numOneResults[0].fid === 'f_01' && numOneResults[1].fid === 'f_03') || (numOneResults[0].fid === 'f_03' && numOneResults[1].fid === 'f_01'));
|
||||||
|
t.ok(bothFound,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute returns the correct features with attribute 'clazz' set to the number 1");
|
||||||
|
|
||||||
|
// advanced use case: find the 1 feature, that has an attribute not set
|
||||||
|
var undefined;
|
||||||
|
var humptyNotSet = layer.getFeaturesByAttribute('humpty', undefined);
|
||||||
|
t.ok(humptyNotSet.length === 1,
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute can be used to find features that have certain attributes not set");
|
||||||
|
t.ok(humptyNotSet[0].fid === 'f_02',
|
||||||
|
"OpenLayers.Layer.Vector.getFeaturesByAttribute found the correct featuren that has a certain attribute not set");
|
||||||
|
}
|
||||||
|
|
||||||
function test_Layer_Vector_getDataExtent(t) {
|
function test_Layer_Vector_getDataExtent(t) {
|
||||||
t.plan(1);
|
t.plan(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user