@deck.gl/carto 9.0.17 → 9.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,18 +1,18 @@
1
1
  import { default as H3TileLayer } from "./layers/h3-tile-layer.js";
2
+ import { default as HeatmapTileLayer } from "./layers/heatmap-tile-layer.js";
2
3
  import { default as _PointLabelLayer } from "./layers/point-label-layer.js";
3
4
  import { default as QuadbinTileLayer } from "./layers/quadbin-tile-layer.js";
4
- import { default as QuadbinHeatmapTileLayer } from "./layers/quadbin-heatmap-tile-layer.js";
5
5
  import { default as RasterTileLayer } from "./layers/raster-tile-layer.js";
6
6
  import { default as VectorTileLayer } from "./layers/vector-tile-layer.js";
7
7
  declare const CARTO_LAYERS: {
8
8
  H3TileLayer: typeof H3TileLayer;
9
+ HeatmapTileLayer: typeof HeatmapTileLayer;
9
10
  _PointLabelLayer: typeof _PointLabelLayer;
10
11
  QuadbinTileLayer: typeof QuadbinTileLayer;
11
- QuadbinHeatmapTileLayer: typeof QuadbinHeatmapTileLayer;
12
12
  RasterTileLayer: typeof RasterTileLayer;
13
13
  VectorTileLayer: typeof VectorTileLayer;
14
14
  };
15
- export { CARTO_LAYERS, H3TileLayer, _PointLabelLayer, QuadbinTileLayer, QuadbinHeatmapTileLayer, RasterTileLayer, VectorTileLayer };
15
+ export { CARTO_LAYERS, H3TileLayer, HeatmapTileLayer, _PointLabelLayer, QuadbinTileLayer, RasterTileLayer, VectorTileLayer };
16
16
  export { default as BASEMAP, GOOGLE_BASEMAPS as _GOOGLE_BASEMAPS, getStyleUrl as _getStyleUrl, fetchStyle as _fetchStyle, applyLayerGroupFilters as _applyLayerGroupFilters, STYLE_LAYER_GROUPS as _STYLE_LAYER_GROUPS } from "./basemap.js";
17
17
  export { default as colorBins } from "./style/color-bins-style.js";
