Merge pull request #6779 from ahocevar/vector-tile-grid
Decouple source and rendered tile grid of vector tile sources
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user