diff --git a/src/ol/featureloader.js b/src/ol/featureloader.js index 060e372171..7d82fc49b1 100644 --- a/src/ol/featureloader.js +++ b/src/ol/featureloader.js @@ -1,7 +1,6 @@ goog.provide('ol.featureloader'); goog.require('ol'); -goog.require('ol.Tile'); goog.require('ol.format.FormatType'); goog.require('ol.xml'); @@ -70,35 +69,6 @@ ol.featureloader.loadFeaturesXhr = function(url, format, success, failure) { }; -/** - * Create an XHR feature loader for a `url` and `format`. The feature loader - * loads features (with XHR), parses the features, and adds them to the - * vector tile. - * @param {string|ol.FeatureUrlFunction} url Feature URL service. - * @param {ol.format.Feature} format Feature format. - * @return {ol.FeatureLoader} The feature loader. - * @api - */ -ol.featureloader.tile = function(url, format) { - return ol.featureloader.loadFeaturesXhr(url, format, - /** - * @param {Array.} features The loaded features. - * @param {ol.proj.Projection} dataProjection Data projection. - * @this {ol.VectorTile} - */ - function(features, dataProjection) { - this.setProjection(dataProjection); - this.setFeatures(features); - }, - /** - * @this {ol.VectorTile} - */ - function() { - this.setState(ol.Tile.State.ERROR); - }); -}; - - /** * Create an XHR feature loader for a `url` and `format`. The feature loader * loads features (with XHR), parses the features, and adds them to the diff --git a/src/ol/vectortile.js b/src/ol/vectortile.js index 28f740da0a..04efabc99a 100644 --- a/src/ol/vectortile.js +++ b/src/ol/vectortile.js @@ -150,6 +150,25 @@ ol.VectorTile.prototype.load = function() { }; +/** + * Handler for successful tile load. + * @param {Array.} features The loaded features. + * @param {ol.proj.Projection} dataProjection Data projection. + */ +ol.VectorTile.prototype.onLoad_ = function(features, dataProjection) { + this.setProjection(dataProjection); + this.setFeatures(features); +}; + + +/** + * Handler for tile load errors. + */ +ol.VectorTile.prototype.onError_ = function() { + this.setState(ol.Tile.State.ERROR); +}; + + /** * @param {Array.} features Features. * @api @@ -190,9 +209,13 @@ ol.VectorTile.prototype.setLoader = function(loader) { /** + * Sets the loader for a tile. * @param {ol.VectorTile} tile Vector tile. * @param {string} url URL. */ ol.VectorTile.defaultLoadFunction = function(tile, url) { - tile.setLoader(ol.featureloader.tile(url, tile.getFormat())); + var loader = ol.featureloader.loadFeaturesXhr( + url, tile.getFormat(), tile.onLoad_.bind(tile), tile.onError_.bind(tile)); + + tile.setLoader(loader); }; diff --git a/test/spec/ol/featureloader.test.js b/test/spec/ol/featureloader.test.js index bea9204257..c708377200 100644 --- a/test/spec/ol/featureloader.test.js +++ b/test/spec/ol/featureloader.test.js @@ -1,12 +1,7 @@ goog.provide('ol.test.featureloader'); -goog.require('ol.events'); -goog.require('ol.VectorTile'); -goog.require('ol.Feature'); goog.require('ol.featureloader'); goog.require('ol.format.GeoJSON'); -goog.require('ol.format.TextFeature'); -goog.require('ol.proj'); goog.require('ol.source.Vector'); @@ -66,48 +61,4 @@ describe('ol.featureloader', function() { }); - describe('ol.featureloader.tile', function() { - var loader; - var tile; - - beforeEach(function() { - tile = new ol.VectorTile([0, 0, 0]); - }); - - it('sets features on the tile', function(done) { - var url = 'spec/ol/data/point.json'; - var format = new ol.format.GeoJSON(); - loader = ol.featureloader.tile(url, format); - ol.events.listen(tile, 'change', function(e) { - expect(tile.getFeatures().length).to.be.greaterThan(0); - done(); - }); - loader.call(tile, [], 1, ol.proj.get('EPSG:3857')); - }); - - it('sets features on the tile and updates proj units', function(done) { - // mock format that return a tile-pixels feature - var format = new ol.format.TextFeature(); - format.readProjection = function(source) { - return new ol.proj.Projection({ - code: '', - units: 'tile-pixels' - }); - }; - format.readFeatures = function(source, options) { - return [new ol.Feature()]; - }; - - var url = 'spec/ol/data/point.json'; - loader = ol.featureloader.tile(url, format); - ol.events.listen(tile, 'change', function(e) { - expect(tile.getFeatures().length).to.be.greaterThan(0); - expect(tile.getProjection().getUnits()).to.be('tile-pixels'); - done(); - }); - loader.call(tile, [], 1, ol.proj.get('EPSG:3857')); - }); - - }); - }); diff --git a/test/spec/ol/vectortile.test.js b/test/spec/ol/vectortile.test.js new file mode 100644 index 0000000000..33531d21e6 --- /dev/null +++ b/test/spec/ol/vectortile.test.js @@ -0,0 +1,64 @@ +goog.provide('ol.test.VectorTile'); + +goog.require('ol.events'); +goog.require('ol.VectorTile'); +goog.require('ol.Feature'); +goog.require('ol.format.GeoJSON'); +goog.require('ol.format.TextFeature'); +goog.require('ol.proj'); + + +describe('ol.VectorTile.defaultLoadFunction()', function() { + + it('sets the loader function on the tile', function() { + var format = new ol.format.GeoJSON(); + var tile = new ol.VectorTile([0, 0, 0], null, null, format); + var url = 'https://example.com/'; + + ol.VectorTile.defaultLoadFunction(tile, url); + var loader = tile.loader_; + expect(typeof loader).to.be('function'); + }); + + it('loader sets features on the tile', function(done) { + var format = new ol.format.GeoJSON(); + var tile = new ol.VectorTile([0, 0, 0], null, null, format); + var url = 'spec/ol/data/point.json'; + + ol.VectorTile.defaultLoadFunction(tile, url); + var loader = tile.loader_; + + ol.events.listen(tile, 'change', function(e) { + expect(tile.getFeatures().length).to.be.greaterThan(0); + done(); + }); + loader.call(tile, [], 1, ol.proj.get('EPSG:3857')); + }); + + it('loader sets features on the tile and updates proj units', function(done) { + // mock format that return a tile-pixels feature + var format = new ol.format.TextFeature(); + format.readProjection = function(source) { + return new ol.proj.Projection({ + code: '', + units: 'tile-pixels' + }); + }; + format.readFeatures = function(source, options) { + return [new ol.Feature()]; + }; + + var tile = new ol.VectorTile([0, 0, 0], null, null, format); + var url = 'spec/ol/data/point.json'; + + ol.VectorTile.defaultLoadFunction(tile, url); + var loader = tile.loader_; + ol.events.listen(tile, 'change', function(e) { + expect(tile.getFeatures().length).to.be.greaterThan(0); + expect(tile.getProjection().getUnits()).to.be('tile-pixels'); + done(); + }); + loader.call(tile, [], 1, ol.proj.get('EPSG:3857')); + }); + +});