Ensure that tile range covers all pixels

This commit is contained in:
Tim Schaub
2021-12-23 17:10:59 -07:00
parent 45c38eabc4
commit 2d510e71a9
5 changed files with 131 additions and 24 deletions

View File

@@ -294,7 +294,11 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer {
const tileSource = tileLayer.getSource();
const tileGrid = tileSource.getTileGridForProjection(viewState.projection);
const tileTextureCache = this.tileTextureCache_;
const tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
const tileRange = tileGrid.getTileRangeForExtentAndZ(
extent,
z,
this.tempTileRange_
);
const tileSourceKey = getUid(tileSource);
if (!(tileSourceKey in frameState.wantedTiles)) {

View File

@@ -6,7 +6,7 @@ import TileRange, {
} from '../TileRange.js';
import {DEFAULT_TILE_SIZE} from './common.js';
import {assert} from '../asserts.js';
import {clamp} from '../math.js';
import {ceil, clamp, floor} from '../math.js';
import {createOrUpdate, getTopLeft} from '../extent.js';
import {createOrUpdate as createOrUpdateTileCoord} from '../tilecoord.js';
import {isSorted, linearFindNearest} from '../array.js';
@@ -18,6 +18,12 @@ import {toSize} from '../size.js';
*/
const tmpTileCoord = [0, 0, 0];
/**
* Number of decimal digits to consider in integer values when rounding.
* @type {number}
*/
const DECIMALS = 5;
/**
* @typedef {Object} Options
* @property {import("../extent.js").Extent} [extent] Extent for the tile grid. No tiles outside this
@@ -520,19 +526,15 @@ class TileGrid {
const origin = this.getOrigin(z);
const tileSize = toSize(this.getTileSize(z), this.tmpSize_);
const adjustX = reverseIntersectionPolicy ? 0.5 : 0;
const adjustY = reverseIntersectionPolicy ? 0.5 : 0;
const xFromOrigin = Math.floor((x - origin[0]) / resolution + adjustX);
const yFromOrigin = Math.floor((origin[1] - y) / resolution + adjustY);
let tileCoordX = (scale * xFromOrigin) / tileSize[0];
let tileCoordY = (scale * yFromOrigin) / tileSize[1];
let tileCoordX = (scale * (x - origin[0])) / resolution / tileSize[0];
let tileCoordY = (scale * (origin[1] - y)) / resolution / tileSize[1];
if (reverseIntersectionPolicy) {
tileCoordX = Math.ceil(tileCoordX) - 1;
tileCoordY = Math.ceil(tileCoordY) - 1;
tileCoordX = ceil(tileCoordX, DECIMALS) - 1;
tileCoordY = ceil(tileCoordY, DECIMALS) - 1;
} else {
tileCoordX = Math.floor(tileCoordX);
tileCoordY = Math.floor(tileCoordY);
tileCoordX = floor(tileCoordX, DECIMALS);
tileCoordY = floor(tileCoordY, DECIMALS);
}
return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);
@@ -558,19 +560,15 @@ class TileGrid {
const resolution = this.getResolution(z);
const tileSize = toSize(this.getTileSize(z), this.tmpSize_);
const adjustX = reverseIntersectionPolicy ? 0.5 : 0;
const adjustY = reverseIntersectionPolicy ? 0.5 : 0;
const xFromOrigin = Math.floor((x - origin[0]) / resolution + adjustX);
const yFromOrigin = Math.floor((origin[1] - y) / resolution + adjustY);
let tileCoordX = xFromOrigin / tileSize[0];
let tileCoordY = yFromOrigin / tileSize[1];
let tileCoordX = (x - origin[0]) / resolution / tileSize[0];
let tileCoordY = (origin[1] - y) / resolution / tileSize[1];
if (reverseIntersectionPolicy) {
tileCoordX = Math.ceil(tileCoordX) - 1;
tileCoordY = Math.ceil(tileCoordY) - 1;
tileCoordX = ceil(tileCoordX, DECIMALS) - 1;
tileCoordY = ceil(tileCoordY, DECIMALS) - 1;
} else {
tileCoordX = Math.floor(tileCoordX);
tileCoordY = Math.floor(tileCoordY);
tileCoordX = floor(tileCoordX, DECIMALS);
tileCoordY = floor(tileCoordY, DECIMALS);
}
return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);