18
18
  export { default as colorCategories } from "./style/color-categories-style.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,WAAW,EAAC,kCAA+B;AAC9D,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,sCAAmC;AACvE,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,uCAAoC;AACxE,OAAO,EAAC,OAAO,IAAI,uBAAuB,EAAC,+CAA4C;AACvF,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,sCAAmC;AACtE,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,sCAAmC;AACtE,QAAA,MAAM,YAAY;;;;;;;CAOjB,CAAC;AACF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,eAAe,EAChB,CAAC;AAEF,OAAO,EACL,OAAO,IAAI,OAAO,EAClB,eAAe,IAAI,gBAAgB,EACnC,WAAW,IAAI,YAAY,EAC3B,UAAU,IAAI,WAAW,EACzB,sBAAsB,IAAI,uBAAuB,EACjD,kBAAkB,IAAI,mBAAmB,EAC1C,qBAAkB;AACnB,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,oCAAiC;AAC9D,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,0CAAuC;AAC1E,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,0CAAuC;AAC1E,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAC,uBAAoB;AAC3D,OAAO,EAAC,iBAAiB,EAAC,yBAAsB;AAChD,YAAY,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,MAAM,EACN,OAAO,EACP,WAAW,EACX,eAAe,EACf,YAAY,EACZ,OAAO,IAAI,QAAQ,EACnB,eAAe,IAAI,gBAAgB,EACnC,aAAa,IAAI,cAAc,EAChC,uBAAoB;AAErB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EAChB,2BAAwB;AAEzB,QAAA,MAAM,aAAa;;;;;;;;;;;;;CAalB,CAAC;AAEF,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,eAAe,EAChB,CAAC;AAEF,YAAY,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC3B,2BAAwB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,WAAW,EAAC,kCAA+B;AAC9D,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,uCAAoC;AACxE,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,sCAAmC;AACvE,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,uCAAoC;AACxE,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,sCAAmC;AACtE,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,sCAAmC;AACtE,QAAA,MAAM,YAAY;;;;;;;CAOjB,CAAC;AACF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EAChB,CAAC;AAEF,OAAO,EACL,OAAO,IAAI,OAAO,EAClB,eAAe,IAAI,gBAAgB,EACnC,WAAW,IAAI,YAAY,EAC3B,UAAU,IAAI,WAAW,EACzB,sBAAsB,IAAI,uBAAuB,EACjD,kBAAkB,IAAI,mBAAmB,EAC1C,qBAAkB;AACnB,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,oCAAiC;AAC9D,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,0CAAuC;AAC1E,OAAO,EAAC,OAAO,IAAI,eAAe,EAAC,0CAAuC;AAC1E,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAC,uBAAoB;AAC3D,OAAO,EAAC,iBAAiB,EAAC,yBAAsB;AAChD,YAAY,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,MAAM,EACN,OAAO,EACP,WAAW,EACX,eAAe,EACf,YAAY,EACZ,OAAO,IAAI,QAAQ,EACnB,eAAe,IAAI,gBAAgB,EACnC,aAAa,IAAI,cAAc,EAChC,uBAAoB;AAErB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EAChB,2BAAwB;AAEzB,QAAA,MAAM,aAAa;;;;;;;;;;;;;CAalB,CAAC;AAEF,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,eAAe,EAChB,CAAC;AAEF,YAAY,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC3B,2BAAwB"}
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  import { default as H3TileLayer } from "./layers/h3-tile-layer.js";
2
+ import { default as HeatmapTileLayer } from "./layers/heatmap-tile-layer.js";
2
3
  import { default as _PointLabelLayer } from "./layers/point-label-layer.js";
3
4
  import { default as QuadbinTileLayer } from "./layers/quadbin-tile-layer.js";
4
- import { default as QuadbinHeatmapTileLayer } from "./layers/quadbin-heatmap-tile-layer.js";
5
5
  import { default as RasterTileLayer } from "./layers/raster-tile-layer.js";
6
6
  import { default as VectorTileLayer } from "./layers/vector-tile-layer.js";
7
7
  const CARTO_LAYERS = {
8
8
  H3TileLayer,
9
+ HeatmapTileLayer,
9
10
  _PointLabelLayer,
10
11
  QuadbinTileLayer,
11
- QuadbinHeatmapTileLayer,
12
12
  RasterTileLayer,
13
13
  VectorTileLayer
14
14
  };
15
- export { CARTO_LAYERS, H3TileLayer, _PointLabelLayer, QuadbinTileLayer, QuadbinHeatmapTileLayer, RasterTileLayer, VectorTileLayer };
15
+ export { CARTO_LAYERS, H3TileLayer, HeatmapTileLayer, _PointLabelLayer, QuadbinTileLayer, RasterTileLayer, VectorTileLayer };
16
16
  export { default as BASEMAP, GOOGLE_BASEMAPS as _GOOGLE_BASEMAPS, getStyleUrl as _getStyleUrl, fetchStyle as _fetchStyle, applyLayerGroupFilters as _applyLayerGroupFilters, STYLE_LAYER_GROUPS as _STYLE_LAYER_GROUPS } from "./basemap.js";
17
17
  export { default as colorBins } from "./style/color-bins-style.js";
18
18
  export { default as colorCategories } from "./style/color-categories-style.js";
