@deck.gl/carto 9.0.13 → 9.0.15

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.
Files changed (71) hide show
  1. package/dist/api/basemap.d.ts +17 -0
  2. package/dist/api/basemap.d.ts.map +1 -0
  3. package/dist/api/basemap.js +76 -0
  4. package/dist/api/fetch-map.d.ts +10 -12
  5. package/dist/api/fetch-map.d.ts.map +1 -1
  6. package/dist/api/fetch-map.js +7 -3
  7. package/dist/api/index.d.ts +2 -2
  8. package/dist/api/index.d.ts.map +1 -1
  9. package/dist/api/parse-map.d.ts +21 -1
  10. package/dist/api/parse-map.d.ts.map +1 -1
  11. package/dist/api/parse-map.js +1 -0
  12. package/dist/api/query.d.ts.map +1 -1
  13. package/dist/api/query.js +4 -3
  14. package/dist/api/request-with-parameters.d.ts +1 -1
  15. package/dist/api/request-with-parameters.d.ts.map +1 -1
  16. package/dist/api/request-with-parameters.js +6 -3
  17. package/dist/api/types.d.ts +82 -1
  18. package/dist/api/types.d.ts.map +1 -1
  19. package/dist/basemap.d.ts +17 -0
  20. package/dist/basemap.d.ts.map +1 -1
  21. package/dist/basemap.js +97 -7
  22. package/dist/cartoRasterTile-worker.js +1 -1
  23. package/dist/cartoSpatialTile-worker.js +1 -1
  24. package/dist/cartoVectorTile-worker.js +1 -1
  25. package/dist/dist.dev.js +1745 -2368
  26. package/dist/index.cjs +270 -89
  27. package/dist/index.cjs.map +4 -4
  28. package/dist/index.d.ts +3 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -1
  31. package/dist/layers/heatmap.d.ts +3 -2
  32. package/dist/layers/heatmap.d.ts.map +1 -1
  33. package/dist/layers/heatmap.js +18 -6
  34. package/dist/layers/quadbin-heatmap-tile-layer.d.ts +5 -2
  35. package/dist/layers/quadbin-heatmap-tile-layer.d.ts.map +1 -1
  36. package/dist/layers/quadbin-heatmap-tile-layer.js +3 -2
  37. package/dist/layers/schema/carto-raster-tile-loader.js +1 -1
  38. package/dist/layers/schema/carto-spatial-tile-loader.js +1 -1
  39. package/dist/layers/schema/carto-vector-tile-loader.js +1 -1
  40. package/dist/sources/base-source.d.ts +1 -1
  41. package/dist/sources/base-source.d.ts.map +1 -1
  42. package/dist/sources/boundary-query-source.js +2 -2
  43. package/dist/sources/boundary-table-source.js +1 -1
  44. package/dist/sources/h3-query-source.js +1 -1
  45. package/dist/sources/quadbin-query-source.js +1 -1
  46. package/dist/sources/vector-query-source.js +2 -2
  47. package/dist/sources/vector-table-source.js +1 -1
  48. package/dist/utils.d.ts +2 -0
  49. package/dist/utils.d.ts.map +1 -1
  50. package/dist/utils.js +2 -0
  51. package/dist.min.js +21 -15
  52. package/package.json +6 -6
  53. package/src/api/basemap.ts +100 -0
  54. package/src/api/fetch-map.ts +20 -6
  55. package/src/api/index.ts +11 -2
  56. package/src/api/parse-map.ts +24 -3
  57. package/src/api/query.ts +4 -2
  58. package/src/api/request-with-parameters.ts +12 -9
  59. package/src/api/types.ts +103 -1
  60. package/src/basemap.ts +134 -7
  61. package/src/index.ts +14 -2
  62. package/src/layers/heatmap.ts +23 -8
  63. package/src/layers/quadbin-heatmap-tile-layer.ts +8 -5
  64. package/src/sources/base-source.ts +1 -1
  65. package/src/sources/boundary-query-source.ts +4 -4
  66. package/src/sources/boundary-table-source.ts +2 -2
  67. package/src/sources/h3-query-source.ts +2 -2
  68. package/src/sources/quadbin-query-source.ts +2 -2
  69. package/src/sources/vector-query-source.ts +4 -4
  70. package/src/sources/vector-table-source.ts +2 -2
  71. package/src/utils.ts +5 -0
@@ -12,6 +12,7 @@ const glsl = (s: TemplateStringsArray) => `${s}`;
12
12
 
