Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v9 audit tile layer types #8387

Merged
merged 6 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions modules/carto/src/layers/spatial-index-tile-layer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ export default class SpatialIndexTileLayer<
static defaultProps = defaultProps;

state!: TileLayer<DataT>['state'] & {
hoveredFeatureId: number | null;
hoveredFeatureId: BigInt | number | null;
highlightColor: number[];
};

protected _updateAutoHighlight(info: PickingInfo): void {
const {hoveredFeatureId} = this.state;
const hoveredFeature = info.object;
let newHoveredFeatureId;
let newHoveredFeatureId: BigInt | number | null = null;

if (hoveredFeature) {
newHoveredFeatureId = hoveredFeature.id;
Expand Down Expand Up @@ -79,6 +79,7 @@ export default class SpatialIndexTileLayer<
}

_featureInTile(tile: Tile2DHeader, featureId: BigInt | number) {
// TODO: Tile2DHeader index should be generic for H3TileIndex or QuadbinTileIndex
const tileset = this.state.tileset!;
const tileZoom = tileset.getTileZoom(tile.index);
// @ts-ignore
Expand Down
14 changes: 5 additions & 9 deletions modules/geo-layers/src/mvt-layer/find-index-binary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,12 @@ const GEOM_TYPES = ['points', 'lines', 'polygons'];
* Return the index of feature (numericProps or featureIds) for given feature id
* Example: findIndexBinary(data, 'id', 33) will return the index in the array of numericProps
* of the feature 33.
* @param {Object} data - The data in binary format
* @param {String} uniqueIdProperty - Name of the unique id property
* @param {Number|String} featureId - feature id to find
* @param {String} layerName - the layer to search in
*/
export default function findIndexBinary(
data: BinaryFeatureCollection,
uniqueIdProperty: string,
featureId: string | number,
layerName: string
data: BinaryFeatureCollection, // The data in binary format
uniqueIdProperty: string, // Name of the unique id property
featureId: string | number, // feature id to find
layerName: string | null // the layer to search in
): number {
for (const gt of GEOM_TYPES) {
const index = data[gt] && findIndexByType(data[gt], uniqueIdProperty, featureId, layerName);
Expand All @@ -37,7 +33,7 @@ function findIndexByType(
geomData: FeatureTypes,
uniqueIdProperty: string,
featureId: string | number,
layerName: string
layerName: string | null
): number {
const featureIds = geomData.featureIds.value;

Expand Down
30 changes: 17 additions & 13 deletions modules/geo-layers/src/mvt-layer/mvt-layer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,12 @@ type ParsedMvtTile = Feature[] | BinaryFeatureCollection;
/** All props supported by the MVTLayer */
export type MVTLayerProps = _MVTLayerProps &
Omit<GeoJsonLayerProps, 'data'> &
TileLayerProps<ParsedMvtTile>;
Omit<TileLayerProps<ParsedMvtTile>, 'data'>;

/** Props added by the MVTLayer */
export type _MVTLayerProps = {
data: TileJson | URLTemplate;

/** Called if `data` is a TileJSON URL when it is successfully fetched. */
onDataLoad?: ((tilejson: TileJson | null) => void) | null;

Expand Down Expand Up @@ -106,8 +108,8 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<
state!: TileLayer<ParsedMvtTile>['state'] & {
binary: boolean;
data: URLTemplate;
tileJSON: any;
highlightColor: number[];
tileJSON: TileJson | null;
highlightColor?: number[];
hoveredFeatureId: number | string | null;
hoveredFeatureLayerName: string | null;
};
Expand All @@ -119,12 +121,14 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<
this.setState({
binary,
data: null,
tileJSON: null
tileJSON: null,
hoveredFeatureId: null,
hoveredFeatureLayerName: null
});
}

get isLoaded(): boolean {
return Boolean(this.state && this.state.data && this.state.tileset && super.isLoaded);
return Boolean(this.state?.data && super.isLoaded);
}

updateState({props, oldProps, context, changeFlags}: UpdateParameters<this>) {
Expand All @@ -145,8 +149,8 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<

/* eslint-disable complexity */
private async _updateTileData(): Promise<void> {
let data: any = this.props.data;
let tileJSON: any = null;
let data = this.props.data;
let tileJSON: TileJson | null = null;

if (typeof data === 'string' && !isURLTemplate(data)) {
const {onDataLoad, fetch} = this.props;
Expand All @@ -161,7 +165,7 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<
if (onDataLoad) {
onDataLoad(tileJSON, {propName: 'data', layer: this});
}
} else if (data.tilejson) {
} else if (data && typeof data === 'object' && 'tilejson' in data) {
tileJSON = data;
}

Expand All @@ -174,7 +178,7 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<

_getTilesetOptions(): Tileset2DProps {
const opts = super._getTilesetOptions();
const tileJSON: TileJson | null | undefined = this.state.tileJSON;
const tileJSON: TileJson | null = this.state.tileJSON;
const {minZoom, maxZoom} = this.props;

if (tileJSON) {
Expand Down Expand Up @@ -268,8 +272,8 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<

const {hoveredFeatureId, hoveredFeatureLayerName} = this.state;
const hoveredFeature = info.object;
let newHoveredFeatureId;
let newHoveredFeatureLayerName;
let newHoveredFeatureId: string | number | null = null;
let newHoveredFeatureLayerName: string | null = null;

if (hoveredFeature) {
newHoveredFeatureId = getFeatureUniqueId(hoveredFeature, uniqueIdProperty);
Expand Down Expand Up @@ -333,7 +337,7 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<
return -1;
}

const featureIdToHighlight = isHighlighted ? highlightedFeatureId : hoveredFeatureId;
const featureIdToHighlight = isHighlighted ? highlightedFeatureId! : hoveredFeatureId!;

// Iterable data
if (Array.isArray(data)) {
Expand All @@ -350,7 +354,7 @@ export default class MVTLayer<ExtraProps extends {} = {}> extends TileLayer<
return findIndexBinary(
data,
uniqueIdProperty,
featureIdToHighlight!,
featureIdToHighlight,
isHighlighted ? '' : hoveredFeatureLayerName!
);
}
Expand Down
11 changes: 5 additions & 6 deletions modules/geo-layers/src/tile-layer/tile-layer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,12 +171,11 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
}

get isLoaded(): boolean {
const selectedTiles = this.state?.tileset?.selectedTiles;
return selectedTiles
? selectedTiles.every(
tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
)
: false;
return Boolean(
this.state?.tileset?.selectedTiles?.every(
tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
)
);
}

shouldUpdateState({changeFlags}): boolean {
Expand Down
3 changes: 2 additions & 1 deletion modules/geo-layers/src/tileset-2d/tile-2d-header.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* eslint-env browser */
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> = {
requestScheduler: RequestScheduler;
Expand All @@ -17,7 +18,7 @@ export class Tile2DHeader<DataT = any> {
children: Tile2DHeader[] | null;
content: DataT | null;
state?: number;
layers?: any[] | null; // Layer[] | null
layers?: Layer[] | null;

id!: string; // assigned _always_ with result of `getTileId`
zoom!: number; // assigned _always_ with result of `getTileZoom`
Expand Down
2 changes: 1 addition & 1 deletion modules/geo-layers/src/tileset-2d/tile-2d-traversal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ class OSMNode {
export function getOSMTileIndices(
viewport: Viewport,
maxZ: number,
zRange?: ZRange | null,
zRange: ZRange | null,
bounds?: Bounds
): TileIndex[] {
const project: ((xyz: number[]) => number[]) | null =
Expand Down
10 changes: 7 additions & 3 deletions modules/geo-layers/src/tileset-2d/tileset-2d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ export class Tileset2D {

private _cacheByteSize: number;
private _viewport: Viewport | null;
private _zRange?: ZRange | null;
private _zRange: ZRange | null;
private _selectedTiles: Tile2DHeader[] | null;
private _frameNumber: number;
private _modelMatrix: Matrix4;
Expand Down Expand Up @@ -162,6 +162,7 @@ export class Tileset2D {

// Cache the last processed viewport
this._viewport = null;
this._zRange = null;
this._selectedTiles = null;
this._frameNumber = 0;

Expand Down Expand Up @@ -226,7 +227,10 @@ export class Tileset2D {
*/
update(
viewport: Viewport,
{zRange, modelMatrix}: {zRange?: ZRange | null; modelMatrix?: NumericArray | null} = {}
{zRange, modelMatrix}: {zRange: ZRange | null; modelMatrix: NumericArray | null} = {
zRange: null,
modelMatrix: null
}
): number {
const modelMatrixAsMatrix4 = modelMatrix ? new Matrix4(modelMatrix) : new Matrix4();
const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
Expand Down Expand Up @@ -326,7 +330,7 @@ export class Tileset2D {
viewport: Viewport;
maxZoom?: number;
minZoom?: number;
zRange?: ZRange | null;
zRange: ZRange | null;
tileSize?: number;
modelMatrix?: Matrix4;
modelMatrixInverse?: Matrix4;
Expand Down
4 changes: 2 additions & 2 deletions modules/geo-layers/src/tileset-2d/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export function getCullBounds({
/** Current viewport */
viewport: Viewport;
/** Current z range */
z?: ZRange | number | null;
z: ZRange | number | null;
/** Culling rectangle in screen space */
cullRect: {x: number; y: number; width: number; height: number};
}): [number, number, number, number][] {
Expand Down Expand Up @@ -273,7 +273,7 @@ export function getTileIndices({
viewport: Viewport;
maxZoom?: number;
minZoom?: number;
zRange?: ZRange | null;
zRange: ZRange | null;
extent?: Bounds;
tileSize?: number;
modelMatrix?: Matrix4;
Expand Down
Loading