@@ -0,0 +1,36 @@
1
+ import { Accessor, CompositeLayer, CompositeLayerProps, DefaultProps, Layer } from '@deck.gl/core';
2
+ import { HeatmapProps } from "./heatmap.js";
3
+ import { QuadbinTileLayerProps } from "./quadbin-tile-layer.js";
4
+ import { TilejsonResult } from "../sources.js";
5
+ import { _Tile2DHeader as Tile2DHeader } from '@deck.gl/geo-layers';
6
+ /** All properties supported by HeatmapTileLayer. */
7
+ export type HeatmapTileLayerProps<DataT = unknown> = _HeatmapTileLayerProps<DataT> & CompositeLayerProps & {
8
+ data: null | TilejsonResult | Promise<TilejsonResult>;
9
+ };
10
+ /** Properties added by HeatmapTileLayer. */
11
+ type _HeatmapTileLayerProps<DataT> = QuadbinTileLayerProps<DataT> & HeatmapProps & {
12
+ /**
13
+ * The weight of each object.
14
+ *
15
+ * @default 1
16
+ */
17
+ getWeight?: Accessor<DataT, number>;
18
+ /** Called when maximum density in displayed tiles changes. */
19
+ onMaxDensityChange?: ((maxDensity: number) => void) | null;
20
+ };
21
+ declare class HeatmapTileLayer<DataT = any, ExtraProps extends {} = {}> extends CompositeLayer<ExtraProps & Required<_HeatmapTileLayerProps<DataT>>> {
22
+ static layerName: string;
23
+ static defaultProps: DefaultProps<HeatmapTileLayerProps<unknown>>;
24
+ state: {
25
+ isLoaded: boolean;
26
+ tiles: Set<Tile2DHeader>;
27
+ viewportChanged?: boolean;
28
+ };
29
+ initializeState(): void;
30
+ shouldUpdateState({ changeFlags }: {
31
+ changeFlags: any;
32
+ }): boolean;
33
+ renderLayers(): Layer;
34
+ }
35
+ export default HeatmapTileLayer;
36
+ //# sourceMappingURL=heatmap-tile-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heatmap-tile-layer.d.ts","sourceRoot":"","sources":["../../src/layers/heatmap-tile-layer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;AAGjG,OAAO,EAAC,YAAY,EAAU,qBAAkB;AAEhD,OAAyB,EAAC,qBAAqB,EAAC,gCAA6B;AAE7E,OAAO,EAAC,cAAc,EAAC,sBAAmB;AAC1C,OAAO,EAAC,aAAa,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAkElE,oDAAoD;AACpD,MAAM,MAAM,qBAAqB,CAAC,KAAK,GAAG,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,GAChF,mBAAmB,GAAG;IACpB,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD,CAAC;AAEJ,4CAA4C;AAC5C,KAAK,sBAAsB,CAAC,KAAK,IAAI,qBAAqB,CAAC,KAAK,CAAC,GAC/D,YAAY,GAAG;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEpC,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5D,CAAC;AAEJ,cAAM,gBAAgB,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CACpF,UAAU,GAAG,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CACrD;IACC,MAAM,CAAC,SAAS,SAAsB;IACtC,MAAM,CAAC,YAAY,+CAAgB;IAEnC,KAAK,EAAG;QACN,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;QACzB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,eAAe;IAQf,iBAAiB,CAAC,EAAC,WAAW,EAAC;;KAAA,GAAG,OAAO;IAMzC,YAAY,IAAI,KAAK;CAgHtB;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,165 @@
1
+ import { getResolution } from 'quadbin';
2
+ import { CompositeLayer } from '@deck.gl/core';
3
+ import { SolidPolygonLayer } from '@deck.gl/layers';
4
+ import { heatmap } from "./heatmap.js";
5
+ import { RTTModifier, PostProcessModifier } from "./post-process-utils.js";
6
+ import QuadbinTileLayer from "./quadbin-tile-layer.js";
7
+ import { TilejsonPropType } from "./utils.js";
8
+ /**
9
+ * Computes the unit density (inverse of cell area)
10
+ */
11
+ function unitDensityForCell(cell) {
12
+ const cellResolution = Number(getResolution(cell));
13
+ return Math.pow(4.0, cellResolution);
14
+ }
15
+ // Modified polygon layer to draw offscreen and output value expected by heatmap
16
+ class RTTSolidPolygonLayer extends RTTModifier(SolidPolygonLayer) {
17
+ static { this.layerName = 'RTTSolidPolygonLayer'; }
18
+ getShaders(type) {
19
+ const shaders = super.getShaders(type);
20
+ shaders.inject = {
21
+ 'vs:#decl': `
22
+ uniform float densityFactor;
23
+ `,
24
+ 'vs:#main-end': `
25
+ // Value from getWeight accessor
26
+ float weight = elevations;
27
+
28
+ // Keep "power" delivered to screen constant when tiles update
29
+ // by outputting normalized density
30
+ weight *= densityFactor;
31
+
32
+ // Pack float into 3 channels to pass to heatmap shader
33
+ // SCALE value important, as we don't want to saturate
34
+ // but also want enough definition to avoid banding
35
+ const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
36
+ const float MAX_VAL = SHIFT.z * 255.0;
37
+ const float SCALE = MAX_VAL / 8.0;
38
+ weight *= SCALE;
39
+ weight = clamp(weight, 0.0, MAX_VAL);
40
+ vColor = vec4(mod(vec3(weight, floor(weight / SHIFT.yz)), 256.0), 255.0) / 255.0;
41
+ `
42
+ };
43
+ return shaders;
44
+ }
45
+ draw(opts) {
46
+ const cell = this.props.data[0];
47
+ const maxDensity = this.props.elevationScale;
48
+ const densityFactor = unitDensityForCell(cell.id) / maxDensity;
49
+ for (const model of this.state.models) {
50
+ model.setUniforms({ densityFactor });
51
+ }
52
+ super.draw(opts);
53
+ }
54
+ }
55
+ // Modify QuadbinTileLayer to apply heatmap post process effect
56
+ const PostProcessQuadbinTileLayer = PostProcessModifier(QuadbinTileLayer, heatmap);
57
+ const defaultProps = {
58
+ data: TilejsonPropType,
59
+ getWeight: { type: 'accessor', value: 1 },
60
+ onMaxDensityChange: { type: 'function', optional: true, value: null },
61
+ colorDomain: { type: 'array', value: [0, 1] },
62
+ intensity: { type: 'number', value: 1 },
63
+ radiusPixels: { type: 'number', min: 0, max: 100, value: 20 }
64
+ };
65
+ class HeatmapTileLayer extends CompositeLayer {
66
+ static { this.layerName = 'HeatmapTileLayer'; }
67
+ static { this.defaultProps = defaultProps; }
68
+ initializeState() {
69
+ this.state = {
70
+ isLoaded: false,
71
+ tiles: new Set(),
72
+ viewportChanged: false
73
+ };
74
+ }
75
+ shouldUpdateState({ changeFlags }) {
76
+ const { viewportChanged } = changeFlags;
77
+ this.setState({ viewportChanged });
78
+ return changeFlags.somethingChanged;
79
+ }
80
+ renderLayers() {
81
+ const { data, getWeight, colorDomain, colorRange, intensity, radiusPixels, _subLayerProps, updateTriggers, onMaxDensityChange, onViewportLoad, onTileLoad, onTileUnload, ...tileLayerProps } = this.props;
82
+ // Inject modified polygon layer as sublayer into TileLayer
83
+ const subLayerProps = {
84
+ ..._subLayerProps,
85
+ cell: {
86
+ ..._subLayerProps?.cell,
87
+ _subLayerProps: {
88
+ ..._subLayerProps?.cell?._subLayerProps,
89
+ fill: {
90
+ ..._subLayerProps?.cell?._subLayerProps?.fill,
91
+ type: RTTSolidPolygonLayer
92
+ }
93
+ }
94
+ }
95
+ };
96
+ let tileZ = 0;
97
+ let maxDensity = 0;
98
+ const tiles = [...this.state.tiles].filter(t => t.isVisible && t.data);
99
+ for (const tile of tiles) {
100
+ const cell = tile.data[0];
101
+ const unitDensity = unitDensityForCell(cell.id);
102
+ maxDensity = Math.max(tile.userData.maxWeight * unitDensity, maxDensity);
103
+ tileZ = Math.max(tile.zoom, tileZ);
104
+ }
105
+ // Between zoom levels the max density will change, but it isn't possible to know by what factor. Uniform data distributions lead to a factor of 4, while very localized data gives 1. As a heurstic estimate with a value inbetween (2) to make the transitions less obvious.
106
+ const overzoom = this.context.viewport.zoom - tileZ;
107
+ const estimatedMaxDensity = maxDensity * Math.pow(2, overzoom);
108
+ maxDensity = estimatedMaxDensity;
109
+ if (typeof onMaxDensityChange === 'function') {
110
+ onMaxDensityChange(maxDensity);
111
+ }
112
+ return new PostProcessQuadbinTileLayer(tileLayerProps, this.getSubLayerProps({
113
+ id: 'heatmap',
114
+ data,
115
+ // Re-use existing props to pass down values to sublayer
116
+ // TODO replace with custom layer
117
+ getFillColor: 0,
118
+ getElevation: getWeight,
119
+ elevationScale: maxDensity,
120
+ colorDomain,
121
+ colorRange,
122
+ radiusPixels,
123
+ intensity,
124
+ _subLayerProps: subLayerProps,
125
+ refinementStrategy: 'no-overlap',
126
+ // Disable line rendering
127
+ extruded: false,
128
+ stroked: false,
129
+ updateTriggers: {
130
+ getElevation: updateTriggers.getWeight
131
+ },
132
+ // Tile stats
133
+ onViewportLoad: tiles => {
134
+ this.setState({ isLoaded: true });
135
+ if (typeof onViewportLoad === 'function') {
136
+ onViewportLoad(tiles);
137
+ }
138
+ },
139
+ onTileLoad: (tile) => {
140
+ let maxWeight = -Infinity;
141
+ if (typeof getWeight !== 'function') {
142
+ maxWeight = getWeight;
143
+ }
144
+ else if (tile.content) {
145
+ for (const d of tile.content) {
146
+ maxWeight = Math.max(getWeight(d, {}), maxWeight);
147
+ }
148
+ }
149
+ tile.userData = { maxWeight };
150
+ this.state.tiles.add(tile);
151
+ if (typeof onTileLoad === 'function') {
152
+ onTileLoad(tile);
153
+ }
154
+ },
155
+ onTileUnload: (tile) => {
156
+ this.state.tiles.delete(tile);
157
+ if (typeof onTileUnload === 'function') {
158
+ onTileUnload(tile);
159
+ }
160
+ },
161
+ transitions: { elevationScale: { type: 'spring', stiffness: 0.3, damping: 0.5 } }
162
+ }));
163
+ }
164
+ }
165
+ export default HeatmapTileLayer;
@@ -19,6 +19,10 @@ export type HeatmapProps = {
19
19
  * @default `6-class YlOrRd` - [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6)
20
20
  */
21
21
  colorRange: Color[];
22
+ /**
23
+ * Value that is multiplied with the total weight at a pixel to obtain the final weight. A value larger than 1 biases the output color towards the higher end of the spectrum, and a value less than 1 biases the output color towards the lower end of the spectrum.
24
+ */
25
+ intensity?: number;
22
26
  opacity: number;
23
27
  };
