Base render tile grid on the source grid
Use source zDirection for both grids
This commit is contained in:
@@ -510,7 +510,9 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer {
|
|||||||
let hitDetectionImageData = tile.hitDetectionImageData[layerUid];
|
let hitDetectionImageData = tile.hitDetectionImageData[layerUid];
|
||||||
if (!hitDetectionImageData && !this.animatingOrInteracting_) {
|
if (!hitDetectionImageData && !this.animatingOrInteracting_) {
|
||||||
const tileSize = toSize(
|
const tileSize = toSize(
|
||||||
tileGrid.getTileSize(tileGrid.getZForResolution(resolution))
|
tileGrid.getTileSize(
|
||||||
|
tileGrid.getZForResolution(resolution, source.zDirection)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
const rotation = this.renderedRotation_;
|
const rotation = this.renderedRotation_;
|
||||||
const transforms = [
|
const transforms = [
|
||||||
|
|||||||
@@ -5,19 +5,17 @@
|
|||||||
import EventType from '../events/EventType.js';
|
import EventType from '../events/EventType.js';
|
||||||
import Tile from '../VectorTile.js';
|
import Tile from '../VectorTile.js';
|
||||||
import TileCache from '../TileCache.js';
|
import TileCache from '../TileCache.js';
|
||||||
|
import TileGrid from '../tilegrid/TileGrid.js';
|
||||||
import TileState from '../TileState.js';
|
import TileState from '../TileState.js';
|
||||||
import UrlTile from './UrlTile.js';
|
import UrlTile from './UrlTile.js';
|
||||||
import VectorRenderTile from '../VectorRenderTile.js';
|
import VectorRenderTile from '../VectorRenderTile.js';
|
||||||
|
import {DEFAULT_MAX_ZOOM} from '../tilegrid/common.js';
|
||||||
import {
|
import {
|
||||||
buffer as bufferExtent,
|
buffer as bufferExtent,
|
||||||
getIntersection,
|
getIntersection,
|
||||||
intersects,
|
intersects,
|
||||||
} from '../extent.js';
|
} from '../extent.js';
|
||||||
import {
|
import {createXYZ, extentFromProjection} from '../tilegrid.js';
|
||||||
createForProjection,
|
|
||||||
createXYZ,
|
|
||||||
extentFromProjection,
|
|
||||||
} from '../tilegrid.js';
|
|
||||||
import {fromKey, getCacheKeyForTileKey, getKeyZXY} from '../tilecoord.js';
|
import {fromKey, getCacheKeyForTileKey, getKeyZXY} from '../tilecoord.js';
|
||||||
import {isEmpty} from '../obj.js';
|
import {isEmpty} from '../obj.js';
|
||||||
import {loadFeaturesXhr} from '../featureloader.js';
|
import {loadFeaturesXhr} from '../featureloader.js';
|
||||||
@@ -274,7 +272,10 @@ class VectorTile extends UrlTile {
|
|||||||
if (sourceExtent) {
|
if (sourceExtent) {
|
||||||
getIntersection(extent, sourceExtent, extent);
|
getIntersection(extent, sourceExtent, extent);
|
||||||
}
|
}
|
||||||
const sourceZ = sourceTileGrid.getZForResolution(resolution, 1);
|
const sourceZ = sourceTileGrid.getZForResolution(
|
||||||
|
resolution,
|
||||||
|
this.zDirection
|
||||||
|
);
|
||||||
|
|
||||||
sourceTileGrid.forEachTileCoord(extent, sourceZ, (sourceTileCoord) => {
|
sourceTileGrid.forEachTileCoord(extent, sourceZ, (sourceTileCoord) => {
|
||||||
const tileUrl = this.tileUrlFunction(
|
const tileUrl = this.tileUrlFunction(
|
||||||
@@ -428,13 +429,25 @@ class VectorTile extends UrlTile {
|
|||||||
// A tile grid that matches the tile size of the source tile grid is more
|
// A tile grid that matches the tile size of the source tile grid is more
|
||||||
// likely to have 1:1 relationships between source tiles and rendered tiles.
|
// likely to have 1:1 relationships between source tiles and rendered tiles.
|
||||||
const sourceTileGrid = this.tileGrid;
|
const sourceTileGrid = this.tileGrid;
|
||||||
tileGrid = createForProjection(
|
const resolutions = sourceTileGrid.getResolutions().slice();
|
||||||
projection,
|
const origins = resolutions.map(function (resolution, z) {
|
||||||
undefined,
|
return sourceTileGrid.getOrigin(z);
|
||||||
sourceTileGrid
|
});
|
||||||
? sourceTileGrid.getTileSize(sourceTileGrid.getMinZoom())
|
const tileSizes = resolutions.map(function (resolution, z) {
|
||||||
: undefined
|
return sourceTileGrid.getTileSize(z);
|
||||||
);
|
});
|
||||||
|
const length = DEFAULT_MAX_ZOOM + 1;
|
||||||
|
for (let z = resolutions.length; z < length; ++z) {
|
||||||
|
resolutions.push(resolutions[z - 1] / 2);
|
||||||
|
origins.push(origins[z - 1]);
|
||||||
|
tileSizes.push(tileSizes[z - 1]);
|
||||||
|
}
|
||||||
|
tileGrid = new TileGrid({
|
||||||
|
extent: sourceTileGrid.getExtent(),
|
||||||
|
origins: origins,
|
||||||
|
resolutions: resolutions,
|
||||||
|
tileSizes: tileSizes,
|
||||||
|
});
|
||||||
this.tileGrids_[code] = tileGrid;
|
this.tileGrids_[code] = tileGrid;
|
||||||
}
|
}
|
||||||
return tileGrid;
|
return tileGrid;
|
||||||
|
|||||||
@@ -228,18 +228,14 @@ describe('ol.source.VectorTile', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('different source and render tile grids', function () {
|
describe('different source and render tile grids', function () {
|
||||||
let source, map, loaded, requested, target;
|
let source, map, loaded, target;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
loaded = [];
|
loaded = [];
|
||||||
requested = 0;
|
|
||||||
|
|
||||||
function tileUrlFunction(tileCoord) {
|
function tileUrlFunction(tileCoord) {
|
||||||
++requested;
|
|
||||||
if (tileCoord.toString() == '5,13,-29') {
|
|
||||||
return tileCoord.join('/');
|
return tileCoord.join('/');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function tileLoadFunction(tile, src) {
|
function tileLoadFunction(tile, src) {
|
||||||
tile.setLoader(function () {});
|
tile.setLoader(function () {});
|
||||||
@@ -286,11 +282,10 @@ describe('ol.source.VectorTile', function () {
|
|||||||
document.body.removeChild(target);
|
document.body.removeChild(target);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('loads available tiles', function (done) {
|
it('loads only required tiles', function (done) {
|
||||||
map.renderSync();
|
map.renderSync();
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
expect(requested).to.be.greaterThan(1);
|
expect(loaded).to.eql(['5/13/-28']);
|
||||||
expect(loaded).to.eql(['5/13/-29']);
|
|
||||||
done();
|
done();
|
||||||
}, 0);
|
}, 0);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ describe('ol.VectorRenderTile', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("only loads tiles within the source tileGrid's extent", function (done) {
|
it("only loads tiles within the source tileGrid's extent", function (done) {
|
||||||
|
let tile;
|
||||||
const url = 'spec/ol/data/point.json';
|
const url = 'spec/ol/data/point.json';
|
||||||
const source = new VectorTileSource({
|
const source = new VectorTileSource({
|
||||||
projection: 'EPSG:4326',
|
projection: 'EPSG:4326',
|
||||||
@@ -77,8 +78,12 @@ describe('ol.VectorRenderTile', function () {
|
|||||||
},
|
},
|
||||||
url: url,
|
url: url,
|
||||||
});
|
});
|
||||||
const tile = source.getTile(0, 0, 0, 1, source.getProjection());
|
|
||||||
|
|
||||||
|
tile = source.getTile(0, 0, 0, 1, source.getProjection());
|
||||||
|
expect(tile.getState()).to.be(TileState.EMPTY);
|
||||||
|
|
||||||
|
tile = source.getTile(0, 16, 9, 1, source.getProjection());
|
||||||
|
expect(tile.getState()).to.be(TileState.IDLE);
|
||||||
tile.load();
|
tile.load();
|
||||||
const key = listen(tile, EventType.CHANGE, function () {
|
const key = listen(tile, EventType.CHANGE, function () {
|
||||||
if (tile.getState() === TileState.LOADED) {
|
if (tile.getState() === TileState.LOADED) {
|
||||||
|
|||||||
Reference in New Issue
Block a user