@deck.gl/carto 9.0.16 → 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.
Files changed (50) hide show
  1. package/dist/api/carto-api-error.d.ts +3 -1
  2. package/dist/api/carto-api-error.d.ts.map +1 -1
  3. package/dist/api/carto-api-error.js +2 -1
  4. package/dist/api/common.d.ts +0 -8
  5. package/dist/api/common.d.ts.map +1 -1
  6. package/dist/api/common.js +0 -9
  7. package/dist/api/request-with-parameters.d.ts +1 -1
  8. package/dist/api/request-with-parameters.d.ts.map +1 -1
  9. package/dist/api/request-with-parameters.js +48 -15
  10. package/dist/api/types.d.ts +5 -5
  11. package/dist/api/types.d.ts.map +1 -1
  12. package/dist/cartoRasterTile-worker.js +1 -1
  13. package/dist/cartoSpatialTile-worker.js +1 -1
  14. package/dist/cartoVectorTile-worker.js +1 -1
  15. package/dist/dist.dev.js +494 -560
  16. package/dist/index.cjs +445 -358
  17. package/dist/index.cjs.map +4 -4
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -3
  21. package/dist/layers/heatmap-tile-layer.d.ts +36 -0
  22. package/dist/layers/heatmap-tile-layer.d.ts.map +1 -0
  23. package/dist/layers/heatmap-tile-layer.js +165 -0
  24. package/dist/layers/heatmap.d.ts +5 -0
  25. package/dist/layers/heatmap.d.ts.map +1 -1
  26. package/dist/layers/heatmap.js +17 -15
  27. package/dist/layers/schema/carto-raster-tile-loader.js +1 -1
  28. package/dist/layers/schema/carto-spatial-tile-loader.js +1 -1
  29. package/dist/layers/schema/carto-vector-tile-loader.js +1 -1
  30. package/dist/layers/vector-tile-layer.d.ts +1 -1
  31. package/dist/layers/vector-tile-layer.d.ts.map +1 -1
  32. package/dist/layers/vector-tile-layer.js +5 -10
  33. package/dist/sources/raster-source.d.ts +2 -2
  34. package/dist/sources/raster-source.d.ts.map +1 -1
  35. package/dist/sources/raster-source.js +4 -1
  36. package/dist.min.js +37 -31
  37. package/package.json +2 -2
  38. package/src/api/carto-api-error.ts +10 -1
  39. package/src/api/common.ts +0 -12
  40. package/src/api/request-with-parameters.ts +55 -19
  41. package/src/api/types.ts +5 -5
  42. package/src/index.ts +3 -3
  43. package/src/layers/heatmap-tile-layer.ts +236 -0
  44. package/src/layers/heatmap.ts +31 -18
  45. package/src/layers/vector-tile-layer.ts +4 -14
  46. package/src/sources/raster-source.ts +10 -5
  47. package/dist/layers/quadbin-heatmap-tile-layer.d.ts +0 -24
  48. package/dist/layers/quadbin-heatmap-tile-layer.d.ts.map +0 -1
  49. package/dist/layers/quadbin-heatmap-tile-layer.js +0 -84
  50. package/src/layers/quadbin-heatmap-tile-layer.ts +0 -125