13
13
  const fs = glsl`\
14
14
  uniform heatmapUniforms {
15
+ vec2 delta;
15
16
  float radiusPixels;
16
17
  vec2 colorDomain;
17
18
  vec3 color1;
@@ -57,11 +58,15 @@ vec3 colorGradient(float value) {
57
58
  }
58
59
 
59
60
  const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
61
+ vec4 pack(float value) {
62
+ return vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
63
+ }
60
64
  float unpack(vec3 color) {
61
65
  return 255.0 * dot(color, SHIFT);
62
66
  }
63
67
 
64
68
  vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
69
+ bool firstPass = (heatmap.delta.y < 0.5);
65
70
  float accumulator = 0.0;
66
71
 
67
72
  // Randomize the lookup values to hide the fixed number of samples
@@ -70,11 +75,10 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
70
75
  // Gaussian normalization parameters
71
76
  const float sigma = SUPPORT / 3.0;
72
77
  const float a = -0.5 / (sigma * sigma);
73
- const float w0 = 1.0 / (2.0 * 3.141592653589793 * sigma * sigma); // 2D normalization
78
+ const float w0 = 0.3989422804014327 / sigma; // 1D normalization
74
79
 
75
80
  for (float t = -SUPPORT; t <= SUPPORT; t++) {
76
- for (float s = -SUPPORT; s <= SUPPORT; s++) {
77
- vec2 percent = (vec2(s, t) + offset - 0.5) / SUPPORT;
81
+ vec2 percent = (t * heatmap.delta + offset - 0.5) / SUPPORT;
78
82
  vec2 delta = percent * heatmap.radiusPixels / texSize;
79
83
  vec4 offsetColor = texture(source, texCoord + delta);
80
84
 
@@ -82,10 +86,13 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
82
86
  float value = unpack(offsetColor.rgb);
83
87
 
84
88
  // Gaussian
85
- float weight = w0 * exp(a * (s * s + t * t));
89
+ float weight = w0 * exp(a * t * t);
86
90
 
87
91
  accumulator += value * weight;
88
92
  }
93
+
94
+ if (firstPass) {
95
+ return pack(accumulator);
89
96
  }
90
97
 
91
98
  // Apply domain
@@ -114,9 +121,9 @@ const defaultColorRange: Color[] = [
114
121
 
115
122
  export type HeatmapProps = {
116
123
  /**
117
- * Radius of the circle in pixels, to which the weight of an object is distributed.
124
+ * Radius of the heatmap blur in pixels, to which the weight of a cell is distributed.
118
125
  *
119
- * @default 30
126
+ * @default 20
120
127
  */
121
128
  radiusPixels?: number;
122
129
  /**
@@ -135,6 +142,7 @@ export type HeatmapProps = {
135
142
  };
136
143
 
137
144
  export type HeatmapUniforms = {
145
+ delta?: [number, number];
138
146
  radiusPixels?: number;
139
147
  colorDomain?: [number, number];
140
148
  color1?: [number, number, number];
@@ -149,6 +157,7 @@ export type HeatmapUniforms = {
149
157
  export const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms> = {
150
158
  name: 'heatmap',
151
159
  uniformPropTypes: {
160
+ delta: {value: [0, 1]},
152
161
  radiusPixels: {value: 20, min: 0, softMax: 100},
153
162
  colorDomain: {value: [0, 1]},
154
163
  color1: {value: [0, 0, 0]},
@@ -160,6 +169,7 @@ export const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms> = {
160
169
  opacity: {value: 1, min: 0, max: 1}
161
170
  },
162
171
  uniformTypes: {
172
+ delta: 'vec2<f32>',
163
173
  radiusPixels: 'f32',
164
174
  colorDomain: 'vec2<f32>',
165
175
  color1: 'vec3<f32>',
@@ -172,13 +182,15 @@ export const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms> = {
172
182
  },
173
183
  getUniforms: opts => {
174
184
  const {
185
+ delta = [1, 0],
175
186
  colorRange = defaultColorRange,
176
187
  radiusPixels = 20,
177
188
  colorDomain = [0, 1],
178
189
  opacity = 1
179
- } = opts as HeatmapProps;
190
+ } = opts as HeatmapProps & {delta: [number, number]};
180
191
  const [color1, color2, color3, color4, color5, color6] = colorRange;
181
192
  return {
193
+ delta,
182
194
  color1,
183
195
  color2,
184
196
  color3,
@@ -192,5 +204,8 @@ export const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms> = {
192
204
  },
193
205
  dependencies: [random],
194
206
  fs,
195
- passes: [{sampler: true}]
207
+ passes: [
208
+ {sampler: true, uniforms: {delta: [1, 0]}},
209
+ {sampler: true, uniforms: {delta: [0, 1]}}
210
+ ]
196
211
  };
@@ -1,11 +1,13 @@
1
1
  import {getResolution} from 'quadbin';
2
2
 
3
- import {Accessor, CompositeLayer, DefaultProps, Layer} from '@deck.gl/core';
3
+ import {Accessor, CompositeLayer, CompositeLayerProps, DefaultProps, Layer} from '@deck.gl/core';
4
4
  import {SolidPolygonLayer} from '@deck.gl/layers';
5
5
 
6
6
  import {HeatmapProps, heatmap} from './heatmap';
7
7
  import {RTTModifier, PostProcessModifier} from './post-process-utils';
8
8
  import QuadbinTileLayer, {QuadbinTileLayerProps} from './quadbin-tile-layer';
9
+ import {TilejsonPropType} from './utils';
10
+ import {TilejsonResult} from '../sources';
9
11
 
10
12
  // Modified polygon layer to draw offscreen and output value expected by heatmap
11
13
  class RTTSolidPolygonLayer extends RTTModifier(SolidPolygonLayer) {
@@ -20,7 +22,7 @@ class RTTSolidPolygonLayer extends RTTModifier(SolidPolygonLayer) {
20
22
  float value = 255.0 * dot(SHIFT, color.rgb);
21
23
 
22
24
  // Keep "power" delivered to screen constant when tiles update
23
- float relativeZoom = log2(project_uScale) - cellResolution + 3.5; // range 0-1
25
+ float relativeZoom = log2(project.scale) - cellResolution + 3.5; // range 0-1
24
26
  float relativeArea = pow(2.0, -2.0 * relativeZoom); // range 0.25-1
25
27
  value *= relativeArea;
26
28
 
@@ -50,14 +52,15 @@ function encodeWeight(w: number) {
50
52
  }
51
53
 
52
54
  const defaultProps: DefaultProps<QuadbinHeatmapTileLayerProps> = {
53
- ...QuadbinTileLayer.defaultProps,
54
-
55
+ data: TilejsonPropType,
55
56
  getWeight: {type: 'accessor', value: 1}
56
57
  };
57
58
 
58
59
  /** All properties supported by QuadbinHeatmapTileLayer. */
59
60
  export type QuadbinHeatmapTileLayerProps<DataT = unknown> = _QuadbinHeatmapTileLayerProps<DataT> &
60
- QuadbinTileLayerProps;
61
+ CompositeLayerProps & {
62
+ data: null | TilejsonResult | Promise<TilejsonResult>;
63
+ };
61
64
 
62
65
  /** Properties added by QuadbinHeatmapTileLayer. */
63
66
  type _QuadbinHeatmapTileLayerProps<DataT> = QuadbinTileLayerProps<DataT> &
@@ -19,7 +19,7 @@ export const SOURCE_DEFAULTS: SourceOptionalOptions = {
19
19
  headers: {}
20
20
  };
21
21
 
22
- export async function baseSource<UrlParameters extends Record<string, string>>(
22
+ export async function baseSource<UrlParameters extends Record<string, unknown>>(
23
23
  endpoint: MapType,
24
24
  options: Partial<SourceOptionalOptions> & SourceRequiredOptions,
25
25
  urlParameters: UrlParameters
@@ -12,11 +12,11 @@ export type BoundaryQuerySourceOptions = SourceOptions &
12
12
  };
13
13
  type UrlParameters = {
14
14
  columns?: string;
15
- filters?: string;
15
+ filters?: Record<string, unknown>;
16
16
  tilesetTableName: string;
17
17
  matchingColumn: string;
18
18
  propertiesSqlQuery: string;
19
- queryParameters?: string;
19
+ queryParameters?: Record<string, unknown> | unknown[];
20
20
  };
21
21
 
22
22
  export const boundaryQuerySource = async function (
@@ -40,10 +40,10 @@ export const boundaryQuerySource = async function (
40
40
  urlParameters.columns = columns.join(',');
41
41
  }
42
42
  if (filters) {
43
- urlParameters.filters = JSON.stringify(filters);
43
+ urlParameters.filters = filters;
44
44
  }
45
45
  if (queryParameters) {
46
- urlParameters.queryParameters = JSON.stringify(queryParameters);
46
+ urlParameters.queryParameters = queryParameters;
47
47
  }
48
48
  return baseSource<UrlParameters>('boundary', options, urlParameters) as Promise<TilejsonResult>;
49
49
  };
@@ -9,7 +9,7 @@ export type BoundaryTableSourceOptions = SourceOptions &
9
9
  propertiesTableName: string;
10
10
  };
11
11
  type UrlParameters = {
12
- filters?: string;
12
+ filters?: Record<string, unknown>;
13
13
  tilesetTableName: string;
14
14
  columns?: string;
15
15
  matchingColumn: string;
@@ -30,7 +30,7 @@ export const boundaryTableSource = async function (
30
30
  urlParameters.columns = columns.join(',');
31
31
  }
32
32
  if (filters) {
33
- urlParameters.filters = JSON.stringify(filters);
33
+ urlParameters.filters = filters;
34
34
  }
35
35
  return baseSource<UrlParameters>('boundary', options, urlParameters) as Promise<TilejsonResult>;
36
36
  };
@@ -16,7 +16,7 @@ type UrlParameters = {
16
16
  spatialDataType: SpatialDataType;
17
17
  spatialDataColumn?: string;
18
18
  q: string;
19
- queryParameters?: string;
19
+ queryParameters?: Record<string, unknown> | unknown[];
20
20
  };
21
21
 
22
22
  export const h3QuerySource = async function (
@@ -40,7 +40,7 @@ export const h3QuerySource = async function (
40
40
  urlParameters.aggregationResLevel = String(aggregationResLevel);
41
41
  }
42
42
  if (queryParameters) {
43
- urlParameters.queryParameters = JSON.stringify(queryParameters);
43
+ urlParameters.queryParameters = queryParameters;
44
44
  }
45
45
  return baseSource<UrlParameters>('query', options, urlParameters) as Promise<TilejsonResult>;
46
46
  };
@@ -17,7 +17,7 @@ type UrlParameters = {
17
17
  spatialDataType: SpatialDataType;
18
18
  spatialDataColumn?: string;
19
19
  q: string;
20
- queryParameters?: string;
20
+ queryParameters?: Record<string, unknown> | unknown[];
21
21
  };
22
22
 
23
23
  export const quadbinQuerySource = async function (
@@ -41,7 +41,7 @@ export const quadbinQuerySource = async function (
41
41
  urlParameters.aggregationResLevel = String(aggregationResLevel);
42
42
  }
43
43
  if (queryParameters) {
44
- urlParameters.queryParameters = JSON.stringify(queryParameters);
44
+ urlParameters.queryParameters = queryParameters;
45
45
  }
46
46
  return baseSource<UrlParameters>('query', options, urlParameters) as Promise<TilejsonResult>;
47
47
  };
@@ -17,12 +17,12 @@ export type VectorQuerySourceOptions = SourceOptions &
17
17
 
18
18
  type UrlParameters = {
19
19
  columns?: string;
20
- filters?: string;
20
+ filters?: Record<string, unknown>;
21
21
  spatialDataType: SpatialDataType;
22
22
  spatialDataColumn?: string;
23
23
  tileResolution?: string;
24
24
  q: string;
25
- queryParameters?: string;
25
+ queryParameters?: Record<string, unknown> | unknown[];
26
26
  };
27
27
 
28
28
  export const vectorQuerySource = async function (
@@ -48,10 +48,10 @@ export const vectorQuerySource = async function (
48
48
  urlParameters.columns = columns.join(',');
49
49
  }
50
50
  if (filters) {
51
- urlParameters.filters = JSON.stringify(filters);
51
+ urlParameters.filters = filters;
52
52
  }
53
53
  if (queryParameters) {
54
- urlParameters.queryParameters = JSON.stringify(queryParameters);
54
+ urlParameters.queryParameters = queryParameters;
55
55
  }
56
56
  return baseSource<UrlParameters>('query', options, urlParameters) as Promise<TilejsonResult>;
57
57
  };
@@ -16,7 +16,7 @@ export type VectorTableSourceOptions = SourceOptions &
16
16
  ColumnsOption;
17
17
  type UrlParameters = {
18
18
  columns?: string;
19
- filters?: string;
19
+ filters?: Record<string, unknown>;
20
20
  spatialDataType: SpatialDataType;
21
21
  spatialDataColumn?: string;
22
22
  tileResolution?: string;
@@ -45,7 +45,7 @@ export const vectorTableSource = async function (
45
45
  urlParameters.columns = columns.join(',');
46
46
  }
47
47
  if (filters) {
48
- urlParameters.filters = JSON.stringify(filters);
48
+ urlParameters.filters = filters;
49
49
  }
50
50
  return baseSource<UrlParameters>('table', options, urlParameters) as Promise<TilejsonResult>;
51
51
  };
package/src/utils.ts CHANGED
@@ -59,3 +59,8 @@ export function scaleIdentity() {
59
59
 
60
60
  return scale;
61
61
  }
62
+
63
+ export const isObject: (x: unknown) => boolean = x => x !== null && typeof x === 'object';
64
+
65
+ export const isPureObject: (x: any) => boolean = x =>
66
+ isObject(x) && x.constructor === {}.constructor;