From 3e5b0c0e88a6f96664e7b3f8a92aa1e71aa858fa Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 10:47:58 -0400 Subject: [PATCH 01/10] Make TileLoadProps generic --- modules/geo-layers/src/tileset-2d/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/types.ts b/modules/geo-layers/src/tileset-2d/types.ts index 4eafea395d6..e810047356d 100644 --- a/modules/geo-layers/src/tileset-2d/types.ts +++ b/modules/geo-layers/src/tileset-2d/types.ts @@ -13,8 +13,8 @@ export type TileBoundingBox = NonGeoBoundingBox | GeoBoundingBox; export type TileIndex = {x: number; y: number; z: number}; -export type TileLoadProps = { - index: TileIndex; +export type TileLoadProps = { + index: TileIndexT; id: string; bbox: TileBoundingBox; url?: string | null; From ee03f913d8562d1bd7ebf8b14215246159fb7070 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 10:50:03 -0400 Subject: [PATCH 02/10] Tile2dheader generic over tile index --- .../src/tileset-2d/tile-2d-header.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tile-2d-header.ts b/modules/geo-layers/src/tileset-2d/tile-2d-header.ts index 32406256cbc..9b9d49da147 100644 --- a/modules/geo-layers/src/tileset-2d/tile-2d-header.ts +++ b/modules/geo-layers/src/tileset-2d/tile-2d-header.ts @@ -7,19 +7,19 @@ import {RequestScheduler} from '@loaders.gl/loader-utils'; import {TileBoundingBox, TileIndex, TileLoadProps} from './types'; import type {Layer} from '@deck.gl/core'; -export type TileLoadDataProps = { +export type TileLoadDataProps = { requestScheduler: RequestScheduler; - getData: (props: TileLoadProps) => Promise; - onLoad: (tile: Tile2DHeader) => void; - onError: (error: any, tile: Tile2DHeader) => void; + getData: (props: TileLoadProps) => Promise; + onLoad: (tile: Tile2DHeader) => void; + onError: (error: any, tile: Tile2DHeader) => void; }; -export class Tile2DHeader { - index: TileIndex; +export class Tile2DHeader { + index: TileIndexT; isVisible: boolean; isSelected: boolean; - parent: Tile2DHeader | null; - children: Tile2DHeader[] | null; + parent: Tile2DHeader | null; + children: Tile2DHeader[] | null; content: DataT | null; state?: number; layers?: Layer[] | null; @@ -37,7 +37,7 @@ export class Tile2DHeader { private _needsReload: boolean; private _bbox!: TileBoundingBox; - constructor(index: TileIndex) { + constructor(index: TileIndexT) { this.index = index; this.isVisible = false; this.isSelected = false; @@ -109,7 +109,7 @@ export class Tile2DHeader { requestScheduler, onLoad, onError - }: TileLoadDataProps): Promise { + }: TileLoadDataProps): Promise { const {index, id, bbox, userData, zoom} = this; const loaderId = this._loaderId; @@ -170,7 +170,7 @@ export class Tile2DHeader { } } - loadData(opts: TileLoadDataProps): Promise { + loadData(opts: TileLoadDataProps): Promise { this._isLoaded = false; this._isCancelled = false; this._needsReload = false; From d46490b642349a18ca919e5a9461387aff74232f Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 10:58:18 -0400 Subject: [PATCH 03/10] Clean edits to tileset-2d.ts --- .../geo-layers/src/tileset-2d/tileset-2d.ts | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index e0752ec13a8..74051a9d787 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -55,9 +55,9 @@ const STRATEGIES = { [STRATEGY_NEVER]: () => {} }; -export type Tileset2DProps = { +export type Tileset2DProps = { /** `getTileData` is called to retrieve the data of each tile. */ - getTileData: (props: TileLoadProps) => Promise | DataT; + getTileData: (props: TileLoadProps) => Promise | DataT; /** The bounding box of the layer's data. */ extent?: number[] | null; @@ -86,11 +86,11 @@ export type Tileset2DProps = { /** The maximum zoom level at which tiles are visible. @default null */ visibleMaxZoom?: number | null; /** Called when a tile successfully loads. */ - onTileLoad?: (tile: Tile2DHeader) => void; + onTileLoad?: (tile: Tile2DHeader) => void; /** Called when a tile is cleared from cache. */ - onTileUnload?: (tile: Tile2DHeader) => void; + onTileUnload?: (tile: Tile2DHeader) => void; /** Called when a tile failed to load. */ - onTileError?: (err: any, tile: Tile2DHeader) => void; + onTileError?: (err: any, tile: Tile2DHeader) => void; // onTileLoad: (tile: Tile2DHeader) => void; // onTileUnload: (tile: Tile2DHeader) => void; @@ -126,17 +126,17 @@ export const DEFAULT_TILESET2D_PROPS: Omit, 'getTileDat * Manages loading and purging of tile data. This class caches recently visited tiles * and only creates new tiles if they are present. */ -export class Tileset2D { - protected opts: Required; +export class Tileset2D { + protected opts: Required>; private _requestScheduler: RequestScheduler; - private _cache: Map; + private _cache: Map>; private _dirty: boolean; - private _tiles: Tile2DHeader[]; + private _tiles: Tile2DHeader[]; private _cacheByteSize: number; private _viewport: Viewport | null; private _zRange: ZRange | null; - private _selectedTiles: Tile2DHeader[] | null; + private _selectedTiles: Tile2DHeader[] | null; private _frameNumber: number; private _modelMatrix: Matrix4; private _modelMatrixInverse: Matrix4; @@ -144,7 +144,7 @@ export class Tileset2D { private _maxZoom?: number; private _minZoom?: number; - private onTileLoad: (tile: Tile2DHeader) => void; + private onTileLoad: (tile: Tile2DHeader) => void; /** * Takes in a function that returns tile data, a cache size, and a max and a min zoom level. @@ -189,7 +189,7 @@ export class Tileset2D { return this._tiles; } - get selectedTiles(): Tile2DHeader[] | null { + get selectedTiles(): Tile2DHeader[] | null { return this._selectedTiles; } @@ -201,7 +201,7 @@ export class Tileset2D { return this._selectedTiles !== null && this._selectedTiles.some(tile => tile.needsReload); } - setOptions(opts: Tileset2DProps): void { + setOptions(opts: Tileset2DProps): void { Object.assign(this.opts, opts); if (Number.isFinite(opts.maxZoom)) { this._maxZoom = Math.floor(opts.maxZoom as number); @@ -227,7 +227,7 @@ export class Tileset2D { reloadAll(): void { for (const id of this._cache.keys()) { - const tile = this._cache.get(id) as Tile2DHeader; + const tile = this._cache.get(id)!; if (!this._selectedTiles || !this._selectedTiles.includes(tile)) { this._cache.delete(id); } else { @@ -297,7 +297,7 @@ export class Tileset2D { // eslint-disable-next-line complexity isTileVisible( - tile: Tile2DHeader, + tile: Tile2DHeader, cullRect?: {x: number; y: number; width: number; height: number}, modelMatrix?: Matrix4 | null ): boolean { @@ -357,7 +357,7 @@ export class Tileset2D { modelMatrix?: Matrix4; modelMatrixInverse?: Matrix4; zoomOffset?: number; - }): TileIndex[] { + }): TileIndexT[] { const {tileSize, extent, zoomOffset, visibleMinZoom, visibleMaxZoom} = this.opts; return getTileIndices({ viewport, @@ -440,7 +440,7 @@ export class Tileset2D { private _pruneRequests(): void { const {maxRequests = 0} = this.opts; - const abortCandidates: Tile2DHeader[] = []; + const abortCandidates: Tile2DHeader[] = []; let ongoingRequestCount = 0; for (const tile of this._cache.values()) { // Keep track of all the ongoing requests @@ -521,15 +521,18 @@ export class Tileset2D { } /* eslint-enable complexity */ - private _getTile(index: TileIndex, create: true): Tile2DHeader; - private _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined; - private _getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined { + private _getTile(index: TileIndexT, create: true): Tile2DHeader; + private _getTile(index: TileIndexT, create?: false): Tile2DHeader | undefined; + private _getTile( + index: TileIndexT, + create?: boolean + ): Tile2DHeader | undefined { const id = this.getTileId(index); let tile = this._cache.get(id); let needsReload = false; if (!tile && create) { - tile = new Tile2DHeader(index); + tile = new Tile2DHeader(index); Object.assign(tile, this.getTileMetadata(tile.index)); Object.assign(tile, {id, zoom: this.getTileZoom(tile.index)}); needsReload = true; @@ -551,7 +554,9 @@ export class Tileset2D { return tile; } - _getNearestAncestor(tile: Tile2DHeader): Tile2DHeader | null { + _getNearestAncestor( + tile: Tile2DHeader + ): Tile2DHeader | null { const {_minZoom = 0} = this; let index = tile.index; From b94604ded3a449f63e3fd1d901c2b062347e0d3e Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 11:28:29 -0400 Subject: [PATCH 04/10] Define tileset2d props with any --- modules/geo-layers/src/tileset-2d/tileset-2d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index 74051a9d787..0b1175f5d8a 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -99,7 +99,7 @@ export type Tileset2DProps = { // sonViewportLoad?: ((tiles: Tile2DHeader[]) => void) | null; }; -export const DEFAULT_TILESET2D_PROPS: Omit, 'getTileData'> = { +export const DEFAULT_TILESET2D_PROPS: Omit>, 'getTileData'> = { extent: null, tileSize: 512, @@ -150,7 +150,7 @@ export class Tileset2D { * Takes in a function that returns tile data, a cache size, and a max and a min zoom level. * Cache size defaults to 5 * number of tiles in the current viewport */ - constructor(opts: Tileset2DProps) { + constructor(opts: Tileset2DProps) { this.opts = {...DEFAULT_TILESET2D_PROPS, ...opts}; this.setOptions(this.opts); From 3be596ea9004f63d53e5d463d60429bbe115b43a Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 11:32:47 -0400 Subject: [PATCH 05/10] RefinementStrategy generic over TileIndexT --- modules/geo-layers/src/tileset-2d/tileset-2d.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index 0b1175f5d8a..15f2caf03a9 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -40,12 +40,12 @@ export const STRATEGY_NEVER = 'never'; export const STRATEGY_REPLACE = 'no-overlap'; export const STRATEGY_DEFAULT = 'best-available'; -export type RefinementStrategyFunction = (tiles: Tile2DHeader[]) => void; -export type RefinementStrategy = +export type RefinementStrategyFunction = (tiles: Tile2DHeader[]) => void; +export type RefinementStrategy = | 'never' | 'no-overlap' | 'best-available' - | RefinementStrategyFunction; + | RefinementStrategyFunction; const DEFAULT_CACHE_SCALE = 5; @@ -72,7 +72,7 @@ export type Tileset2DProps = { /** The maximum memory used for caching tiles. @default null */ maxCacheByteSize?: number | null; /** How the tile layer refines the visibility of tiles. @default 'best-available' */ - refinementStrategy?: RefinementStrategy; + refinementStrategy?: RefinementStrategy; /** Range of minimum and maximum heights in the tile. */ zRange?: ZRange | null; /** The maximum number of concurrent getTileData calls. @default 6 */ @@ -577,7 +577,7 @@ export class Tileset2D { // For all the selected && pending tiles: // - pick the closest ancestor as placeholder // - if no ancestor is visible, pick the closest children as placeholder -function updateTileStateDefault(allTiles: Tile2DHeader[]) { +function updateTileStateDefault(allTiles: Tile2DHeader[]) { for (const tile of allTiles) { tile.state = 0; } @@ -592,7 +592,7 @@ function updateTileStateDefault(allTiles: Tile2DHeader[]) { } // Until a selected tile and all its selected siblings are loaded, use the closest ancestor as placeholder -function updateTileStateReplace(allTiles: Tile2DHeader[]) { +function updateTileStateReplace(allTiles: Tile2DHeader[]) { for (const tile of allTiles) { tile.state = 0; } @@ -618,8 +618,8 @@ function updateTileStateReplace(allTiles: Tile2DHeader[]) { } // Walk up the tree until we find one ancestor that is loaded. Returns true if successful. -function getPlaceholderInAncestors(startTile: Tile2DHeader) { - let tile: Tile2DHeader | null = startTile; +function getPlaceholderInAncestors(startTile: Tile2DHeader) { + let tile: Tile2DHeader | null = startTile; while (tile) { if (tile.isLoaded || tile.content) { tile.state! |= TILE_STATE_VISIBLE; From 542e4f10ed508c05b04822ce34d39b94837a437e Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 11:43:02 -0400 Subject: [PATCH 06/10] Document overrides --- .../geo-layers/src/tileset-2d/tileset-2d.ts | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index 15f2caf03a9..e87e6e0df83 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -374,28 +374,41 @@ export class Tileset2D { }); } - /** Returns unique string key for a tile index */ - getTileId(index: TileIndex) { - return `${index.x}-${index.y}-${index.z}`; + /** Returns unique string key for a tile index. + * + * Must be overridden if TileIndexT is not the same as TileIndex. + */ + getTileId(index: TileIndexT): string { + const {x, y, z} = index as unknown as TileIndex; + return `${x}-${y}-${z}`; } - /** Returns a zoom level for a tile index */ - getTileZoom(index: TileIndex) { - return index.z; + /** Returns a zoom level for a tile index. + * + * Must be overridden if TileIndexT is not the same as TileIndex. + */ + getTileZoom(index: TileIndexT): number { + return (index as unknown as TileIndex).z; } - /** Returns additional metadata to add to tile, bbox by default */ - getTileMetadata(index: TileIndex): Record { + /** Returns additional metadata to add to tile, bbox by default. + * + * Must be overridden if TileIndexT is not the same as TileIndex and does not + * correspond to a web mercator tile index. + */ + getTileMetadata(index: TileIndexT): Record { const {tileSize} = this.opts; - return {bbox: tileToBoundingBox(this._viewport!, index.x, index.y, index.z, tileSize)}; + const {x, y, z} = index as unknown as TileIndex; + return {bbox: tileToBoundingBox(this._viewport!, x, y, z, tileSize)}; } - /** Returns index of the parent tile */ - getParentIndex(index: TileIndex) { - const x = Math.floor(index.x / 2); - const y = Math.floor(index.y / 2); - const z = index.z - 1; - return {x, y, z}; + /** Returns index of the parent tile. + * + * Must be overridden if TileIndexT is not the same as TileIndex. + */ + getParentIndex(index: TileIndexT): TileIndexT { + const {x, y, z} = index as unknown as TileIndex; + return {x: Math.floor(x / 2), y: Math.floor(y / 2), z: z - 1} as unknown as TileIndexT; } // Returns true if any tile's visibility changed From 1ad17bce066935d13bcf1e9dde410ecf4941286a Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 11:44:03 -0400 Subject: [PATCH 07/10] Override --- modules/geo-layers/src/tileset-2d/tileset-2d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index e87e6e0df83..d1b1e9d2fe3 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -359,6 +359,8 @@ export class Tileset2D { zoomOffset?: number; }): TileIndexT[] { const {tileSize, extent, zoomOffset, visibleMinZoom, visibleMaxZoom} = this.opts; + // Base implementation assumes TileIndexT = TileIndex; subclasses with custom + // index types must override. return getTileIndices({ viewport, maxZoom, @@ -371,7 +373,7 @@ export class Tileset2D { zoomOffset, visibleMinZoom, visibleMaxZoom - }); + }) as unknown as TileIndexT[]; } /** Returns unique string key for a tile index. From 461d0b69f72ad026eac821cdc3df3d695b907bc3 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 11:59:00 -0400 Subject: [PATCH 08/10] H3Tileset extends generic --- modules/carto/src/layers/h3-tileset-2d.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/carto/src/layers/h3-tileset-2d.ts b/modules/carto/src/layers/h3-tileset-2d.ts index fecf0e48173..5dc09092f01 100644 --- a/modules/carto/src/layers/h3-tileset-2d.ts +++ b/modules/carto/src/layers/h3-tileset-2d.ts @@ -119,13 +119,13 @@ export function getHexagonResolution( return Math.max(0, Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)); } -export default class H3Tileset2D extends Tileset2D { +export default class H3Tileset2D extends Tileset2D { /** * Returns all tile indices in the current viewport. If the current zoom level is smaller * than minZoom, return an empty array. If the current zoom level is greater than maxZoom, * return tiles that are on maxZoom. */ - // @ts-expect-error Tileset2D should be generic over TileIndex + // @ts-expect-error viewport is untyped; latitude/longitude are only on WebMercator/Globe viewports getTileIndices({viewport, minZoom, maxZoom}): H3TileIndex[] { if (viewport.latitude === undefined) return []; const [west, south, east, north] = viewport.getBounds(); @@ -152,22 +152,18 @@ export default class H3Tileset2D extends Tileset2D { return indices.map(i => ({i})); } - // @ts-expect-error Tileset2D should be generic over TileIndex getTileId({i}: H3TileIndex): string { return i; } - // @ts-expect-error Tileset2D should be generic over TileIndex getTileMetadata({i}: H3TileIndex) { return {bbox: tileToBoundingBox(i)}; } - // @ts-expect-error Tileset2D should be generic over TileIndex getTileZoom({i}: H3TileIndex): number { return getResolution(i); } - // @ts-expect-error Tileset2D should be generic over TileIndex getParentIndex(index: H3TileIndex): H3TileIndex { const resolution = getResolution(index.i); const i = cellToParent(index.i, resolution - 1); From a6e778f31aa22b90380aae6b301bfa29fad37f8a Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 12:04:16 -0400 Subject: [PATCH 09/10] Quadbin remove ts expect error --- .../carto/src/layers/quadbin-tileset-2d.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/carto/src/layers/quadbin-tileset-2d.ts b/modules/carto/src/layers/quadbin-tileset-2d.ts index b2e6b669456..2e658f5248d 100644 --- a/modules/carto/src/layers/quadbin-tileset-2d.ts +++ b/modules/carto/src/layers/quadbin-tileset-2d.ts @@ -5,35 +5,37 @@ import {_Tileset2D as Tileset2D} from '@deck.gl/geo-layers'; import {bigIntToHex, cellToParent, cellToTile, getResolution, tileToCell} from 'quadbin'; +// Shape returned by the base Tileset2D.getTileIndices and consumed by quadbin's +// tileToCell/cellToTile — same as TileIndex from geo-layers, inlined here to avoid +// a dependency on the internal type. +type XYZTileIndex = {x: number; y: number; z: number}; + // For calculations bigint representation is used, but // for constructing URL also provide the hexidecimal value type QuadbinTileIndex = {q: bigint; i?: string}; -export default class QuadbinTileset2D extends Tileset2D { - // @ts-expect-error for spatial indices, TileSet2d should be parametrized by TileIndexT +export default class QuadbinTileset2D extends Tileset2D { getTileIndices(opts): QuadbinTileIndex[] { - return super - .getTileIndices(opts) + // super.getTileIndices is typed as QuadbinTileIndex[] (from the generic) but the + // default base implementation actually returns {x,y,z} tiles, which we convert here. + return (super.getTileIndices(opts) as unknown as XYZTileIndex[]) .map(tileToCell) .map(q => ({q, i: bigIntToHex(q)})); } - // @ts-expect-error TileIndex must be generic getTileId({q, i}: QuadbinTileIndex): string { return i || bigIntToHex(q); } - // @ts-expect-error TileIndex must be generic getTileMetadata({q}: QuadbinTileIndex) { - return super.getTileMetadata(cellToTile(q)); + // Base impl reads {x,y,z}; quadbin's cellToTile returns that shape. + return super.getTileMetadata(cellToTile(q) as unknown as QuadbinTileIndex); } - // @ts-expect-error TileIndex must be generic getTileZoom({q}: QuadbinTileIndex): number { return Number(getResolution(q)); } - // @ts-expect-error TileIndex must be generic getParentIndex({q}: QuadbinTileIndex): QuadbinTileIndex { return {q: cellToParent(q)}; } From b4f3e5b0be66fa8d7173b05559fd31aa1dc89f69 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 13 May 2026 12:17:31 -0400 Subject: [PATCH 10/10] prettier --- modules/geo-layers/src/tileset-2d/tileset-2d.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/geo-layers/src/tileset-2d/tileset-2d.ts b/modules/geo-layers/src/tileset-2d/tileset-2d.ts index d1b1e9d2fe3..43e91d7e935 100644 --- a/modules/geo-layers/src/tileset-2d/tileset-2d.ts +++ b/modules/geo-layers/src/tileset-2d/tileset-2d.ts @@ -40,7 +40,9 @@ export const STRATEGY_NEVER = 'never'; export const STRATEGY_REPLACE = 'no-overlap'; export const STRATEGY_DEFAULT = 'best-available'; -export type RefinementStrategyFunction = (tiles: Tile2DHeader[]) => void; +export type RefinementStrategyFunction = ( + tiles: Tile2DHeader[] +) => void; export type RefinementStrategy = | 'never' | 'no-overlap' @@ -538,10 +540,7 @@ export class Tileset2D { private _getTile(index: TileIndexT, create: true): Tile2DHeader; private _getTile(index: TileIndexT, create?: false): Tile2DHeader | undefined; - private _getTile( - index: TileIndexT, - create?: boolean - ): Tile2DHeader | undefined { + private _getTile(index: TileIndexT, create?: boolean): Tile2DHeader | undefined { const id = this.getTileId(index); let tile = this._cache.get(id); let needsReload = false; @@ -569,9 +568,7 @@ export class Tileset2D { return tile; } - _getNearestAncestor( - tile: Tile2DHeader - ): Tile2DHeader | null { + _getNearestAncestor(tile: Tile2DHeader): Tile2DHeader | null { const {_minZoom = 0} = this; let index = tile.index; @@ -633,7 +630,9 @@ function updateTileStateReplace(allTiles: Tile2DHeader(startTile: Tile2DHeader) { +function getPlaceholderInAncestors( + startTile: Tile2DHeader +) { let tile: Tile2DHeader | null = startTile; while (tile) { if (tile.isLoaded || tile.content) {