package/dist/dist.dev.js CHANGED
@@ -6993,7 +6993,7 @@ var __exports__ = (() => {
6993
6993
  CARTO_SOURCES: () => CARTO_SOURCES,
6994
6994
  CartoAPIError: () => CartoAPIError,
6995
6995
  H3TileLayer: () => H3TileLayer,
6996
- QuadbinHeatmapTileLayer: () => quadbin_heatmap_tile_layer_default,
6996
+ HeatmapTileLayer: () => heatmap_tile_layer_default,
6997
6997
  QuadbinTileLayer: () => QuadbinTileLayer,
6998
6998
  RasterTileLayer: () => RasterTileLayer,
6999
6999
  SOURCE_DEFAULTS: () => SOURCE_DEFAULTS,
@@ -7811,318 +7811,13 @@ var __exports__ = (() => {
7811
7811
  H3TileLayer.layerName = "H3TileLayer";
7812
7812
  H3TileLayer.defaultProps = defaultProps2;
7813
7813
 
7814
- // src/layers/point-label-layer.ts
7815
- var import_core6 = __toESM(require_core(), 1);
7814
+ // src/layers/heatmap-tile-layer.ts
7815
+ var import_core8 = __toESM(require_core(), 1);
7816
7816
  var import_layers = __toESM(require_layers(), 1);
7817
- var [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
7818
- var EnhancedTextBackgroundLayer = class extends import_layers._TextBackgroundLayer {
7819
- getShaders() {
7820
- const shaders = super.getShaders();
7821
- let vs = shaders.vs;
7822
- vs = vs.replaceAll("padding.", "_padding.");
7823
- vs = vs.replace(
7824
- "void main(void) {",
7825
- "void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);"
7826
- );
7827
- return { ...shaders, vs };
7828
- }
7829
- };
7830
- EnhancedTextBackgroundLayer.layerName = "EnhancedTextBackgroundLayer";
7831
- var EnhancedTextLayer = class extends import_layers.TextLayer {
7832
- filterSubLayer({ layer, renderPass }) {
7833
- const background = layer.id.includes("primary-background");
7834
- if (renderPass === "collision") {
7835
- return background;
7836
- }
7837
- return !background;
7838
- }
7839
- };
7840
- EnhancedTextLayer.layerName = "EnhancedTextLayer";
7841
- var defaultProps3 = {
7842
- ...import_layers.TextLayer.defaultProps,
7843
- getRadius: { type: "accessor", value: 1 },
7844
- radiusScale: { type: "number", min: 0, value: 1 }
7845
- };
7846
- var PointLabelLayer = class extends import_core6.CompositeLayer {
7847
- calculatePixelOffset(secondary) {
7848
- const {
7849
- getTextAnchor: anchor,
7850
- getAlignmentBaseline: alignment,
7851
- getRadius,
7852
- getSecondaryText,
7853
- radiusScale,
7854
- secondarySizeScale,
7855
- sizeScale
7856
- } = this.props;
7857
- const xMult = anchor === "middle" ? 0 : anchor === "start" ? 1 : -1;
7858
- const yMult = alignment === "center" ? 0 : alignment === "bottom" ? 1 : -1;
7859
- const xPadding = sizeScale / 4;
7860
- const yPadding = sizeScale * (1 + 1 / 4);
7861
- const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
7862
- let yOffset = secondary ? secondaryOffset : 0;
7863
- if (anchor === "middle" && alignment === "top" && getSecondaryText) {
7864
- yOffset -= secondaryOffset;
7865
- yOffset -= secondarySizeScale;
7866
- yOffset += sizeScale;
7867
- }
7868
- const radiusPadding = 1 + 1 / 4;
7869
- return typeof getRadius === "function" ? (d, info) => {
7870
- const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
7871
- return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
7872
- } : [
7873
- xMult * (getRadius * radiusScale * radiusPadding + xPadding),
7874
- yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
7875
- ];
7876
- }
7877
- calculateBackgroundPadding() {
7878
- const { getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale } = this.props;
7879
- const paddingX = 12 * sizeScale;
7880
- const paddingY = 3 * sizeScale;
7881
- const backgroundPadding = [0, 0, 0, 0];
7882
- if (alignment === "top") {
7883
- backgroundPadding[TOP] = paddingY;
7884
- } else if (alignment === "bottom") {
7885
- backgroundPadding[BOTTOM] = paddingY;
7886
- } else {
7887
- backgroundPadding[TOP] = 0.5 * paddingY;
7888
- backgroundPadding[BOTTOM] = 0.5 * paddingY;
7889
- }
7890
- if (anchor === "start") {
7891
- backgroundPadding[LEFT] = paddingX;
7892
- } else if (anchor === "end") {
7893
- backgroundPadding[RIGHT] = paddingX;
7894
- } else {
7895
- backgroundPadding[LEFT] = 0.5 * paddingX;
7896
- backgroundPadding[RIGHT] = 0.5 * paddingX;
7897
- }
7898
- return backgroundPadding;
7899
- }
7900
- renderTextLayer(id4, { updateTriggers: updateTriggersOverride = {}, ...props }) {
7901
- const {
7902
- data,
7903
- characterSet,
7904
- fontFamily,
7905
- fontSettings,
7906
- fontWeight,
7907
- outlineColor,
7908
- outlineWidth,
7909
- sizeScale,
7910
- radiusScale,
7911
- getAlignmentBaseline,
7912
- getColor,
7913
- getPosition,
7914
- getTextAnchor,
7915
- updateTriggers
7916
- } = this.props;
7917
- return new EnhancedTextLayer(
7918
- this.getSubLayerProps({
7919
- id: id4,
7920
- data,
7921
- characterSet,
7922
- fontFamily,
7923
- fontSettings,
7924
- fontWeight,
7925
- outlineColor,
7926
- outlineWidth,
7927
- sizeScale,
7928
- getAlignmentBaseline,
7929
- getColor,
7930
- getPosition,
7931
- getTextAnchor,
7932
- updateTriggers: {
7933
- ...updateTriggers,
7934
- ...updateTriggersOverride,
7935
- getPixelOffset: [
7936
- updateTriggers.getRadius,
7937
- updateTriggers.getTextAnchor,
7938
- updateTriggers.getAlignmentBaseline,
7939
- radiusScale,
7940
- sizeScale
7941
- ]
7942
- }
7943
- }),
7944
- {
7945
- getSize: 1,
7946
- _subLayerProps: { background: { type: EnhancedTextBackgroundLayer } }
7947
- },
7948
- props
7949
- );
7950
- }
7951
- renderLayers() {
7952
- const {
7953
- getText,
7954
- getSecondaryColor,
7955
- getSecondaryText,
7956
- secondaryOutlineColor,
7957
- secondarySizeScale,
7958
- updateTriggers
7959
- } = this.props;
7960
- const getPixelOffset = this.calculatePixelOffset(false);
7961
- const backgroundPadding = this.calculateBackgroundPadding();
7962
- const out = [
7963
- this.renderTextLayer(`${updateTriggers.getText}-primary`, {
7964
- backgroundPadding,
7965
- getText,
7966
- getPixelOffset,
7967
- background: true
7968
- }),
7969
- Boolean(getSecondaryText) && this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
7970
- getText: getSecondaryText,
7971
- getPixelOffset: this.calculatePixelOffset(true),
7972
- getAlignmentBaseline: "top",
7973
- ...getSecondaryColor && { getColor: getSecondaryColor },
7974
- ...secondarySizeScale && { sizeScale: secondarySizeScale },
7975
- ...secondaryOutlineColor && { outlineColor: secondaryOutlineColor }
7976
- })
7977
- ];
7978
- return out;
7979
- }
7980
- };
7981
- PointLabelLayer.layerName = "PointLabelLayer";
7982
- PointLabelLayer.defaultProps = defaultProps3;
7983
-
7984
- // src/layers/quadbin-tile-layer.ts
7985
- var import_core7 = __toESM(require_core(), 1);
7986
-
7987
- // src/layers/quadbin-layer.ts
7988
- var import_geo_layers4 = __toESM(require_geo_layers(), 1);
7989
-
7990
- // ../../node_modules/@math.gl/web-mercator/dist/web-mercator-utils.js
7991
- var PI = Math.PI;
7992
- var PI_4 = PI / 4;
7993
- var DEGREES_TO_RADIANS = PI / 180;
7994
- var RADIANS_TO_DEGREES = 180 / PI;
7995
- var TILE_SIZE = 512;
7996
- function worldToLngLat(xy) {
7997
- const [x, y] = xy;
7998
- const lambda2 = x / TILE_SIZE * (2 * PI) - PI;
7999
- const phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);
8000
- return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];
8001
- }
8002
-
8003
- // ../../node_modules/@math.gl/web-mercator/dist/get-bounds.js
8004
- var DEGREES_TO_RADIANS2 = Math.PI / 180;
8005
-
8006
- // src/layers/quadbin-utils.ts
8007
- var TILE_SIZE2 = 512;
8008
- function quadbinToOffset(quadbin) {
8009
- const { x, y, z } = cellToTile(quadbin);
8010
- const scale = TILE_SIZE2 / (1 << z);
8011
- return [x * scale, TILE_SIZE2 - y * scale, scale];
8012
- }
8013
- function quadbinToWorldBounds(quadbin, coverage) {
8014
- const [xOffset, yOffset, scale] = quadbinToOffset(quadbin);
8015
- return [
8016
- [xOffset, yOffset],
8017
- [xOffset + coverage * scale, yOffset - coverage * scale]
8018
- ];
8019
- }
8020
- function getQuadbinPolygon(quadbin, coverage = 1) {
8021
- const [topLeft, bottomRight] = quadbinToWorldBounds(quadbin, coverage);
8022
- const [w, n] = worldToLngLat(topLeft);
8023
- const [e, s] = worldToLngLat(bottomRight);
8024
- return [e, n, e, s, w, s, w, n, e, n];
8025
- }
8026
-
8027
- // src/layers/quadbin-layer.ts
8028
- var defaultProps4 = {
8029
- getQuadbin: { type: "accessor", value: (d) => d.quadbin }
8030
- };
8031
- var QuadbinLayer = class extends import_geo_layers4._GeoCellLayer {
8032
- indexToBounds() {
8033
- const { data, extruded, getQuadbin } = this.props;
8034
- const coverage = extruded ? 0.99 : 1;
8035
- return {
8036
- data,
8037
- _normalize: false,
8038
- positionFormat: "XY",
8039
- getPolygon: (x, objectInfo) => getQuadbinPolygon(getQuadbin(x, objectInfo), coverage),
8040
- updateTriggers: { getPolygon: coverage }
8041
- };
8042
- }
8043
- };
8044
- QuadbinLayer.layerName = "QuadbinLayer";
8045
- QuadbinLayer.defaultProps = defaultProps4;
8046
-
8047
- // src/layers/quadbin-tileset-2d.ts
8048
- var import_geo_layers5 = __toESM(require_geo_layers(), 1);
8049
- var QuadbinTileset2D = class extends import_geo_layers5._Tileset2D {
8050
- getTileIndices(opts) {
8051
- return super.getTileIndices(opts).map(tileToCell).map((q) => ({ q, i: bigIntToHex(q) }));
8052
- }
8053
- getTileId({ q, i }) {
8054
- return i || bigIntToHex(q);
8055
- }
8056
- getTileMetadata({ q }) {
8057
- return super.getTileMetadata(cellToTile(q));
8058
- }
8059
- getTileZoom({ q }) {
8060
- return Number(getResolution2(q));
8061
- }
8062
- getParentIndex({ q }) {
8063
- return { q: cellToParent2(q) };
8064
- }
8065
- };
8066
-
8067
- // src/layers/quadbin-tile-layer.ts
8068
- var renderSubLayers2 = (props) => {
8069
- const { data } = props;
8070
- if (!data || !data.length)
8071
- return null;
8072
- const isBigInt = typeof data[0].id === "bigint";
8073
- return new QuadbinLayer(props, {
8074
- getQuadbin: isBigInt ? (d) => d.id : (d) => hexToBigInt(d.id)
8075
- });
8076
- };
8077
- var defaultProps5 = {
8078
- data: TilejsonPropType,
8079
- tileSize: DEFAULT_TILE_SIZE
8080
- };
8081
- var QuadbinTileLayer = class extends import_core7.CompositeLayer {
8082
- getLoadOptions() {
8083
- const loadOptions = super.getLoadOptions() || {};
8084
- const tileJSON = this.props.data;
8085
- injectAccessToken(loadOptions, tileJSON.accessToken);
8086
- loadOptions.cartoSpatialTile = { ...loadOptions.cartoSpatialTile, scheme: "quadbin" };
8087
- return loadOptions;
8088
- }
8089
- renderLayers() {
8090
- const tileJSON = this.props.data;
8091
- if (!tileJSON)
8092
- return null;
8093
- const { tiles: data, maxresolution: maxZoom } = tileJSON;
8094
- return [
8095
- new SpatialIndexTileLayer(this.props, {
8096
- id: `quadbin-tile-layer-${this.props.id}`,
8097
- data,
8098
- TilesetClass: QuadbinTileset2D,
8099
- renderSubLayers: renderSubLayers2,
8100
- maxZoom,
8101
- loadOptions: this.getLoadOptions()
8102
- })
8103
- ];
8104
- }
8105
- };
8106
- QuadbinTileLayer.layerName = "QuadbinTileLayer";
8107
- QuadbinTileLayer.defaultProps = defaultProps5;
8108
-
8109
- // src/layers/quadbin-heatmap-tile-layer.ts
8110
- var import_core9 = __toESM(require_core(), 1);
8111
- var import_layers2 = __toESM(require_layers(), 1);
8112
-
8113
- // ../../node_modules/@luma.gl/shadertools/dist/modules/math/random/random.js
8114
- var fs = `float random(vec3 scale, float seed) {
8115
- return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);
8116
- }
8117
- `;
8118
- var random = {
8119
- name: "random",
8120
- fs
8121
- };
8122
7817
 
8123
7818
  // src/layers/heatmap.ts
8124
7819
  var glsl = (s) => `${s}`;
8125
- var fs2 = glsl`\
7820
+ var fs = glsl`\
8126
7821
  uniform heatmapUniforms {
8127
7822
  vec2 delta;
8128
7823
  float radiusPixels;
@@ -8133,11 +7828,10 @@ uniform heatmapUniforms {
8133
7828
  vec3 color4;
8134
7829
  vec3 color5;
8135
7830
  vec3 color6;
7831
+ float intensity;
8136
7832
  float opacity;
8137
7833
  } heatmap;
8138
7834
 
8139
- // Controls quality of heatmap, larger values increase quality at expense of performance
8140
- const float SUPPORT = 8.0;
8141
7835
  const vec4 STOPS = vec4(0.2, 0.4, 0.6, 0.8);
8142
7836
 
8143
7837
  vec3 colorGradient(float value) {
@@ -8156,20 +7850,18 @@ vec3 colorGradient(float value) {
8156
7850
  } else if (value < STOPS.w) {
8157
7851
  range = STOPS.zw;
8158
7852
  c1 = heatmap.color4; c2 = heatmap.color5;
8159
- } else if (value < 1.0 ) {
7853
+ } else {
8160
7854
  range = vec2(STOPS.w, 1.0);
8161
7855
  c1 = heatmap.color5; c2 = heatmap.color6;
8162
- } else {
8163
- // Fade out to white
8164
- range = vec2(1.0, 10.0);
8165
- c1 = heatmap.color6; c2 = vec3(255.0);
8166
7856
  }
8167
7857
 
8168
- float f = (value - range.x) / (range.y - range.x);
7858
+ float f = (clamp(value, 0.0, 1.0) - range.x) / (range.y - range.x);
8169
7859
  return mix(c1, c2, f) / 255.0;
8170
7860
  }
8171
7861
 
8172
7862
  const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
7863
+ const float MAX_VAL = SHIFT.z * 255.0;
7864
+ const float SCALE = MAX_VAL / 8.0;
8173
7865
  vec4 pack(float value) {
8174
7866
  return vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
8175
7867
  }
@@ -8181,16 +7873,15 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8181
7873
  bool firstPass = (heatmap.delta.y < 0.5);
8182
7874
  float accumulator = 0.0;
8183
7875
 
8184
- // Randomize the lookup values to hide the fixed number of samples
8185
- float offset = 0.5 * random(vec3(12.9898, 78.233, 151.7182), 0.0);
7876
+ // Controls quality of heatmap, larger values increase quality at expense of performance
7877
+ float SUPPORT = clamp(heatmap.radiusPixels / 2.0, 8.0, 32.0);
8186
7878
 
8187
7879
  // Gaussian normalization parameters
8188
- const float sigma = SUPPORT / 3.0;
8189
- const float a = -0.5 / (sigma * sigma);
8190
- const float w0 = 0.3989422804014327 / sigma; // 1D normalization
8191
-
7880
+ float sigma = SUPPORT / 3.0;
7881
+ float a = -0.5 / (sigma * sigma);
7882
+ float w0 = 0.3989422804014327 / sigma; // 1D normalization
8192
7883
  for (float t = -SUPPORT; t <= SUPPORT; t++) {
8193
- vec2 percent = (t * heatmap.delta + offset - 0.5) / SUPPORT;
7884
+ vec2 percent = (t * heatmap.delta - 0.5) / SUPPORT;
8194
7885
  vec2 delta = percent * heatmap.radiusPixels / texSize;
8195
7886
  vec4 offsetColor = texture(source, texCoord + delta);
8196
7887
 
@@ -8207,8 +7898,18 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8207
7898
  return pack(accumulator);
8208
7899
  }
8209
7900
 
7901
+ // Undo scaling to obtain normalized density
7902
+ float density = 10.0 * heatmap.intensity * accumulator / SCALE;
7903
+
7904
+ // Domain also in normalized density units
7905
+ vec2 domain = heatmap.colorDomain;
7906
+
8210
7907
  // Apply domain
8211
- float f = (accumulator - heatmap.colorDomain[0]) / (heatmap.colorDomain[1] - heatmap.colorDomain[0]);
7908
+ float f = (density - domain[0]) / (domain[1] - domain[0]);
7909
+
7910
+ // sqrt/log scaling??
7911
+ // float f = (log(density) - log(domain[0] + 1.0)) / (log(domain[1] + 1.0) - log(domain[0] + 1.0));
7912
+ // f = sqrt(f);
8212
7913
 
8213
7914
  // Color map
8214
7915
  vec4 color = vec4(0.0);
@@ -8241,6 +7942,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8241
7942
  color4: { value: [0, 0, 0] },
8242
7943
  color5: { value: [0, 0, 0] },
8243
7944
  color6: { value: [0, 0, 0] },
7945
+ intensity: { value: 1, min: 0.1, max: 10 },
8244
7946
  opacity: { value: 1, min: 0, max: 1 }
8245
7947
  },
8246
7948
  uniformTypes: {
@@ -8253,6 +7955,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8253
7955
  color4: "vec3<f32>",
8254
7956
  color5: "vec3<f32>",
8255
7957
  color6: "vec3<f32>",
7958
+ intensity: "f32",
8256
7959
  opacity: "f32"
8257
7960
  },
8258
7961
  getUniforms: (opts) => {
@@ -8261,6 +7964,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8261
7964
  colorRange = defaultColorRange,
8262
7965
  radiusPixels = 20,
8263
7966
  colorDomain = [0, 1],
7967
+ intensity = 1,
8264
7968
  opacity = 1
8265
7969
  } = opts;
8266
7970
  const [color1, color2, color3, color4, color5, color6] = colorRange;
@@ -8274,11 +7978,11 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8274
7978
  color6,
8275
7979
  radiusPixels,
8276
7980
  colorDomain,
7981
+ intensity,
8277
7982
  opacity
8278
7983
  };
