• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

keplergl / kepler.gl / 22361650031

24 Feb 2026 05:09PM UTC coverage: 61.612% (-0.2%) from 61.806%
22361650031

Pull #3219

github

web-flow
Merge 1d9b34cb5 into cc33b0c8f
Pull Request #3219: Update kepler-jupyter to use kepler.gl v3.2.0

6382 of 12288 branches covered (51.94%)

Branch coverage included in aggregate %.

13078 of 19297 relevant lines covered (67.77%)

81.44 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/layers/src/vector-tile/mvt-layer.ts
1
// SPDX-License-Identifier: MIT
2
// Copyright contributors to the kepler.gl project
3

4
import {Layer, LayersList} from '@deck.gl/core/typed';
5
import {ClipExtension} from '@deck.gl/extensions/typed';
6
import {
7
  MVTLayer as _MVTLayer,
8
  TileLayer,
9
  _getURLFromTemplate,
10
  _TileLoadProps,
11
  _Tile2DHeader
12
} from '@deck.gl/geo-layers/typed';
13
import {incrementVectorTileLoading, decrementVectorTileLoading} from './loading-counter';
14

15
/*
16
  Custom MVT layer that works with MVTSource and PMTileSource.
17
  Changes:
18
    - getTileData: handles props.getTileData.
19
    - renderSubLayers: removed coordinates logic present in original MVTLayer:renderSubLayers.
20
    - renderSubLayers: set clipBounds.
21
    - loaders.gl & older deck.gl: geojson-table: data = data.features
22
*/
23

24
// @ts-expect-error need to patch private methods because of newer loaders.gl
25
export class MVTLayer<ExtraProps> extends _MVTLayer<ExtraProps> {
26
  async getTileData(tile: _TileLoadProps): Promise<any> {
27
    const {getTileData} = this.props;
×
28
    const {data} = this.state;
×
29

30
    tile.url =
×
31
      typeof data === 'string' || Array.isArray(data) ? _getURLFromTemplate(data, tile) : null;
×
32
    if (getTileData) {
×
33
      incrementVectorTileLoading();
×
34
      try {
×
35
        return await getTileData(tile);
×
36
      } finally {
37
        decrementVectorTileLoading();
×
38
      }
39
    }
40
    return null;
×
41
  }
42

43
  renderSubLayers(
44
    props: TileLayer['props'] & {
45
      id: string;
46
      data: any;
47
      _offset: number;
48
      tile: any;
49
      clipBounds?: number[];
50
    }
51
  ): Layer | null | LayersList {
52
    const {boundingBox} = props.tile;
×
53

54
    props.autoHighlight = true;
×
55

56
    if (boundingBox) {
×
57
      props.clipBounds = [...boundingBox[0], ...boundingBox[1]];
×
58
      props.extensions = [...(props.extensions || []), new ClipExtension()];
×
59
    }
60

61
    return this.props.renderSubLayers(props);
×
62
  }
63

64
  getHighlightedObjectIndex(tile: _Tile2DHeader): number {
65
    const {hoveredFeatureId, hoveredFeatureLayerName} = this.state;
×
66
    const {uniqueIdProperty, highlightedFeatureId} = this.props;
×
67
    let data = tile.content;
×
68
    data = data?.shape === 'geojson-table' ? data.features : data;
×
69

70
    const isHighlighted = isFeatureIdDefined(highlightedFeatureId);
×
71
    const isFeatureIdPresent = isFeatureIdDefined(hoveredFeatureId) || isHighlighted;
×
72

73
    if (!isFeatureIdPresent) {
×
74
      return -1;
×
75
    }
76

77
    const featureIdToHighlight = isHighlighted ? highlightedFeatureId : hoveredFeatureId;
×
78

79
    // Iterable data
80
    if (Array.isArray(data)) {
×
81
      return data.findIndex(feature => {
×
82
        const isMatchingId = getFeatureUniqueId(feature, uniqueIdProperty) === featureIdToHighlight;
×
83
        const isMatchingLayer =
84
          isHighlighted || getFeatureLayerName(feature) === hoveredFeatureLayerName;
×
85
        return isMatchingId && isMatchingLayer;
×
86
      });
87
    }
88

89
    return -1;
×
90
  }
91
}
92

93
function getFeatureUniqueId(feature, uniqueIdProperty: string | undefined) {
94
  if (feature.properties && uniqueIdProperty) {
×
95
    return feature.properties[uniqueIdProperty];
×
96
  }
97

98
  if ('id' in feature) {
×
99
    return feature.id;
×
100
  }
101

102
  return undefined;
×
103
}
104

105
function getFeatureLayerName(feature): string | null {
106
  return feature.properties?.layerName || null;
×
107
}
108

109
function isFeatureIdDefined(value: unknown): boolean {
110
  return value !== undefined && value !== null && value !== '';
×
111
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc