@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/cartoRasterTile-worker.js +1 -1
- package/dist/cartoSpatialTile-worker.js +1 -1
- package/dist/cartoVectorTile-worker.js +1 -1
- package/dist/dist.dev.js +440 -531
- package/dist/index.cjs +492 -422
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/layers/heatmap-tile-layer.d.ts +36 -0
- package/dist/layers/heatmap-tile-layer.d.ts.map +1 -0
- package/dist/layers/heatmap-tile-layer.js +165 -0
- package/dist/layers/heatmap.d.ts +5 -0
- package/dist/layers/heatmap.d.ts.map +1 -1
- package/dist/layers/heatmap.js +17 -15
- package/dist/layers/schema/carto-raster-tile-loader.js +1 -1
- package/dist/layers/schema/carto-spatial-tile-loader.js +1 -1
- package/dist/layers/schema/carto-vector-tile-loader.js +1 -1
- package/dist/layers/vector-tile-layer.d.ts +1 -1
- package/dist/layers/vector-tile-layer.d.ts.map +1 -1
- package/dist/layers/vector-tile-layer.js +5 -10
- package/dist.min.js +37 -31
- package/package.json +2 -2
- package/src/index.ts +3 -3
- package/src/layers/heatmap-tile-layer.ts +236 -0
- package/src/layers/heatmap.ts +31 -18
- package/src/layers/vector-tile-layer.ts +4 -14
- package/dist/layers/quadbin-heatmap-tile-layer.d.ts +0 -24
- package/dist/layers/quadbin-heatmap-tile-layer.d.ts.map +0 -1
- package/dist/layers/quadbin-heatmap-tile-layer.js +0 -84
- package/src/layers/quadbin-heatmap-tile-layer.ts +0 -135
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,
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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;
|
package/dist/layers/heatmap.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/layers/heatmap.js
CHANGED
|
@@ -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
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
if (this.state.
|
|
99
|
-
|
|
100
|
-
|
|
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
|
}
|