8279
7984
  },
8280
- dependencies: [random],
8281
- fs: fs2,
7985
+ fs,
8282
7986
  passes: [
8283
7987
  { sampler: true, uniforms: { delta: [1, 0] } },
8284
7988
  { sampler: true, uniforms: { delta: [0, 1] } }
@@ -8286,7 +7990,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8286
7990
  };
8287
7991
 
8288
7992
  // src/layers/post-process-utils.ts
8289
- var import_core8 = __toESM(require_core(), 1);
7993
+ var import_core6 = __toESM(require_core(), 1);
8290
7994
  var TEXTURE_PROPS = {
8291
7995
  format: "rgba8unorm",
8292
7996
  mipmaps: false,
@@ -8303,7 +8007,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8303
8007
  }
8304
8008
  return layer;
8305
8009
  }
8306
- var DrawCallbackLayer = class extends import_core8.Layer {
8010
+ var DrawCallbackLayer = class extends import_core6.Layer {
8307
8011
  initializeState() {
8308
8012
  this.id = `draw-callback-${getPostProcessLayer(this).props.id}`;
8309
8013
  }
@@ -8335,7 +8039,7 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8335
8039
  initializeState(context) {
8336
8040
  super.initializeState(context);
8337
8041
  this._createTextures();
8338
- this.internalState.postProcess = new import_core8.PostProcessEffect(effect, this.props);
8042
+ this.internalState.postProcess = new import_core6.PostProcessEffect(effect, this.props);
8339
8043
  this.internalState.postProcess.setup(context);
8340
8044
  }
8341
8045
  updateState(params) {
@@ -8399,48 +8103,213 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8399
8103
  }, _a.layerName = `PostProcess${BaseLayer.layerName}`, _a;
8400
8104
  }
8401
8105
 
8402
- // src/layers/quadbin-heatmap-tile-layer.ts
8403
- var RTTSolidPolygonLayer = class extends RTTModifier(import_layers2.SolidPolygonLayer) {
8106
+ // src/layers/quadbin-tile-layer.ts
8107
+ var import_core7 = __toESM(require_core(), 1);
8108
+
8109
+ // src/layers/quadbin-layer.ts
8110
+ var import_geo_layers4 = __toESM(require_geo_layers(), 1);
8111
+
8112
+ // ../../node_modules/@math.gl/web-mercator/dist/web-mercator-utils.js
8113
+ var PI = Math.PI;
8114
+ var PI_4 = PI / 4;
8115
+ var DEGREES_TO_RADIANS = PI / 180;
8116
+ var RADIANS_TO_DEGREES = 180 / PI;
8117
+ var TILE_SIZE = 512;
8118
+ function worldToLngLat(xy) {
8119
+ const [x, y] = xy;
8120
+ const lambda2 = x / TILE_SIZE * (2 * PI) - PI;
8121
+ const phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);
8122
+ return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];
8123
+ }
8124
+
8125
+ // ../../node_modules/@math.gl/web-mercator/dist/get-bounds.js
8126
+ var DEGREES_TO_RADIANS2 = Math.PI / 180;
8127
+
8128
+ // src/layers/quadbin-utils.ts
8129
+ var TILE_SIZE2 = 512;
8130
+ function quadbinToOffset(quadbin) {
8131
+ const { x, y, z } = cellToTile(quadbin);
8132
+ const scale = TILE_SIZE2 / (1 << z);
8133
+ return [x * scale, TILE_SIZE2 - y * scale, scale];
8134
+ }
8135
+ function quadbinToWorldBounds(quadbin, coverage) {
8136
+ const [xOffset, yOffset, scale] = quadbinToOffset(quadbin);
8137
+ return [
8138
+ [xOffset, yOffset],
8139
+ [xOffset + coverage * scale, yOffset - coverage * scale]
8140
+ ];
8141
+ }
8142
+ function getQuadbinPolygon(quadbin, coverage = 1) {
8143
+ const [topLeft, bottomRight] = quadbinToWorldBounds(quadbin, coverage);
8144
+ const [w, n] = worldToLngLat(topLeft);
8145
+ const [e, s] = worldToLngLat(bottomRight);
8146
+ return [e, n, e, s, w, s, w, n, e, n];
8147
+ }
8148
+
8149
+ // src/layers/quadbin-layer.ts
8150
+ var defaultProps3 = {
8151
+ getQuadbin: { type: "accessor", value: (d) => d.quadbin }
8152
+ };
8153
+ var QuadbinLayer = class extends import_geo_layers4._GeoCellLayer {
8154
+ indexToBounds() {
8155
+ const { data, extruded, getQuadbin } = this.props;
8156
+ const coverage = extruded ? 0.99 : 1;
8157
+ return {
8158
+ data,
8159
+ _normalize: false,
8160
+ positionFormat: "XY",
8161
+ getPolygon: (x, objectInfo) => getQuadbinPolygon(getQuadbin(x, objectInfo), coverage),
8162
+ updateTriggers: { getPolygon: coverage }
8163
+ };
8164
+ }
8165
+ };
8166
+ QuadbinLayer.layerName = "QuadbinLayer";
8167
+ QuadbinLayer.defaultProps = defaultProps3;
8168
+
8169
+ // src/layers/quadbin-tileset-2d.ts
8170
+ var import_geo_layers5 = __toESM(require_geo_layers(), 1);
8171
+ var QuadbinTileset2D = class extends import_geo_layers5._Tileset2D {
8172
+ getTileIndices(opts) {
8173
+ return super.getTileIndices(opts).map(tileToCell).map((q) => ({ q, i: bigIntToHex(q) }));
8174
+ }
8175
+ getTileId({ q, i }) {
8176
+ return i || bigIntToHex(q);
8177
+ }
8178
+ getTileMetadata({ q }) {
8179
+ return super.getTileMetadata(cellToTile(q));
8180
+ }
8181
+ getTileZoom({ q }) {
8182
+ return Number(getResolution2(q));
8183
+ }
8184
+ getParentIndex({ q }) {
8185
+ return { q: cellToParent2(q) };
8186
+ }
8187
+ };
8188
+
8189
+ // src/layers/quadbin-tile-layer.ts
8190
+ var renderSubLayers2 = (props) => {
8191
+ const { data } = props;
8192
+ if (!data || !data.length)
8193
+ return null;
8194
+ const isBigInt = typeof data[0].id === "bigint";
8195
+ return new QuadbinLayer(props, {
8196
+ getQuadbin: isBigInt ? (d) => d.id : (d) => hexToBigInt(d.id)
8197
+ });
8198
+ };
8199
+ var defaultProps4 = {
8200
+ data: TilejsonPropType,
8201
+ tileSize: DEFAULT_TILE_SIZE
8202
+ };
8203
+ var QuadbinTileLayer = class extends import_core7.CompositeLayer {
8204
+ getLoadOptions() {
8205
+ const loadOptions = super.getLoadOptions() || {};
8206
+ const tileJSON = this.props.data;
8207
+ injectAccessToken(loadOptions, tileJSON.accessToken);
8208
+ loadOptions.cartoSpatialTile = { ...loadOptions.cartoSpatialTile, scheme: "quadbin" };
8209
+ return loadOptions;
8210
+ }
8211
+ renderLayers() {
8212
+ const tileJSON = this.props.data;
8213
+ if (!tileJSON)
8214
+ return null;
8215
+ const { tiles: data, maxresolution: maxZoom } = tileJSON;
8216
+ return [
8217
+ new SpatialIndexTileLayer(this.props, {
8218
+ id: `quadbin-tile-layer-${this.props.id}`,
8219
+ data,
8220
+ TilesetClass: QuadbinTileset2D,
8221
+ renderSubLayers: renderSubLayers2,
8222
+ maxZoom,
8223
+ loadOptions: this.getLoadOptions()
8224
+ })
8225
+ ];
8226
+ }
8227
+ };
8228
+ QuadbinTileLayer.layerName = "QuadbinTileLayer";
8229
+ QuadbinTileLayer.defaultProps = defaultProps4;
8230
+
8231
+ // src/layers/heatmap-tile-layer.ts
8232
+ function unitDensityForCell(cell) {
8233
+ const cellResolution = Number(getResolution2(cell));
8234
+ return Math.pow(4, cellResolution);
8235
+ }
8236
+ var RTTSolidPolygonLayer = class extends RTTModifier(import_layers.SolidPolygonLayer) {
8404
8237
  getShaders(type) {
8405
8238
  const shaders = super.getShaders(type);
8406
8239
  shaders.inject = {
8407
- "vs:#decl": "uniform float cellResolution;",
8408
- "vs:DECKGL_FILTER_COLOR": `
8409
- const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
8410
- float value = 255.0 * dot(SHIFT, color.rgb);
8240
+ "vs:#decl": `
8241
+ uniform float densityFactor;
8242
+ `,
8243
+ "vs:#main-end": `
8244
+ // Value from getWeight accessor
8245
+ float weight = elevations;
8411
8246
 
8412
8247
  // Keep "power" delivered to screen constant when tiles update
8413
- float relativeZoom = log2(project_uScale) - cellResolution + 3.5; // range 0-1
8414
- float relativeArea = pow(2.0, -2.0 * relativeZoom); // range 0.25-1
8415
- value *= relativeArea;
8248
+ // by outputting normalized density
8249
+ weight *= densityFactor;
8416
8250
 
8417
8251
  // Pack float into 3 channels to pass to heatmap shader
8418
- color = vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
8419
- `
8252
+ // SCALE value important, as we don't want to saturate
8253
+ // but also want enough definition to avoid banding
8254
+ const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
8255
+ const float MAX_VAL = SHIFT.z * 255.0;
8256
+ const float SCALE = MAX_VAL / 8.0;
8257
+ weight *= SCALE;
8258
+ weight = clamp(weight, 0.0, MAX_VAL);
8259
+ vColor = vec4(mod(vec3(weight, floor(weight / SHIFT.yz)), 256.0), 255.0) / 255.0;
8260
+ `
8420
8261
  };
8421
8262
  return shaders;
8422
8263
  }
8423
8264
  draw(opts) {
8424
- const cell0 = this.props.data[0];
8425
- const cellResolution = Number(getResolution2(cell0.id));
8265
+ const cell = this.props.data[0];
8266
+ const maxDensity = this.props.elevationScale;
8267
+ const densityFactor = unitDensityForCell(cell.id) / maxDensity;
8426
8268
  for (const model of this.state.models) {
8427
- model.setUniforms({ cellResolution });
8269
+ model.setUniforms({ densityFactor });
8428
8270
  }
8429
8271
  super.draw(opts);
8430
8272
  }
8431
8273
  };
