From 387fcfbdb054c3955f5f1eb12cfd8fc6b420ce15 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:20:43 +0100 Subject: [PATCH 1/7] Factor out ol.source.Vector#addFeatureInternal --- src/ol/source/vectorsource.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 11079daf57..4de918438a 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -78,6 +78,17 @@ goog.inherits(ol.source.Vector, ol.source.Source); * @param {ol.Feature} feature Feature. */ ol.source.Vector.prototype.addFeature = function(feature) { + this.addFeatureInternal(feature); + this.dispatchChangeEvent(); +}; + + +/** + * Add a feature without firing a `change` event. + * @param {ol.Feature} feature Feature. + * @protected + */ +ol.source.Vector.prototype.addFeatureInternal = function(feature) { var featureKey = goog.getUid(feature) + ''; goog.asserts.assert(!(featureKey in this.featureChangeKeys_)); this.featureChangeKeys_[featureKey] = goog.events.listen(feature, From e6c66d36785eeb56e86e7b2433a115921556acd3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:21:51 +0100 Subject: [PATCH 2/7] Add ol.source.Vector#addFeaturesInternal --- src/ol/source/vectorsource.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 4de918438a..2e4b3240b2 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -106,6 +106,20 @@ ol.source.Vector.prototype.addFeatureInternal = function(feature) { }; +/** + * Add features without firing a `change` event. + * @param {Array.} features Features. + * @protected + */ +ol.source.Vector.prototype.addFeaturesInternal = function(features) { + // FIXME use R-Bush bulk load when available + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + this.addFeatureInternal(features[i]); + } +}; + + /** * FIXME empty description for jsdoc */ From 0912c8f6eacb9c9dd83562609b380c6c2e29b9df Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:23:35 +0100 Subject: [PATCH 3/7] Add ol.source.Vector#addFeatures --- src/ol/source/vectorsource.exports | 1 + src/ol/source/vectorsource.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/ol/source/vectorsource.exports b/src/ol/source/vectorsource.exports index cc76d95621..1b55238538 100644 --- a/src/ol/source/vectorsource.exports +++ b/src/ol/source/vectorsource.exports @@ -1,5 +1,6 @@ @exportSymbol ol.source.Vector @exportProperty ol.source.Vector.prototype.addFeature +@exportProperty ol.source.Vector.prototype.addFeatures @exportProperty ol.source.Vector.prototype.getClosestFeatureToCoordinate @exportProperty ol.source.Vector.prototype.forEachFeature @exportProperty ol.source.Vector.prototype.getAllFeatures diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 2e4b3240b2..b5e9df9e1b 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -102,6 +102,14 @@ ol.source.Vector.prototype.addFeatureInternal = function(feature) { } this.dispatchEvent( new ol.source.VectorEvent(ol.source.VectorEventType.ADDFEATURE, feature)); +}; + + +/** + * @param {Array.} features Features. + */ +ol.source.Vector.prototype.addFeatures = function(features) { + this.addFeaturesInternal(features); this.dispatchChangeEvent(); }; From 3af6521ee341c9765b837b11da86e8348af4e2d4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:24:06 +0100 Subject: [PATCH 4/7] Use addFeaturesInternal in ol.source.Vector constructor --- src/ol/source/vectorsource.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index b5e9df9e1b..c90dbbc679 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -63,11 +63,7 @@ ol.source.Vector = function(opt_options) { this.featureChangeKeys_ = {}; if (goog.isDef(options.features)) { - var features = options.features; - var i, ii; - for (i = 0, ii = features.length; i < ii; ++i) { - this.addFeature(features[i]); - } + this.addFeaturesInternal(options.features); } }; From f1fac356dd8f128bbc970242fa651c38389c9944 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:25:48 +0100 Subject: [PATCH 5/7] Change ol.source.Vector#removeFeatureInternal from private to protected --- src/ol/source/vectorsource.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index c90dbbc679..9d6016973f 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -128,7 +128,7 @@ ol.source.Vector.prototype.addFeaturesInternal = function(features) { * FIXME empty description for jsdoc */ ol.source.Vector.prototype.clear = function() { - this.rBush_.forEach(this.removeFeatureInternal_, this); + this.rBush_.forEach(this.removeFeatureInternal, this); this.rBush_.clear(); this.dispatchChangeEvent(); }; @@ -297,16 +297,17 @@ ol.source.Vector.prototype.removeFeature = function(feature) { } else { this.rBush_.remove(feature); } - this.removeFeatureInternal_(feature); + this.removeFeatureInternal(feature); this.dispatchChangeEvent(); }; /** + * Remove feature without firing a `change` event. * @param {ol.Feature} feature Feature. - * @private + * @protected */ -ol.source.Vector.prototype.removeFeatureInternal_ = function(feature) { +ol.source.Vector.prototype.removeFeatureInternal = function(feature) { var featureKey = goog.getUid(feature) + ''; goog.asserts.assert(featureKey in this.featureChangeKeys_); goog.events.unlistenByKey(this.featureChangeKeys_[featureKey]); From b2c822c9caed0ca5057afe01a75c036855a102f9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 13:36:21 +0100 Subject: [PATCH 6/7] Clear null geometry features in ol.source.Vector#clear --- src/ol/source/vectorsource.js | 4 ++++ test/spec/ol/source/vectorsource.test.js | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 9d6016973f..a69c70ca6d 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -130,6 +130,10 @@ ol.source.Vector.prototype.addFeaturesInternal = function(features) { ol.source.Vector.prototype.clear = function() { this.rBush_.forEach(this.removeFeatureInternal, this); this.rBush_.clear(); + goog.object.forEach( + this.nullGeometryFeatures_, this.removeFeatureInternal, this); + goog.object.clear(this.nullGeometryFeatures_); + goog.asserts.assert(goog.object.isEmpty(this.featureChangeKeys_)); this.dispatchChangeEvent(); }; diff --git a/test/spec/ol/source/vectorsource.test.js b/test/spec/ol/source/vectorsource.test.js index 7037c86bbc..975a793af6 100644 --- a/test/spec/ol/source/vectorsource.test.js +++ b/test/spec/ol/source/vectorsource.test.js @@ -66,7 +66,7 @@ describe('ol.source.Vector', function() { }); - describe('when populated with 10 random points', function() { + describe('when populated with 10 random points and a null', function() { var features; var vectorSource; @@ -77,6 +77,7 @@ describe('ol.source.Vector', function() { features[i] = new ol.Feature(new ol.geom.Point([Math.random(), Math.random()])); } + features.push(new ol.Feature(null)); vectorSource = new ol.source.Vector({ features: features }); @@ -95,7 +96,7 @@ describe('ol.source.Vector', function() { expect(changeSpy).to.be.called(); expect(changeSpy.callCount).to.be(1); expect(removeFeatureSpy).to.be.called(); - expect(removeFeatureSpy.callCount).to.be(10); + expect(removeFeatureSpy.callCount).to.be(features.length); }); }); From 1cb70592d768af0703305736edb7fa2099b92257 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Dec 2013 14:11:01 +0100 Subject: [PATCH 7/7] Use addFeatures in ol.source.VectorFile --- src/ol/source/vectorfilesource.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/ol/source/vectorfilesource.js b/src/ol/source/vectorfilesource.js index 8e82084814..865f647e55 100644 --- a/src/ol/source/vectorfilesource.js +++ b/src/ol/source/vectorfilesource.js @@ -106,20 +106,17 @@ ol.source.VectorFile.prototype.readFeatures_ = function(source) { var format = this.format; var features = format.readFeatures(source); var featureProjection = format.readProjection(source); - var transform; if (!ol.proj.equivalent(featureProjection, this.reprojectTo_)) { - transform = ol.proj.getTransform(featureProjection, this.reprojectTo_); - } else { - transform = null; - } - var i, ii; - for (i = 0, ii = features.length; i < ii; ++i) { - var feature = features[i]; - var geometry = feature.getGeometry(); - if (!goog.isNull(geometry) && !goog.isNull(transform)) { - geometry.transform(transform); + var transform = ol.proj.getTransform(featureProjection, this.reprojectTo_); + var i, ii; + for (i = 0, ii = features.length; i < ii; ++i) { + var feature = features[i]; + var geometry = feature.getGeometry(); + if (!goog.isNull(geometry)) { + geometry.transform(transform); + } } - this.addFeature(feature); } + this.addFeaturesInternal(features); this.setState(ol.source.State.READY); };