From 8d03fa1197d9465db74f31e4e5fcda181e2c5330 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Tue, 19 Nov 2013 15:39:22 +0100 Subject: [PATCH] add an optional argument to getAttributes so we can get a feature's attributes except for the geometry ones --- src/ol/feature.js | 10 ++++++++-- src/ol/parser/geojsonparser.js | 6 +----- src/ol/parser/ogc/gmlparser.js | 5 ++--- test/spec/ol/feature.test.js | 17 +++++++++++++++++ 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/ol/feature.js b/src/ol/feature.js index 38da602d17..2e49ecdd33 100644 --- a/src/ol/feature.js +++ b/src/ol/feature.js @@ -68,17 +68,23 @@ goog.inherits(ol.Feature, ol.Object); /** * Gets a copy of the attributes of this feature. + * @param {boolean=} opt_nonGeometry Don't include any geometry attributes + * (by default geometry attributes are returned). * @return {Object.} Attributes object. * @todo stability experimental */ -ol.Feature.prototype.getAttributes = function() { +ol.Feature.prototype.getAttributes = function(opt_nonGeometry) { var keys = this.getKeys(), len = keys.length, attributes = {}, i, key; for (i = 0; i < len; ++ i) { key = keys[i]; - attributes[key] = this.get(key); + var value = this.get(key); + if (!goog.isDef(opt_nonGeometry) || opt_nonGeometry == false || + (opt_nonGeometry === true && !(value instanceof ol.geom.Geometry))) { + attributes[key] = value; + } } return attributes; }; diff --git a/src/ol/parser/geojsonparser.js b/src/ol/parser/geojsonparser.js index 6966c098d3..d08d45362d 100644 --- a/src/ol/parser/geojsonparser.js +++ b/src/ol/parser/geojsonparser.js @@ -351,11 +351,7 @@ ol.parser.GeoJSON.prototype.encodeFeatureCollection_ = function(collection) { */ ol.parser.GeoJSON.prototype.encodeFeature_ = function(feature) { var geometry = feature.getGeometry(), - attributes = feature.getAttributes(); - var properties = goog.object.filter(attributes, - function(element, index, array) { - return !(element instanceof ol.geom.Geometry); - }); + properties = feature.getAttributes(true); return /** @type {GeoJSONFeature} */({ type: 'Feature', properties: properties, diff --git a/src/ol/parser/ogc/gmlparser.js b/src/ol/parser/ogc/gmlparser.js index 2ebf3d4020..872abfe166 100644 --- a/src/ol/parser/ogc/gmlparser.js +++ b/src/ol/parser/ogc/gmlparser.js @@ -422,11 +422,10 @@ ol.parser.ogc.GML = function(opt_options) { this.writeNode('_geometry', feature.getGeometry(), this.featureNS, node); } - var attributes = feature.getAttributes(); + var attributes = feature.getAttributes(true); for (var name in attributes) { var value = attributes[name]; - if (goog.isDefAndNotNull(value) && !(value instanceof - ol.geom.Geometry)) { + if (goog.isDefAndNotNull(value)) { this.writeNode('_attribute', {name: name, value: value}, this.featureNS, node); } diff --git a/test/spec/ol/feature.test.js b/test/spec/ol/feature.test.js index 1f31c8cc78..9faf5b84ef 100644 --- a/test/spec/ol/feature.test.js +++ b/test/spec/ol/feature.test.js @@ -78,6 +78,23 @@ describe('ol.Feature', function() { expect(attributes.ten).to.be(10); }); + it('returns an object with all attributes except geometry', function() { + var point = new ol.geom.Point([15, 30]); + var feature = new ol.Feature({ + foo: 'bar', + ten: 10, + loc: point + }); + + var attributes = feature.getAttributes(true); + + var keys = goog.object.getKeys(attributes); + expect(keys.sort()).to.eql(['foo', 'ten']); + + expect(attributes.foo).to.be('bar'); + expect(attributes.ten).to.be(10); + }); + });