8432
8274
  RTTSolidPolygonLayer.layerName = "RTTSolidPolygonLayer";
8433
8275
  var PostProcessQuadbinTileLayer = PostProcessModifier(QuadbinTileLayer, heatmap);
8434
- function encodeWeight(w) {
8435
- return [w % 256, Math.floor(w / 256), Math.floor(w / (256 * 256))];
8436
- }
8437
- var defaultProps6 = {
8276
+ var defaultProps5 = {
8438
8277
  data: TilejsonPropType,
8439
- getWeight: { type: "accessor", value: 1 }
8278
+ getWeight: { type: "accessor", value: 1 },
8279
+ onMaxDensityChange: { type: "function", optional: true, value: null },
8280
+ colorDomain: { type: "array", value: [0, 1] },
8281
+ intensity: { type: "number", value: 1 },
8282
+ radiusPixels: { type: "number", min: 0, max: 100, value: 20 }
8440
8283
  };
8441
- var QuadbinHeatmapTileLayer = class extends import_core9.CompositeLayer {
8284
+ var HeatmapTileLayer = class extends import_core8.CompositeLayer {
8285
+ initializeState() {
8286
+ this.state = {
8287
+ isLoaded: false,
8288
+ tiles: /* @__PURE__ */ new Set(),
8289
+ viewportChanged: false
8290
+ };
8291
+ }
8292
+ shouldUpdateState({ changeFlags }) {
8293
+ const { viewportChanged } = changeFlags;
8294
+ this.setState({ viewportChanged });
8295
+ return changeFlags.somethingChanged;
8296
+ }
8442
8297
  renderLayers() {
8443
- const { getWeight, colorDomain, colorRange, radiusPixels, _subLayerProps } = this.props;
8298
+ const {
8299
+ data,
8300
+ getWeight,
8301
+ colorDomain,
8302
+ colorRange,
8303
+ intensity,
8304
+ radiusPixels,
8305
+ _subLayerProps,
8306
+ updateTriggers,
8307
+ onMaxDensityChange,
8308
+ onViewportLoad,
8309
+ onTileLoad,
8310
+ onTileUnload,
8311
+ ...tileLayerProps
8312
+ } = this.props;
8444
8313
  const subLayerProps = {
8445
8314
  ..._subLayerProps,
8446
8315
  cell: {
@@ -8454,26 +8323,245 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
8454
8323
  }
8455
8324
  }
8456
8325
  };
8457
- const getFillColor = typeof getWeight === "function" ? (d, info) => encodeWeight(getWeight(d, info)) : encodeWeight(getWeight);
8326
+ let tileZ = 0;
8327
+ let maxDensity = 0;
8328
+ const tiles2 = [...this.state.tiles].filter((t) => t.isVisible && t.data);
8329
+ for (const tile of tiles2) {
8330
+ const cell = tile.data[0];
8331
+ const unitDensity = unitDensityForCell(cell.id);
8332
+ maxDensity = Math.max(tile.userData.maxWeight * unitDensity, maxDensity);
8333
+ tileZ = Math.max(tile.zoom, tileZ);
8334
+ }
8335
+ const overzoom = this.context.viewport.zoom - tileZ;
8336
+ const estimatedMaxDensity = maxDensity * Math.pow(2, overzoom);
8337
+ maxDensity = estimatedMaxDensity;
8338
+ if (typeof onMaxDensityChange === "function") {
8339
+ onMaxDensityChange(maxDensity);
8340
+ }
8458
8341
  return new PostProcessQuadbinTileLayer(
8342
+ tileLayerProps,
8459
8343
  this.getSubLayerProps({
8460
8344
  id: "heatmap",
8461
- data: this.props.data,
8462
- getFillColor,
8345
+ data,
8346
+ getFillColor: 0,
8347
+ getElevation: getWeight,
8348
+ elevationScale: maxDensity,
8463
8349
  colorDomain,
8464
8350
  colorRange,
8465
8351
  radiusPixels,
8352
+ intensity,
8466
8353
  _subLayerProps: subLayerProps,
8354
+ refinementStrategy: "no-overlap",
8355
+ extruded: false,
8356
+ stroked: false,
8467
8357
  updateTriggers: {
8468
- getPosition: this.props.updateTriggers.getWeight
8469
- }
8358
+ getElevation: updateTriggers.getWeight
8359
+ },
8360
+ onViewportLoad: (tiles3) => {
8361
+ this.setState({ isLoaded: true });
8362
+ if (typeof onViewportLoad === "function") {
8363
+ onViewportLoad(tiles3);
8364
+ }
8365
+ },
8366
+ onTileLoad: (tile) => {
8367
+ let maxWeight = -Infinity;
8368
+ if (typeof getWeight !== "function") {
8369
+ maxWeight = getWeight;
8370
+ } else if (tile.content) {
8371
+ for (const d of tile.content) {
8372
+ maxWeight = Math.max(getWeight(d, {}), maxWeight);
8373
+ }
8374
+ }
8375
+ tile.userData = { maxWeight };
8376
+ this.state.tiles.add(tile);
8377
+ if (typeof onTileLoad === "function") {
8378
+ onTileLoad(tile);
8379
+ }
8380
+ },
8381
+ onTileUnload: (tile) => {
8382
+ this.state.tiles.delete(tile);
8383
+ if (typeof onTileUnload === "function") {
8384
+ onTileUnload(tile);
8385
+ }
8386
+ },
8387
+ transitions: { elevationScale: { type: "spring", stiffness: 0.3, damping: 0.5 } }
8470
8388
  })
8471
8389
  );
8472
8390
  }
8473
8391
  };