24
28
  export type HeatmapUniforms = {
@@ -31,6 +35,7 @@ export type HeatmapUniforms = {
31
35
  color4?: [number, number, number];
32
36
  color5?: [number, number, number];
33
37
  color6?: [number, number, number];
38
+ intensity: number;
34
39
  opacity?: number;
35
40
  };
36
41
  export declare const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms>;
@@ -1 +1 @@
1
- {"version":3,"file":"heatmap.d.ts","sourceRoot":"","sources":["../../src/layers/heatmap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAuHpC,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,eAAe,CAsD7D,CAAC"}
1
+ {"version":3,"file":"heatmap.d.ts","sourceRoot":"","sources":["../../src/layers/heatmap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AA6HpC,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,eAAe,CAyD7D,CAAC"}
@@ -1,4 +1,3 @@
1
- import { random } from '@luma.gl/shadertools';
2
1
  const glsl = (s) => `${s}`;
3
2
  /**
4
3
  * @filter Heatmap
@@ -17,9 +16,9 @@ vec3 color3;
17
16
  vec3 color4;
18
17
  vec3 color5;
19
18
  vec3 color6;
19
+ float intensity;
20
20
  float opacity;
21
21
  } heatmap;
22
- const float SUPPORT = 8.0;
23
22
  const vec4 STOPS = vec4(0.2, 0.4, 0.6, 0.8);
24
23
  vec3 colorGradient(float value) {
25
24
  vec3 c1;
@@ -37,17 +36,16 @@ c1 = heatmap.color3; c2 = heatmap.color4;
37
36
  } else if (value < STOPS.w) {
38
37
  range = STOPS.zw;
39
38
  c1 = heatmap.color4; c2 = heatmap.color5;
40
- } else if (value < 1.0 ) {
39
+ } else {
41
40
  range = vec2(STOPS.w, 1.0);
42
41
  c1 = heatmap.color5; c2 = heatmap.color6;
43
- } else {
44
- range = vec2(1.0, 10.0);
45
- c1 = heatmap.color6; c2 = vec3(255.0);
46
42
  }
47
- float f = (value - range.x) / (range.y - range.x);
43
+ float f = (clamp(value, 0.0, 1.0) - range.x) / (range.y - range.x);
48
44
  return mix(c1, c2, f) / 255.0;
49
45
  }
50
46
  const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
47
+ const float MAX_VAL = SHIFT.z * 255.0;
48
+ const float SCALE = MAX_VAL / 8.0;
51
49
  vec4 pack(float value) {
52
50
  return vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
53
51
  }
@@ -57,12 +55,12 @@ return 255.0 * dot(color, SHIFT);
57
55
  vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
58
56
  bool firstPass = (heatmap.delta.y < 0.5);
59
57
  float accumulator = 0.0;
60
- float offset = 0.5 * random(vec3(12.9898, 78.233, 151.7182), 0.0);
61
- const float sigma = SUPPORT / 3.0;
62
- const float a = -0.5 / (sigma * sigma);
63
- const float w0 = 0.3989422804014327 / sigma;
58
+ float SUPPORT = clamp(heatmap.radiusPixels / 2.0, 8.0, 32.0);
59
+ float sigma = SUPPORT / 3.0;
60
+ float a = -0.5 / (sigma * sigma);
61
+ float w0 = 0.3989422804014327 / sigma;
64
62
  for (float t = -SUPPORT; t <= SUPPORT; t++) {
65
- vec2 percent = (t * heatmap.delta + offset - 0.5) / SUPPORT;
63
+ vec2 percent = (t * heatmap.delta - 0.5) / SUPPORT;
66
64
  vec2 delta = percent * heatmap.radiusPixels / texSize;
67
65
  vec4 offsetColor = texture(source, texCoord + delta);
68
66
  float value = unpack(offsetColor.rgb);
@@ -72,7 +70,9 @@ accumulator += value * weight;
72
70
  if (firstPass) {
73
71
  return pack(accumulator);
74
72
  }
75
- float f = (accumulator - heatmap.colorDomain[0]) / (heatmap.colorDomain[1] - heatmap.colorDomain[0]);
73
+ float density = 10.0 * heatmap.intensity * accumulator / SCALE;
74
+ vec2 domain = heatmap.colorDomain;
75
+ float f = (density - domain[0]) / (domain[1] - domain[0]);
76
76
  vec4 color = vec4(0.0);
77
77
  color.rgb = colorGradient(f);
78
78
  color.a = smoothstep(0.0, 0.1, f);
@@ -101,6 +101,7 @@ export const heatmap = {
101
101
  color4: { value: [0, 0, 0] },
102
102
  color5: { value: [0, 0, 0] },
103
103
  color6: { value: [0, 0, 0] },
104
+ intensity: { value: 1, min: 0.1, max: 10 },
104
105
  opacity: { value: 1, min: 0, max: 1 }
105
106
  },
106
107
  uniformTypes: {
@@ -113,10 +114,11 @@ export const heatmap = {
113
114
  color4: 'vec3<f32>',
114
115
  color5: 'vec3<f32>',
115
116
  color6: 'vec3<f32>',
117
+ intensity: 'f32',
116
118
  opacity: 'f32'
117
119
  },
118
120
  getUniforms: opts => {
119
- const { delta = [1, 0], colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], opacity = 1 } = opts;
121
+ const { delta = [1, 0], colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], intensity = 1, opacity = 1 } = opts;
120
122
  const [color1, color2, color3, color4, color5, color6] = colorRange;
121
123
  return {
122
124
  delta,
@@ -128,10 +130,10 @@ export const heatmap = {
128
130
  color6,
129
131
  radiusPixels,
130
132
  colorDomain,
133
+ intensity,
131
134
  opacity
132
135
  };
133
136
  },
134
- dependencies: [random],
135
137
  fs,
136
138
  passes: [
137
139
  { sampler: true, uniforms: { delta: [1, 0] } },
@@ -1,7 +1,7 @@
1
1
  import { TileReader } from "./carto-raster-tile.js";
2
2
  import { parsePbf } from "./tile-loader-utils.js";
3
3
  import { getWorkerUrl } from "../../utils.js";
4
- const VERSION = typeof "9.0.17" !== 'undefined' ? "9.0.17" : 'latest';
4
+ const VERSION = typeof "9.0.18" !== 'undefined' ? "9.0.18" : 'latest';
5
5
  const id = 'cartoRasterTile';
6
6
  const DEFAULT_OPTIONS = {
7
7
  cartoRasterTile: {
@@ -2,7 +2,7 @@ import { TileReader } from "./carto-spatial-tile.js";
2
2
  import { parsePbf } from "./tile-loader-utils.js";
3
3
  import { getWorkerUrl } from "../../utils.js";
4
4
  import { binaryToSpatialjson } from "./spatialjson-utils.js";
5
- const VERSION = typeof "9.0.17" !== 'undefined' ? "9.0.17" : 'latest';
5
+ const VERSION = typeof "9.0.18" !== 'undefined' ? "9.0.18" : 'latest';
6
6
  const id = 'cartoSpatialTile';
7
7
  const DEFAULT_OPTIONS = {
8
8
  cartoSpatialTile: {
@@ -2,7 +2,7 @@ import earcut from 'earcut';
2
2
  import { TileReader } from "./carto-tile.js";
3
3
  import { parsePbf } from "./tile-loader-utils.js";
4
4
  import { getWorkerUrl } from "../../utils.js";
5
- const VERSION = typeof "9.0.17" !== 'undefined' ? "9.0.17" : 'latest';
5
+ const VERSION = typeof "9.0.18" !== 'undefined' ? "9.0.18" : 'latest';
6
6
  const id = 'cartoVectorTile';
7
7
  const DEFAULT_OPTIONS = {
8
8
  cartoVectorTile: {
@@ -25,7 +25,7 @@ export default class VectorTileLayer<FeaturePropertiesT = any, ExtraProps extend
25
25
  _offset: number;
26
26
  tile: _Tile2DHeader;
27
27
  }): GeoJsonLayer | null;
28
- getPickingInfo(params: any): import("@deck.gl/geo-layers").MVTLayerPickingInfo<FeaturePropertiesT>;
28
+ protected _isWGS84(): boolean;
29
29
  }
30
30
  export {};
31
31
  //# sourceMappingURL=vector-tile-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vector-tile-layer.d.ts","sourceRoot":"","sources":["../../src/layers/vector-tile-layer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAE3C,OAAO,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EAET,aAAa,EACb,cAAc,IAAI,aAAa,EAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAK7C,OAAO,KAAK,EAAC,cAAc,EAAC,4BAAyB;AAWrD,mDAAmD;AACnD,MAAM,MAAM,oBAAoB,CAAC,kBAAkB,GAAG,OAAO,IAAI,qBAAqB,GACpF,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC;AAElD,2CAA2C;AAC3C,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,eAAe,CAClC,kBAAkB,GAAG,GAAG,EACxB,UAAU,SAAS,EAAE,GAAG,EAAE,CAC1B,SAAQ,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC;IAClF,MAAM,CAAC,SAAS,SAAqB;IACrC,MAAM,CAAC,YAAY,8CAAgB;IAEnC,KAAK,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG;QAC1B,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;gBAEU,GAAG,WAAW,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;IAMtE,eAAe,IAAI,IAAI;IAKvB,WAAW,CAAC,UAAU,KAAA;IAWtB,cAAc,IAAI,GAAG;IASf,WAAW,CAAC,IAAI,EAAE,aAAa;IAqCrC,eAAe,CACb,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,aAAa,CAAC;KACrB,GACA,YAAY,GAAG,IAAI;IAuBtB,cAAc,CAAC,MAAM,KAAA;CAYtB"}
1
+ {"version":3,"file":"vector-tile-layer.d.ts","sourceRoot":"","sources":["../../src/layers/vector-tile-layer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAE3C,OAAO,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EAET,aAAa,EACb,cAAc,IAAI,aAAa,EAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAC,cAAc,EAAC,4BAAyB;AAWrD,mDAAmD;AACnD,MAAM,MAAM,oBAAoB,CAAC,kBAAkB,GAAG,OAAO,IAAI,qBAAqB,GACpF,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC;AAElD,2CAA2C;AAC3C,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,eAAe,CAClC,kBAAkB,GAAG,GAAG,EACxB,UAAU,SAAS,EAAE,GAAG,EAAE,CAC1B,SAAQ,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC;IAClF,MAAM,CAAC,SAAS,SAAqB;IACrC,MAAM,CAAC,YAAY,8CAAgB;IAEnC,KAAK,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG;QAC1B,GAAG,EAAE,OAAO,CAAC;KACd,CAAC;gBAEU,GAAG,WAAW,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;IAMtE,eAAe,IAAI,IAAI;IAKvB,WAAW,CAAC,UAAU,KAAA;IAWtB,cAAc,IAAI,GAAG;IASf,WAAW,CAAC,IAAI,EAAE,aAAa;IAqCrC,eAAe,CACb,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,aAAa,CAAC;KACrB,GACA,YAAY,GAAG,IAAI;cAuBH,QAAQ,IAAI,OAAO;CAKvC"}
@@ -5,7 +5,6 @@ registerLoaders([CartoPropertiesTileLoader, CartoVectorTileLoader]);
5
5
  import { ClipExtension } from '@deck.gl/extensions';
6
6
  import { MVTLayer, _getURLFromTemplate } from '@deck.gl/geo-layers';
7
7
  import { GeoJsonLayer } from '@deck.gl/layers';
8
- import { binaryToGeojson } from '@loaders.gl/gis';
9
8
  import { TilejsonPropType, injectAccessToken, mergeBoundaryData } from "./utils.js";
10
9
  import { DEFAULT_TILE_SIZE } from "../constants.js";
11
10
  const defaultProps = {
@@ -93,14 +92,10 @@ export default class VectorTileLayer extends MVTLayer {
93
92
  const subLayer = new GeoJsonLayer(subLayerProps);
94
93
  return subLayer;
95
94
  }
96
- getPickingInfo(params) {
97
- const info = super.getPickingInfo(params);
98
- if (this.state.binary && info.index !== -1) {
99
- const { data } = params.sourceLayer.props;
100
- info.object = binaryToGeojson(data, {
101
- globalFeatureId: info.index
102
- });
103
- }
104
- return info;
95
+ _isWGS84() {
96
+ // CARTO binary tile coordinates are [lng, lat], not tile-relative like MVT.
97
+ if (this.state.mvt)
98
+ return super._isWGS84();
99
+ return true;
105
100
  }
106
101
  }