Merge pull request #6819 from ahocevar/vectortile-getfeatures

Adjust/fix API for working with vector tile features
This commit is contained in:
Andreas Hocevar
2017-05-18 11:13:30 +02:00
committed by GitHub
7 changed files with 62 additions and 17 deletions
+2 -1
View File
@@ -108,7 +108,8 @@ ol.renderer.canvas.VectorTileLayer.prototype.createReplayGroup_ = function(
var pixelRatio = frameState.pixelRatio; var pixelRatio = frameState.pixelRatio;
var projection = frameState.viewState.projection; var projection = frameState.viewState.projection;
var revision = layer.getRevision(); var revision = layer.getRevision();
var renderOrder = layer.getRenderOrder() || null; var renderOrder = /** @type {ol.RenderOrderFunction} */
(layer.getRenderOrder()) || null;
var replayState = tile.getReplayState(); var replayState = tile.getReplayState();
if (!replayState.dirty && replayState.renderedRevision == revision && if (!replayState.dirty && replayState.renderedRevision == revision &&
+2 -5
View File
@@ -4,8 +4,6 @@ goog.require('ol');
goog.require('ol.TileState'); goog.require('ol.TileState');
goog.require('ol.VectorImageTile'); goog.require('ol.VectorImageTile');
goog.require('ol.VectorTile'); goog.require('ol.VectorTile');
goog.require('ol.events');
goog.require('ol.events.EventType');
goog.require('ol.proj'); goog.require('ol.proj');
goog.require('ol.size'); goog.require('ol.size');
goog.require('ol.tilegrid'); goog.require('ol.tilegrid');
@@ -114,9 +112,8 @@ ol.source.VectorTile.prototype.getTile = function(z, x, y, pixelRatio, projectio
tileUrl !== undefined ? tileUrl : '', tileUrl !== undefined ? tileUrl : '',
this.format_, this.tileLoadFunction, urlTileCoord, this.tileUrlFunction, this.format_, this.tileLoadFunction, urlTileCoord, this.tileUrlFunction,
this.tileGrid, this.getTileGridForProjection(projection), this.tileGrid, this.getTileGridForProjection(projection),
this.sourceTiles_, pixelRatio, projection, this.tileClass); this.sourceTiles_, pixelRatio, projection, this.tileClass,
ol.events.listen(tile, ol.events.EventType.CHANGE, this.handleTileChange.bind(this));
this.handleTileChange, this);
this.tileCache.set(tileCoordKey, tile); this.tileCache.set(tileCoordKey, tile);
return tile; return tile;
+4 -2
View File
@@ -453,9 +453,11 @@ ol.RegularShapeRenderOptions;
/** /**
* A function to be used when sorting features before rendering. * A function to be used when sorting features before rendering.
* It takes two instances of {@link ol.Feature} and returns a `{number}`. * It takes two instances of {@link ol.Feature} or {@link ol.render.Feature} and
* returns a `{number}`.
* *
* @typedef {function(ol.Feature, ol.Feature):number} * @typedef {function((ol.Feature|ol.render.Feature), (ol.Feature|ol.render.Feature)):
* number}
*/ */
ol.RenderOrderFunction; ol.RenderOrderFunction;
+12 -2
View File
@@ -29,10 +29,12 @@ goog.require('ol.featureloader');
* @param {function(new: ol.VectorTile, ol.TileCoord, ol.TileState, string, * @param {function(new: ol.VectorTile, ol.TileCoord, ol.TileState, string,
* ol.format.Feature, ol.TileLoadFunctionType)} tileClass Class to * ol.format.Feature, ol.TileLoadFunctionType)} tileClass Class to
* instantiate for source tiles. * instantiate for source tiles.
* @param {function(this: ol.source.VectorTile, ol.events.Event)} handleTileChange
* Function to call when a source tile's state changes.
*/ */
ol.VectorImageTile = function(tileCoord, state, src, format, tileLoadFunction, ol.VectorImageTile = function(tileCoord, state, src, format, tileLoadFunction,
urlTileCoord, tileUrlFunction, sourceTileGrid, tileGrid, sourceTiles, urlTileCoord, tileUrlFunction, sourceTileGrid, tileGrid, sourceTiles,
pixelRatio, projection, tileClass) { pixelRatio, projection, tileClass, handleTileChange) {
ol.Tile.call(this, tileCoord, state); ol.Tile.call(this, tileCoord, state);
@@ -86,6 +88,11 @@ ol.VectorImageTile = function(tileCoord, state, src, format, tileLoadFunction,
*/ */
this.loadListenerKeys_ = []; this.loadListenerKeys_ = [];
/**
* @type {Array.<ol.EventsKey>}
*/
this.sourceTileListenerKeys_ = [];
if (urlTileCoord) { if (urlTileCoord) {
var extent = tileGrid.getTileCoordExtent(urlTileCoord); var extent = tileGrid.getTileCoordExtent(urlTileCoord);
var resolution = tileGrid.getResolution(tileCoord[0]); var resolution = tileGrid.getResolution(tileCoord[0]);
@@ -104,6 +111,8 @@ ol.VectorImageTile = function(tileCoord, state, src, format, tileLoadFunction,
tileUrl == undefined ? ol.TileState.EMPTY : ol.TileState.IDLE, tileUrl == undefined ? ol.TileState.EMPTY : ol.TileState.IDLE,
tileUrl == undefined ? '' : tileUrl, tileUrl == undefined ? '' : tileUrl,
format, tileLoadFunction); format, tileLoadFunction);
this.sourceTileListenerKeys_.push(
ol.events.listen(sourceTile, ol.events.EventType.CHANGE, handleTileChange));
} }
sourceTile.consumers++; sourceTile.consumers++;
this.tileKeys.push(sourceTileKey); this.tileKeys.push(sourceTileKey);
@@ -139,6 +148,8 @@ ol.VectorImageTile.prototype.disposeInternal = function() {
} }
this.state = ol.TileState.ABORT; this.state = ol.TileState.ABORT;
this.changed(); this.changed();
this.sourceTileListenerKeys_.forEach(ol.events.unlistenByKey);
this.sourceTileListenerKeys_.length = 0;
ol.Tile.prototype.disposeInternal.call(this); ol.Tile.prototype.disposeInternal.call(this);
}; };
@@ -157,7 +168,6 @@ ol.VectorImageTile.prototype.getContext = function() {
/** /**
* Get the Canvas for this tile. * Get the Canvas for this tile.
* @return {HTMLCanvasElement} Canvas. * @return {HTMLCanvasElement} Canvas.
* @api
*/ */
ol.VectorImageTile.prototype.getImage = function() { ol.VectorImageTile.prototype.getImage = function() {
return this.replayState_.renderedTileRevision == -1 ? return this.replayState_.renderedTileRevision == -1 ?
+18 -1
View File
@@ -66,6 +66,18 @@ ol.VectorTile = function(tileCoord, state, src, format, tileLoadFunction) {
ol.inherits(ol.VectorTile, ol.Tile); ol.inherits(ol.VectorTile, ol.Tile);
/**
* @inheritDoc
*/
ol.VectorTile.prototype.disposeInternal = function() {
this.features_ = null;
this.replayGroups_ = {};
this.state = ol.TileState.ABORT;
this.changed();
ol.Tile.prototype.disposeInternal.call(this);
};
/** /**
* Get the feature format assigned for reading this tile's features. * Get the feature format assigned for reading this tile's features.
* @return {ol.format.Feature} Feature format. * @return {ol.format.Feature} Feature format.
@@ -77,7 +89,10 @@ ol.VectorTile.prototype.getFormat = function() {
/** /**
* @return {Array.<ol.Feature>} Features. * Get the features for this tile. Geometries will be in the projection returned
* by {@link #getProjection}.
* @return {Array.<ol.Feature|ol.render.Feature>} Features.
* @api
*/ */
ol.VectorTile.prototype.getFeatures = function() { ol.VectorTile.prototype.getFeatures = function() {
return this.features_; return this.features_;
@@ -93,7 +108,9 @@ ol.VectorTile.prototype.getKey = function() {
/** /**
* Get the feature projection of features returned by {@link #getFeatures}.
* @return {ol.proj.Projection} Feature projection. * @return {ol.proj.Projection} Feature projection.
* @api
*/ */
ol.VectorTile.prototype.getProjection = function() { ol.VectorTile.prototype.getProjection = function() {
return this.projection_; return this.projection_;
+19 -1
View File
@@ -13,7 +13,8 @@ describe('ol.source.VectorTile', function() {
var source = new ol.source.VectorTile({ var source = new ol.source.VectorTile({
format: format, format: format,
tileGrid: ol.tilegrid.createXYZ({tileSize: 512}), tileGrid: ol.tilegrid.createXYZ({tileSize: 512}),
url: '{z}/{x}/{y}.pbf' tilePixelRatio: 8,
url: 'spec/ol/data/{z}-{x}-{y}.vector.pbf'
}); });
var tile; var tile;
@@ -47,4 +48,21 @@ describe('ol.source.VectorTile', function() {
}); });
}); });
describe('Tile load events', function() {
it('triggers tileloadstart and tileloadend with ol.VectorTile', function(done) {
tile = source.getTile(14, 8938, -5681, 1, ol.proj.get('EPSG:3857'));
var started = false;
source.on('tileloadstart', function() {
started = true;
});
source.on('tileloadend', function(e) {
expect(started).to.be(true);
expect(e.tile).to.be.a(ol.VectorTile);
expect(e.tile.getFeatures().length).to.be(1327);
done();
});
tile.load();
});
});
}); });
+5 -5
View File
@@ -16,7 +16,7 @@ describe('ol.VectorImageTile', function() {
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() { ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url; return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {}, }, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile); 1, ol.proj.get('EPSG:3857'), ol.VectorTile, function() {});
tile.load(); tile.load();
var sourceTile = tile.getTile(tile.tileKeys[0]); var sourceTile = tile.getTile(tile.tileKeys[0]);
@@ -36,7 +36,7 @@ describe('ol.VectorImageTile', function() {
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() { ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url; return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {}, }, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile); 1, ol.proj.get('EPSG:3857'), ol.VectorTile, function() {});
tile.load(); tile.load();
@@ -52,7 +52,7 @@ describe('ol.VectorImageTile', function() {
var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format, var tile = new ol.VectorImageTile([0, 0, 0], 0, url, format,
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {}, ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {},
ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ(), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile); 1, ol.proj.get('EPSG:3857'), ol.VectorTile, function() {});
tile.load(); tile.load();
@@ -69,7 +69,7 @@ describe('ol.VectorImageTile', function() {
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() { ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url; return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {}, }, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile); 1, ol.proj.get('EPSG:3857'), ol.VectorTile, function() {});
tile.load(); tile.load();
expect(tile.loadListenerKeys_.length).to.be(4); expect(tile.loadListenerKeys_.length).to.be(4);
@@ -89,7 +89,7 @@ describe('ol.VectorImageTile', function() {
ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() { ol.VectorImageTile.defaultLoadFunction, [0, 0, 0], function() {
return url; return url;
}, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {}, }, ol.tilegrid.createXYZ(), ol.tilegrid.createXYZ({tileSize: 512}), {},
1, ol.proj.get('EPSG:3857'), ol.VectorTile); 1, ol.proj.get('EPSG:3857'), ol.VectorTile, function() {});
tile.load(); tile.load();
ol.events.listenOnce(tile, 'change', function() { ol.events.listenOnce(tile, 'change', function() {