8474
- QuadbinHeatmapTileLayer.layerName = "QuadbinHeatmapTileLayer";
8475
- QuadbinHeatmapTileLayer.defaultProps = defaultProps6;
8476
- var quadbin_heatmap_tile_layer_default = QuadbinHeatmapTileLayer;
8392
+ HeatmapTileLayer.layerName = "HeatmapTileLayer";
8393
+ HeatmapTileLayer.defaultProps = defaultProps5;
8394
+ var heatmap_tile_layer_default = HeatmapTileLayer;
8395
+
8396
+ // src/layers/point-label-layer.ts
8397
+ var import_core9 = __toESM(require_core(), 1);
8398
+ var import_layers2 = __toESM(require_layers(), 1);
8399
+ var [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
8400
+ var EnhancedTextBackgroundLayer = class extends import_layers2._TextBackgroundLayer {
8401
+ getShaders() {
8402
+ const shaders = super.getShaders();
8403
+ let vs = shaders.vs;
8404
+ vs = vs.replaceAll("padding.", "_padding.");
8405
+ vs = vs.replace(
8406
+ "void main(void) {",
8407
+ "void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);"
8408
+ );
8409
+ return { ...shaders, vs };
8410
+ }
8411
+ };
8412
+ EnhancedTextBackgroundLayer.layerName = "EnhancedTextBackgroundLayer";
8413
+ var EnhancedTextLayer = class extends import_layers2.TextLayer {
8414
+ filterSubLayer({ layer, renderPass }) {
8415
+ const background = layer.id.includes("primary-background");
8416
+ if (renderPass === "collision") {
8417
+ return background;
8418
+ }
8419
+ return !background;
8420
+ }
8421
+ };
8422
+ EnhancedTextLayer.layerName = "EnhancedTextLayer";
8423
+ var defaultProps6 = {
8424
+ ...import_layers2.TextLayer.defaultProps,
8425
+ getRadius: { type: "accessor", value: 1 },
8426
+ radiusScale: { type: "number", min: 0, value: 1 }
8427
+ };
8428
+ var PointLabelLayer = class extends import_core9.CompositeLayer {
8429
+ calculatePixelOffset(secondary) {
8430
+ const {
8431
+ getTextAnchor: anchor,
8432
+ getAlignmentBaseline: alignment,
8433
+ getRadius,
8434
+ getSecondaryText,
8435
+ radiusScale,
8436
+ secondarySizeScale,
8437
+ sizeScale
8438
+ } = this.props;
8439
+ const xMult = anchor === "middle" ? 0 : anchor === "start" ? 1 : -1;
8440
+ const yMult = alignment === "center" ? 0 : alignment === "bottom" ? 1 : -1;
8441
+ const xPadding = sizeScale / 4;
8442
+ const yPadding = sizeScale * (1 + 1 / 4);
8443
+ const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
8444
+ let yOffset = secondary ? secondaryOffset : 0;
8445
+ if (anchor === "middle" && alignment === "top" && getSecondaryText) {
8446
+ yOffset -= secondaryOffset;
8447
+ yOffset -= secondarySizeScale;
8448
+ yOffset += sizeScale;
8449
+ }
8450
+ const radiusPadding = 1 + 1 / 4;
8451
+ return typeof getRadius === "function" ? (d, info) => {
8452
+ const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
8453
+ return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
8454
+ } : [
8455
+ xMult * (getRadius * radiusScale * radiusPadding + xPadding),
8456
+ yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
8457
+ ];
8458
+ }
8459
+ calculateBackgroundPadding() {
8460
+ const { getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale } = this.props;
8461
+ const paddingX = 12 * sizeScale;
8462
+ const paddingY = 3 * sizeScale;
8463
+ const backgroundPadding = [0, 0, 0, 0];
8464
+ if (alignment === "top") {
8465
+ backgroundPadding[TOP] = paddingY;
8466
+ } else if (alignment === "bottom") {
8467
+ backgroundPadding[BOTTOM] = paddingY;
8468
+ } else {
8469
+ backgroundPadding[TOP] = 0.5 * paddingY;
8470
+ backgroundPadding[BOTTOM] = 0.5 * paddingY;
8471
+ }
8472
+ if (anchor === "start") {
8473
+ backgroundPadding[LEFT] = paddingX;
8474
+ } else if (anchor === "end") {
8475
+ backgroundPadding[RIGHT] = paddingX;
8476
+ } else {
8477
+ backgroundPadding[LEFT] = 0.5 * paddingX;
8478
+ backgroundPadding[RIGHT] = 0.5 * paddingX;
8479
+ }
8480
+ return backgroundPadding;
8481
+ }
8482
+ renderTextLayer(id4, { updateTriggers: updateTriggersOverride = {}, ...props }) {
8483
+ const {
8484
+ data,
8485
+ characterSet,
8486
+ fontFamily,
8487
+ fontSettings,
8488
+ fontWeight,
8489
+ outlineColor,
8490
+ outlineWidth,
8491
+ sizeScale,
8492
+ radiusScale,
8493
+ getAlignmentBaseline,
8494
+ getColor,
8495
+ getPosition,
8496
+ getTextAnchor,
8497
+ updateTriggers
8498
+ } = this.props;
8499
+ return new EnhancedTextLayer(
8500
+ this.getSubLayerProps({
8501
+ id: id4,
8502
+ data,
8503
+ characterSet,
8504
+ fontFamily,
8505
+ fontSettings,
8506
+ fontWeight,
8507
+ outlineColor,
8508
+ outlineWidth,
8509
+ sizeScale,
8510
+ getAlignmentBaseline,
8511
+ getColor,
8512
+ getPosition,
8513
+ getTextAnchor,
8514
+ updateTriggers: {
8515
+ ...updateTriggers,
8516
+ ...updateTriggersOverride,
8517
+ getPixelOffset: [
8518
+ updateTriggers.getRadius,
8519
+ updateTriggers.getTextAnchor,
8520
+ updateTriggers.getAlignmentBaseline,
8521
+ radiusScale,
8522
+ sizeScale
8523
+ ]
8524
+ }
8525
+ }),
8526
+ {
8527
+ getSize: 1,
8528
+ _subLayerProps: { background: { type: EnhancedTextBackgroundLayer } }
8529
+ },
8530
+ props
8531
+ );
8532
+ }
8533
+ renderLayers() {
8534
+ const {
8535
+ getText,
8536
+ getSecondaryColor,
8537
+ getSecondaryText,
8538
+ secondaryOutlineColor,
8539
+ secondarySizeScale,
8540
+ updateTriggers
8541
+ } = this.props;
8542
+ const getPixelOffset = this.calculatePixelOffset(false);
8543
+ const backgroundPadding = this.calculateBackgroundPadding();
8544
+ const out = [
8545
+ this.renderTextLayer(`${updateTriggers.getText}-primary`, {
8546
+ backgroundPadding,
8547
+ getText,
8548
+ getPixelOffset,
8549
+ background: true
8550
+ }),
8551
+ Boolean(getSecondaryText) && this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
8552
+ getText: getSecondaryText,
8553
+ getPixelOffset: this.calculatePixelOffset(true),
8554
+ getAlignmentBaseline: "top",
8555
+ ...getSecondaryColor && { getColor: getSecondaryColor },
8556
+ ...secondarySizeScale && { sizeScale: secondarySizeScale },
8557
+ ...secondaryOutlineColor && { outlineColor: secondaryOutlineColor }
8558
+ })
8559
+ ];
8560
+ return out;
8561
+ }
8562
+ };
8563
+ PointLabelLayer.layerName = "PointLabelLayer";
8564
+ PointLabelLayer.defaultProps = defaultProps6;
8477
8565
 
