Merge pull request #6779 from ahocevar/vector-tile-grid

Decouple source and rendered tile grid of vector tile sources
This commit is contained in:
Andreas Hocevar
2017-05-10 19:07:21 +02:00
committed by GitHub
18 changed files with 708 additions and 288 deletions
@@ -62,6 +62,11 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
tileClass: TileClass,
tileGrid: ol.tilegrid.createXYZ()
});
source.getTile = function() {
var tile = ol.source.VectorTile.prototype.getTile.apply(source, arguments);
tile.setState(ol.TileState.LOADED);
return tile;
};
layer = new ol.layer.VectorTile({
source: source,
style: layerStyle
@@ -156,12 +161,18 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
tileGrid: ol.tilegrid.createXYZ()
})
});
var tile = new ol.VectorTile([0, 0, 0], 2);
tile.projection_ = ol.proj.get('EPSG:3857');
tile.features_ = [];
tile.getImage = function() {
var sourceTile = new ol.VectorTile([0, 0, 0], 2);
sourceTile.setProjection(ol.proj.get('EPSG:3857'));
sourceTile.features_ = [];
sourceTile.getImage = function() {
return document.createElement('canvas');
};
var tile = new ol.VectorImageTile([0, 0, 0]);
tile.wrappedTileCoord = [0, 0, 0];
tile.setState(ol.TileState.LOADED);
tile.getSourceTile = function() {
return sourceTile;
};
layer.getSource().getTile = function() {
return tile;
};
@@ -195,12 +206,19 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
describe('#forEachFeatureAtCoordinate', function() {
var layer, renderer, replayGroup;
var TileClass = function() {
ol.VectorTile.apply(this, arguments);
ol.VectorImageTile.apply(this, arguments);
this.setState('loaded');
this.setProjection(ol.proj.get('EPSG:3857'));
this.replayState_.replayGroup = replayGroup;
var sourceTile = new ol.VectorTile([0, 0, 0]);
sourceTile.setProjection(ol.proj.get('EPSG:3857'));
sourceTile.getReplayGroup = function() {
return replayGroup;
};
var key = sourceTile.tileCoord.toString();
this.tileKeys = [key];
this.sourceTiles_ = {};
this.sourceTiles_[key] = sourceTile;
};
ol.inherits(TileClass, ol.VectorTile);
ol.inherits(TileClass, ol.VectorImageTile);
beforeEach(function() {
replayGroup = {};
@@ -226,6 +244,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
layerStates: {},
skippedFeatureUids: {},
viewState: {
projection: ol.proj.get('EPSG:3857'),
resolution: 1,
rotation: 0
}
+10 -3
View File
@@ -1,6 +1,6 @@
goog.provide('ol.test.source.VectorTile');
goog.require('ol.VectorTile');
goog.require('ol.VectorImageTile');
goog.require('ol.format.MVT');
goog.require('ol.proj');
goog.require('ol.source.VectorTile');
@@ -12,7 +12,7 @@ describe('ol.source.VectorTile', function() {
var format = new ol.format.MVT();
var source = new ol.source.VectorTile({
format: format,
tileGrid: ol.tilegrid.createXYZ(),
tileGrid: ol.tilegrid.createXYZ({tileSize: 512}),
url: '{z}/{x}/{y}.pbf'
});
var tile;
@@ -29,7 +29,7 @@ describe('ol.source.VectorTile', function() {
describe('#getTile()', function() {
it('creates a tile with the correct tile class', function() {
tile = source.getTile(0, 0, 0, 1, ol.proj.get('EPSG:3857'));
expect(tile).to.be.a(ol.VectorTile);
expect(tile).to.be.a(ol.VectorImageTile);
});
it('sets the correct tileCoord on the created tile', function() {
expect(tile.getTileCoord()).to.eql([0, 0, 0]);
@@ -40,4 +40,11 @@ describe('ol.source.VectorTile', function() {
});
});
describe('#getTileGridForProjection', function() {
it('creates a tile grid with the source tile grid\'s tile size', function() {
var tileGrid = source.getTileGridForProjection(ol.proj.get('EPSG:3857'));
expect(tileGrid.getTileSize(0)).to.be(512);
});
});
});
+107
View File
@@ -0,0 +1,107 @@
goog.provide('ol.test.VectorImageTile');
goog.require('ol.events');
goog.require('ol.VectorImageTile');
goog.require('ol.VectorTile');
goog.require('ol.format.GeoJSON');
goog.require('ol.proj');
describe('ol.VectorImageTile', function() {
it('configures loader that sets features on the source tile', function(done) {
var format = new ol.format.GeoJSON();
var url = 'spec/ol/data/point.json';
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile);
tile.load();
var sourceTile = tile.getTile(tile.tileKeys[0]);
var loader = sourceTile.loader_;
expect(typeof loader).to.be('function');
ol.events.listen(sourceTile, 'change', function(e) {
expect(sourceTile.getFeatures().length).to.be.greaterThan(0);
done();
});
});
it('sets ERROR state when source tiles fail to load', function(done) {
var format = new ol.format.GeoJSON();
var url = 'spec/ol/data/unavailable.json';
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile);
tile.load();
ol.events.listen(tile, 'change', function(e) {
expect(tile.getState()).to.be(ol.TileState.ERROR);
done();
});
});
it('sets EMPTY state when tile has only empty source tiles', function(done) {
var format = new ol.format.GeoJSON();
var url = '';
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {},
ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile);
tile.load();
ol.events.listen(tile, 'change', function() {
expect(tile.getState()).to.be(ol.TileState.EMPTY);
done();
});
});
it('#dispose() while loading', function() {
var format = new ol.format.GeoJSON();
var url = 'spec/ol/data/point.json';
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile);
tile.load();
expect(tile.loadListenerKeys_.length).to.be(4);
expect(tile.tileKeys.length).to.be(4);
expect(tile.getState()).to.be(ol.TileState.LOADING);
tile.dispose();
expect(tile.loadListenerKeys_.length).to.be(0);
expect(tile.tileKeys.length).to.be(0);
expect(tile.sourceTiles_).to.be(null);
expect(tile.getState()).to.be(ol.TileState.ABORT);
});
it('#dispose() when loaded', function(done) {
var format = new ol.format.GeoJSON();
var url = 'spec/ol/data/point.json';
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile);
tile.load();
ol.events.listenOnce(tile, 'change', function() {
expect(tile.getState()).to.be(ol.TileState.LOADED);
expect(tile.loadListenerKeys_.length).to.be(0);
expect(tile.tileKeys.length).to.be(4);
tile.dispose();
expect(tile.tileKeys.length).to.be(0);
expect(tile.sourceTiles_).to.be(null);
expect(tile.getState()).to.be(ol.TileState.ABORT);
done();
});
});
});
+3 -28
View File
@@ -1,39 +1,14 @@
goog.provide('ol.test.VectorTile');
goog.require('ol.events');
goog.require('ol.VectorImageTile');
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'));
});
describe('ol.VectorTile', function() {
it('loader sets features on the tile and updates proj units', function(done) {
// mock format that return a tile-pixels feature
@@ -51,7 +26,7 @@ describe('ol.VectorTile.defaultLoadFunction()', function() {
var tile = new ol.VectorTile([0, 0, 0], null, null, format);
var url = 'spec/ol/data/point.json';
ol.VectorTile.defaultLoadFunction(tile, url);
ol.VectorImageTile.defaultLoadFunction(tile, url);
var loader = tile.loader_;
ol.events.listen(tile, 'change', function(e) {
expect(tile.getFeatures().length).to.be.greaterThan(0);