Skip to content
8 changes: 2 additions & 6 deletions modules/carto/src/layers/h3-tileset-2d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<H3TileIndex> {
/**
* 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();
Expand All @@ -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);
Expand Down
20 changes: 11 additions & 9 deletions modules/carto/src/layers/quadbin-tileset-2d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<QuadbinTileIndex> {
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)};
}
Expand Down
22 changes: 11 additions & 11 deletions modules/geo-layers/src/tileset-2d/tile-2d-header.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<DataT = any> = {
export type TileLoadDataProps<DataT = any, TileIndexT = TileIndex> = {
requestScheduler: RequestScheduler;
getData: (props: TileLoadProps) => Promise<DataT>;
onLoad: (tile: Tile2DHeader<DataT>) => void;
onError: (error: any, tile: Tile2DHeader<DataT>) => void;
getData: (props: TileLoadProps<TileIndexT>) => Promise<DataT>;
onLoad: (tile: Tile2DHeader<DataT, TileIndexT>) => void;
onError: (error: any, tile: Tile2DHeader<DataT, TileIndexT>) => void;
};

export class Tile2DHeader<DataT = any> {
index: TileIndex;
export class Tile2DHeader<DataT = any, TileIndexT = TileIndex> {
index: TileIndexT;
isVisible: boolean;
isSelected: boolean;
parent: Tile2DHeader | null;
children: Tile2DHeader[] | null;
parent: Tile2DHeader<DataT, TileIndexT> | null;
children: Tile2DHeader<DataT, TileIndexT>[] | null;
content: DataT | null;
state?: number;
layers?: Layer[] | null;
Expand All @@ -37,7 +37,7 @@ export class Tile2DHeader<DataT = any> {
private _needsReload: boolean;
private _bbox!: TileBoundingBox;

constructor(index: TileIndex) {
constructor(index: TileIndexT) {
this.index = index;
this.isVisible = false;
this.isSelected = false;
Expand Down Expand Up @@ -109,7 +109,7 @@ export class Tile2DHeader<DataT = any> {
requestScheduler,
onLoad,
onError
}: TileLoadDataProps<DataT>): Promise<void> {
}: TileLoadDataProps<DataT, TileIndexT>): Promise<void> {
const {index, id, bbox, userData, zoom} = this;
const loaderId = this._loaderId;

Expand Down Expand Up @@ -170,7 +170,7 @@ export class Tile2DHeader<DataT = any> {
}
}

loadData(opts: TileLoadDataProps): Promise<void> {
loadData(opts: TileLoadDataProps<DataT, TileIndexT>): Promise<void> {
this._isLoaded = false;
this._isCancelled = false;
this._needsReload = false;
Expand Down
Loading
Loading