8478
8566
  // src/layers/raster-tile-layer.ts
8479
8567
  var import_core11 = __toESM(require_core(), 1);
@@ -8821,170 +8909,6 @@ void main(void) {
8821
8909
  var import_extensions = __toESM(require_extensions(), 1);
8822
8910
  var import_geo_layers6 = __toESM(require_geo_layers(), 1);
8823
8911
  var import_layers4 = __toESM(require_layers(), 1);
8824
-
8825
- // ../../node_modules/@loaders.gl/gis/dist/lib/binary-features/binary-to-geojson.js
8826
- function binaryToGeojson(data, options) {
8827
- const globalFeatureId = options?.globalFeatureId;
8828
- if (globalFeatureId !== void 0) {
8829
- return getSingleFeature(data, globalFeatureId);
8830
- }
8831
- return parseFeatures(data, options?.type);
8832
- }
8833
- function getSingleFeature(data, globalFeatureId) {
8834
- const dataArray = normalizeInput(data);
8835
- for (const data2 of dataArray) {
8836
- let lastIndex = 0;
8837
- let lastValue = data2.featureIds.value[0];
8838
- for (let i = 0; i < data2.featureIds.value.length; i++) {
8839
- const currValue = data2.featureIds.value[i];
8840
- if (currValue === lastValue) {
8841
- continue;
8842
- }
8843
- if (globalFeatureId === data2.globalFeatureIds.value[lastIndex]) {
8844
- return parseFeature(data2, lastIndex, i);
8845
- }
8846
- lastIndex = i;
8847
- lastValue = currValue;
8848
- }
8849
- if (globalFeatureId === data2.globalFeatureIds.value[lastIndex]) {
8850
- return parseFeature(data2, lastIndex, data2.featureIds.value.length);
8851
- }
8852
- }
8853
- throw new Error(`featureId:${globalFeatureId} not found`);
8854
- }
8855
- function parseFeatures(data, type) {
8856
- const dataArray = normalizeInput(data, type);
8857
- return parseFeatureCollection(dataArray);
8858
- }
8859
- function binaryToGeometry(data, startIndex, endIndex) {
8860
- switch (data.type) {
8861
- case "Point":
8862
- return pointToGeoJson(data, startIndex, endIndex);
8863
- case "LineString":
8864
- return lineStringToGeoJson(data, startIndex, endIndex);
8865
- case "Polygon":
8866
- return polygonToGeoJson(data, startIndex, endIndex);
8867
- default:
8868
- const unexpectedInput = data;
8869
- throw new Error(`Unsupported geometry type: ${unexpectedInput?.type}`);
8870
- }
8871
- }
8872
- function normalizeInput(data, type) {
8873
- const features = [];
8874
- if (data.points) {
8875
- data.points.type = "Point";
8876
- features.push(data.points);
8877
- }
8878
- if (data.lines) {
8879
- data.lines.type = "LineString";
8880
- features.push(data.lines);
8881
- }
8882
- if (data.polygons) {
8883
- data.polygons.type = "Polygon";
8884
- features.push(data.polygons);
8885
- }
8886
- return features;
8887
- }
8888
- function parseFeatureCollection(dataArray) {
8889
- const features = [];
8890
- for (const data of dataArray) {
8891
- if (data.featureIds.value.length === 0) {
8892
- continue;
8893
- }
8894
- let lastIndex = 0;
8895
- let lastValue = data.featureIds.value[0];
8896
- for (let i = 0; i < data.featureIds.value.length; i++) {
8897
- const currValue = data.featureIds.value[i];
8898
- if (currValue === lastValue) {
8899
- continue;
8900
- }
8901
- features.push(parseFeature(data, lastIndex, i));
8902
- lastIndex = i;
8903
- lastValue = currValue;
8904
- }
8905
- features.push(parseFeature(data, lastIndex, data.featureIds.value.length));
8906
- }
8907
- return features;
8908
- }
8909
- function parseFeature(data, startIndex, endIndex) {
8910
- const geometry = binaryToGeometry(data, startIndex, endIndex);
8911
- const properties = parseProperties(data, startIndex, endIndex);
8912
- const fields = parseFields(data, startIndex, endIndex);
8913
- return { type: "Feature", geometry, properties, ...fields };
8914
- }
8915
- function parseFields(data, startIndex = 0, endIndex) {
8916
- return data.fields && data.fields[data.featureIds.value[startIndex]];
8917
- }
8918
- function parseProperties(data, startIndex = 0, endIndex) {
8919
- const properties = Object.assign({}, data.properties[data.featureIds.value[startIndex]]);
8920
- for (const key in data.numericProps) {
8921
- properties[key] = data.numericProps[key].value[startIndex];
8922
- }
8923
- return properties;
8924
- }
8925
- function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
8926
- const { positions } = data;
8927
- const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
8928
- const primitivePolygonIndices = data.primitivePolygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
8929
- const multi = polygonIndices.length > 2;
8930
- if (!multi) {
8931
- const coordinates2 = [];
8932
- for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {
8933
- const startRingIndex = primitivePolygonIndices[i];
8934
- const endRingIndex = primitivePolygonIndices[i + 1];
8935
- const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
8936
- coordinates2.push(ringCoordinates);
8937
- }
8938
- return { type: "Polygon", coordinates: coordinates2 };
8939
- }
8940
- const coordinates = [];
8941
- for (let i = 0; i < polygonIndices.length - 1; i++) {
8942
- const startPolygonIndex = polygonIndices[i];
8943
- const endPolygonIndex = polygonIndices[i + 1];
8944
- const polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
8945
- coordinates.push(polygonCoordinates);
8946
- }
8947
- return { type: "MultiPolygon", coordinates };
8948
- }
8949
- function lineStringToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
8950
- const { positions } = data;
8951
- const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);
8952
- const multi = pathIndices.length > 2;
8953
- if (!multi) {
8954
- const coordinates2 = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
8955
- return { type: "LineString", coordinates: coordinates2 };
8956
- }
8957
- const coordinates = [];
8958
- for (let i = 0; i < pathIndices.length - 1; i++) {
8959
- const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
8960
- coordinates.push(ringCoordinates);
8961
- }
8962
- return { type: "MultiLineString", coordinates };
8963
- }
8964
- function pointToGeoJson(data, startIndex, endIndex) {
8965
- const { positions } = data;
8966
- const coordinates = ringToGeoJson(positions, startIndex, endIndex);
8967
- const multi = coordinates.length > 1;
8968
- if (multi) {
8969
- return { type: "MultiPoint", coordinates };
8970
- }
8971
- return { type: "Point", coordinates: coordinates[0] };
8972
- }
8973
- function ringToGeoJson(positions, startIndex, endIndex) {
8974
- startIndex = startIndex || 0;
8975
- endIndex = endIndex || positions.value.length / positions.size;
8976
- const ringCoordinates = [];
8977
- for (let j = startIndex; j < endIndex; j++) {
8978
- const coord = Array();
8979
- for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {
8980
- coord.push(Number(positions.value[k]));
8981
- }
8982
- ringCoordinates.push(coord);
8983
- }
8984
- return ringCoordinates;
8985
- }
8986
-
8987
- // src/layers/vector-tile-layer.ts
8988
8912
  (0, import_core12.registerLoaders)([carto_properties_tile_loader_default, carto_vector_tile_loader_default]);
8989
8913
  var defaultProps9 = {
8990
8914
  ...import_geo_layers6.MVTLayer.defaultProps,
@@ -9063,15 +8987,10 @@ void main(void) {
9063
8987
  const subLayer = new import_layers4.GeoJsonLayer(subLayerProps);
9064
8988
  return subLayer;
9065
8989
  }
9066
- getPickingInfo(params) {
9067
- const info = super.getPickingInfo(params);
9068
- if (this.state.binary && info.index !== -1) {
9069
- const { data } = params.sourceLayer.props;
9070
- info.object = binaryToGeojson(data, {
9071
- globalFeatureId: info.index
9072
- });
9073
- }
9074
- return info;
8990
+ _isWGS84() {
8991
+ if (this.state.mvt)
8992
+ return super._isWGS84();
8993
+ return true;
9075
8994
  }
9076
8995
  };
9077
8996
  VectorTileLayer.layerName = "VectorTileLayer";
@@ -9079,7 +8998,7 @@ void main(void) {
9079
8998
 
9080
8999
  // src/api/carto-api-error.ts
9081
9000
  var CartoAPIError = class extends Error {
9082
- constructor(error, errorContext, response) {
9001
+ constructor(error, errorContext, response, responseJson) {
9083
9002
  let responseString = "Failed to connect";
9084
9003
  if (response) {
9085
9004
  responseString = "Server returned: ";
@@ -9108,6 +9027,7 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
9108
9027
  super(message);
9109
9028
  this.name = "CartoAPIError";
9110
9029
  this.response = response;
9030
+ this.responseJson = responseJson;
9111
9031
  this.error = error;
9112
9032
  this.errorContext = errorContext;
9113
9033
  }
@@ -12627,19 +12547,10 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
12627
12547
  }
12628
12548
 
12629
12549
  // src/api/common.ts
12630
- var import_core13 = __toESM(require_core(), 1);
12631
12550
  var DEFAULT_API_BASE_URL = "https://gcp-us-east1.api.carto.com";
12632
12551
  var DEFAULT_CLIENT = "deck-gl-carto";
12633
12552
  var V3_MINOR_VERSION = "3.4";
12634
12553
  var MAX_GET_LENGTH = 8192;
12635
- var DEFAULT_PARAMETERS = {
12636
- v: V3_MINOR_VERSION,
12637
- deckglVersion: import_core13.VERSION
12638
- };
12639
- var DEFAULT_HEADERS = {
12640
- Accept: "application/json",
12641
- "Content-Type": "application/json"
12642
- };
12643
12554
 
12644
12555
  // src/api/endpoints.ts
12645
12556
  function joinPath(...args) {
@@ -12681,39 +12592,45 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
12681
12592
  }
12682
12593
 
12683
12594
  // src/api/request-with-parameters.ts
12684
- function encodeParameter(name, value) {
12685
- if (isPureObject(value) || Array.isArray(value)) {
12686
- return `${name}=${encodeURIComponent(JSON.stringify(value))}`;
12687
- }
12688
- return `${name}=${encodeURIComponent(value)}`;
12689
- }
12595
+ var import_core13 = __toESM(require_core(), 1);
12596
+ var DEFAULT_PARAMETERS = {
12597
+ v: V3_MINOR_VERSION,
12598
+ deckglVersion: import_core13.VERSION
12599
+ };
12600
+ var DEFAULT_HEADERS = {
12601
+ Accept: "application/json",
12602
+ "Content-Type": "application/json"
12603
+ };
12690
12604
  var REQUEST_CACHE = /* @__PURE__ */ new Map();
12691
12605
  async function requestWithParameters({
12692
12606
  baseUrl,
12693
- parameters,
12694
- headers: customHeaders,
12607
+ parameters = {},
12608
+ headers: customHeaders = {},
12695
12609
  errorContext
12696
12610
  }) {
12697
12611
  parameters = { ...DEFAULT_PARAMETERS, ...parameters };
12698
- const key = createCacheKey(baseUrl, parameters || {}, customHeaders || {});
12612
+ baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));
12613
+ const key = createCacheKey(baseUrl, parameters, customHeaders);
12699
12614
  if (REQUEST_CACHE.has(key)) {
12700
12615
  return REQUEST_CACHE.get(key);
12701
12616
  }
12702
- const url = parameters ? createURLWithParameters(baseUrl, parameters) : baseUrl;
12617
+ const url = createURLWithParameters(baseUrl, parameters);
12703
12618
  const headers = { ...DEFAULT_HEADERS, ...customHeaders };
12704
12619
  const fetchPromise = url.length > MAX_GET_LENGTH ? fetch(baseUrl, { method: "POST", body: JSON.stringify(parameters), headers }) : fetch(url, { headers });
12705
12620
  let response;
12621
+ let responseJson;
12706
12622
  const jsonPromise = fetchPromise.then((_response) => {
12707
12623
  response = _response;
12708
12624
  return response.json();
12709
12625
  }).then((json) => {
12626
+ responseJson = json;
12710
12627
  if (!response || !response.ok) {
12711
12628
  throw new Error(json.error);
12712
12629
  }
12713
12630
  return json;
12714
12631
  }).catch((error) => {
12715
12632
  REQUEST_CACHE.delete(key);
12716
- throw new CartoAPIError(error, errorContext, response);
12633
+ throw new CartoAPIError(error, errorContext, response, responseJson);
12717
12634
  });
12718
12635
  REQUEST_CACHE.set(key, jsonPromise);
12719
12636
  return jsonPromise;
@@ -12723,11 +12640,25 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
12723
12640
  const headerEntries = Object.entries(headers).sort(([a], [b]) => a > b ? 1 : -1);
12724
12641
  return JSON.stringify({ baseUrl, parameters: parameterEntries, headers: headerEntries });
12725
12642
  }
12726
- function createURLWithParameters(baseUrl, parameters) {
12727
- const encodedParameters = Object.entries(parameters).map(
12728
- ([key, value]) => encodeParameter(key, value)
12729
- );
12730
- return `${baseUrl}?${encodedParameters.join("&")}`;
12643
+ function createURLWithParameters(baseUrlString, parameters) {
12644
+ const baseUrl = new URL(baseUrlString);
12645
+ for (const [key, value] of Object.entries(parameters)) {
12646
+ if (isPureObject(value) || Array.isArray(value)) {
12647
+ baseUrl.searchParams.set(key, JSON.stringify(value));
12648
+ } else {
12649
+ baseUrl.searchParams.set(key, value.toString());
12650
+ }
12651
+ }
12652
+ return baseUrl.toString();
12653
+ }
12654
+ function excludeURLParameters(baseUrlString, parameters) {
12655
+ const baseUrl = new URL(baseUrlString);
12656
+ for (const param of parameters) {
12657
+ if (baseUrl.searchParams.has(param)) {
12658
+ baseUrl.searchParams.delete(param);
12659
+ }
12660
+ }
12661
+ return baseUrl.toString();
12731
12662
  }
12732
12663
 
12733
12664
  // src/sources/base-source.ts
@@ -12881,8 +12812,11 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
12881
12812
 
12882
12813
  // src/sources/raster-source.ts
12883
12814
  var rasterSource = async function(options) {
12884
- const { tableName } = options;
12815
+ const { tableName, filters } = options;
12885
12816
  const urlParameters = { name: tableName };
12817
+ if (filters) {
12818
+ urlParameters.filters = filters;
12819
+ }
12886
12820
  return baseSource("raster", options, urlParameters);
12887
12821
  };
12888
12822
 
@@ -14574,9 +14508,9 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
14574
14508
  // src/index.ts
14575
14509
  var CARTO_LAYERS = {
14576
14510
  H3TileLayer,
14511
+ HeatmapTileLayer: heatmap_tile_layer_default,
14577
14512
  _PointLabelLayer: PointLabelLayer,
14578
14513
  QuadbinTileLayer,
14579
- QuadbinHeatmapTileLayer: quadbin_heatmap_tile_layer_default,
14580
14514
  RasterTileLayer,
14581
14515
  VectorTileLayer
14582
14516
  };