@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.
- package/dist/api/carto-api-error.d.ts +3 -1
- package/dist/api/carto-api-error.d.ts.map +1 -1
- package/dist/api/carto-api-error.js +2 -1
- package/dist/api/common.d.ts +0 -8
- package/dist/api/common.d.ts.map +1 -1
- package/dist/api/common.js +0 -9
- package/dist/api/request-with-parameters.d.ts +1 -1
- package/dist/api/request-with-parameters.d.ts.map +1 -1
- package/dist/api/request-with-parameters.js +48 -15
- package/dist/api/types.d.ts +5 -5
- package/dist/api/types.d.ts.map +1 -1
- 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 +494 -560
- package/dist/index.cjs +445 -358
- 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/sources/raster-source.d.ts +2 -2
- package/dist/sources/raster-source.d.ts.map +1 -1
- package/dist/sources/raster-source.js +4 -1
- package/dist.min.js +37 -31
- package/package.json +2 -2
- package/src/api/carto-api-error.ts +10 -1
- package/src/api/common.ts +0 -12
- package/src/api/request-with-parameters.ts +55 -19
- package/src/api/types.ts +5 -5
- 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/src/sources/raster-source.ts +10 -5
- 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 -125
package/dist/index.cjs
CHANGED
|
@@ -31,7 +31,7 @@ __export(dist_exports, {
|
|
|
31
31
|
CARTO_SOURCES: () => CARTO_SOURCES,
|
|
32
32
|
CartoAPIError: () => CartoAPIError,
|
|
33
33
|
H3TileLayer: () => H3TileLayer,
|
|
34
|
-
|
|
34
|
+
HeatmapTileLayer: () => heatmap_tile_layer_default,
|
|
35
35
|
QuadbinTileLayer: () => QuadbinTileLayer,
|
|
36
36
|
RasterTileLayer: () => RasterTileLayer,
|
|
37
37
|
SOURCE_DEFAULTS: () => SOURCE_DEFAULTS,
|
|
@@ -273,7 +273,7 @@ var isObject = (x) => x !== null && typeof x === "object";
|
|
|
273
273
|
var isPureObject = (x) => isObject(x) && x.constructor === {}.constructor;
|
|
274
274
|
|
|
275
275
|
// dist/layers/schema/carto-raster-tile-loader.js
|
|
276
|
-
var VERSION = true ? "9.0.
|
|
276
|
+
var VERSION = true ? "9.0.18" : "latest";
|
|
277
277
|
var id = "cartoRasterTile";
|
|
278
278
|
var DEFAULT_OPTIONS = {
|
|
279
279
|
cartoRasterTile: {
|
|
@@ -544,7 +544,7 @@ function binaryToSpatialjson(binary) {
|
|
|
544
544
|
}
|
|
545
545
|
|
|
546
546
|
// dist/layers/schema/carto-spatial-tile-loader.js
|
|
547
|
-
var VERSION2 = true ? "9.0.
|
|
547
|
+
var VERSION2 = true ? "9.0.18" : "latest";
|
|
548
548
|
var id2 = "cartoSpatialTile";
|
|
549
549
|
var DEFAULT_OPTIONS2 = {
|
|
550
550
|
cartoSpatialTile: {
|
|
@@ -775,280 +775,12 @@ var H3TileLayer = _H3TileLayer;
|
|
|
775
775
|
_H3TileLayer.defaultProps = defaultProps2;
|
|
776
776
|
})();
|
|
777
777
|
|
|
778
|
-
// dist/layers/
|
|
779
|
-
var import_core6 = require("@deck.gl/core");
|
|
780
|
-
var import_layers = require("@deck.gl/layers");
|
|
781
|
-
var [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
|
|
782
|
-
var _EnhancedTextBackgroundLayer = class extends import_layers._TextBackgroundLayer {
|
|
783
|
-
getShaders() {
|
|
784
|
-
const shaders = super.getShaders();
|
|
785
|
-
let vs = shaders.vs;
|
|
786
|
-
vs = vs.replaceAll("padding.", "_padding.");
|
|
787
|
-
vs = vs.replace("void main(void) {", "void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);");
|
|
788
|
-
return { ...shaders, vs };
|
|
789
|
-
}
|
|
790
|
-
};
|
|
791
|
-
var EnhancedTextBackgroundLayer = _EnhancedTextBackgroundLayer;
|
|
792
|
-
(() => {
|
|
793
|
-
_EnhancedTextBackgroundLayer.layerName = "EnhancedTextBackgroundLayer";
|
|
794
|
-
})();
|
|
795
|
-
var _EnhancedTextLayer = class extends import_layers.TextLayer {
|
|
796
|
-
filterSubLayer({ layer, renderPass }) {
|
|
797
|
-
const background = layer.id.includes("primary-background");
|
|
798
|
-
if (renderPass === "collision") {
|
|
799
|
-
return background;
|
|
800
|
-
}
|
|
801
|
-
return !background;
|
|
802
|
-
}
|
|
803
|
-
};
|
|
804
|
-
var EnhancedTextLayer = _EnhancedTextLayer;
|
|
805
|
-
(() => {
|
|
806
|
-
_EnhancedTextLayer.layerName = "EnhancedTextLayer";
|
|
807
|
-
})();
|
|
808
|
-
var defaultProps3 = {
|
|
809
|
-
...import_layers.TextLayer.defaultProps,
|
|
810
|
-
getRadius: { type: "accessor", value: 1 },
|
|
811
|
-
radiusScale: { type: "number", min: 0, value: 1 }
|
|
812
|
-
};
|
|
813
|
-
var _PointLabelLayer = class extends import_core6.CompositeLayer {
|
|
814
|
-
calculatePixelOffset(secondary) {
|
|
815
|
-
const { getTextAnchor: anchor, getAlignmentBaseline: alignment, getRadius, getSecondaryText, radiusScale, secondarySizeScale, sizeScale } = this.props;
|
|
816
|
-
const xMult = anchor === "middle" ? 0 : anchor === "start" ? 1 : -1;
|
|
817
|
-
const yMult = alignment === "center" ? 0 : alignment === "bottom" ? 1 : -1;
|
|
818
|
-
const xPadding = sizeScale / 4;
|
|
819
|
-
const yPadding = sizeScale * (1 + 1 / 4);
|
|
820
|
-
const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
|
|
821
|
-
let yOffset = secondary ? secondaryOffset : 0;
|
|
822
|
-
if (anchor === "middle" && alignment === "top" && getSecondaryText) {
|
|
823
|
-
yOffset -= secondaryOffset;
|
|
824
|
-
yOffset -= secondarySizeScale;
|
|
825
|
-
yOffset += sizeScale;
|
|
826
|
-
}
|
|
827
|
-
const radiusPadding = 1 + 1 / 4;
|
|
828
|
-
return typeof getRadius === "function" ? (d, info) => {
|
|
829
|
-
const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
|
|
830
|
-
return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
|
|
831
|
-
} : [
|
|
832
|
-
xMult * (getRadius * radiusScale * radiusPadding + xPadding),
|
|
833
|
-
yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
|
|
834
|
-
];
|
|
835
|
-
}
|
|
836
|
-
calculateBackgroundPadding() {
|
|
837
|
-
const { getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale } = this.props;
|
|
838
|
-
const paddingX = 12 * sizeScale;
|
|
839
|
-
const paddingY = 3 * sizeScale;
|
|
840
|
-
const backgroundPadding = [0, 0, 0, 0];
|
|
841
|
-
if (alignment === "top") {
|
|
842
|
-
backgroundPadding[TOP] = paddingY;
|
|
843
|
-
} else if (alignment === "bottom") {
|
|
844
|
-
backgroundPadding[BOTTOM] = paddingY;
|
|
845
|
-
} else {
|
|
846
|
-
backgroundPadding[TOP] = 0.5 * paddingY;
|
|
847
|
-
backgroundPadding[BOTTOM] = 0.5 * paddingY;
|
|
848
|
-
}
|
|
849
|
-
if (anchor === "start") {
|
|
850
|
-
backgroundPadding[LEFT] = paddingX;
|
|
851
|
-
} else if (anchor === "end") {
|
|
852
|
-
backgroundPadding[RIGHT] = paddingX;
|
|
853
|
-
} else {
|
|
854
|
-
backgroundPadding[LEFT] = 0.5 * paddingX;
|
|
855
|
-
backgroundPadding[RIGHT] = 0.5 * paddingX;
|
|
856
|
-
}
|
|
857
|
-
return backgroundPadding;
|
|
858
|
-
}
|
|
859
|
-
renderTextLayer(id4, { updateTriggers: updateTriggersOverride = {}, ...props }) {
|
|
860
|
-
const { data, characterSet, fontFamily, fontSettings, fontWeight, outlineColor, outlineWidth, sizeScale, radiusScale, getAlignmentBaseline, getColor, getPosition, getTextAnchor, updateTriggers } = this.props;
|
|
861
|
-
return new EnhancedTextLayer(this.getSubLayerProps({
|
|
862
|
-
id: id4,
|
|
863
|
-
data,
|
|
864
|
-
characterSet,
|
|
865
|
-
fontFamily,
|
|
866
|
-
fontSettings,
|
|
867
|
-
fontWeight,
|
|
868
|
-
outlineColor,
|
|
869
|
-
outlineWidth,
|
|
870
|
-
sizeScale,
|
|
871
|
-
getAlignmentBaseline,
|
|
872
|
-
getColor,
|
|
873
|
-
getPosition,
|
|
874
|
-
getTextAnchor,
|
|
875
|
-
updateTriggers: {
|
|
876
|
-
...updateTriggers,
|
|
877
|
-
...updateTriggersOverride,
|
|
878
|
-
getPixelOffset: [
|
|
879
|
-
updateTriggers.getRadius,
|
|
880
|
-
updateTriggers.getTextAnchor,
|
|
881
|
-
updateTriggers.getAlignmentBaseline,
|
|
882
|
-
radiusScale,
|
|
883
|
-
sizeScale
|
|
884
|
-
]
|
|
885
|
-
}
|
|
886
|
-
}), {
|
|
887
|
-
getSize: 1,
|
|
888
|
-
_subLayerProps: { background: { type: EnhancedTextBackgroundLayer } }
|
|
889
|
-
}, props);
|
|
890
|
-
}
|
|
891
|
-
renderLayers() {
|
|
892
|
-
const { getText, getSecondaryColor, getSecondaryText, secondaryOutlineColor, secondarySizeScale, updateTriggers } = this.props;
|
|
893
|
-
const getPixelOffset = this.calculatePixelOffset(false);
|
|
894
|
-
const backgroundPadding = this.calculateBackgroundPadding();
|
|
895
|
-
const out = [
|
|
896
|
-
this.renderTextLayer(`${updateTriggers.getText}-primary`, {
|
|
897
|
-
backgroundPadding,
|
|
898
|
-
getText,
|
|
899
|
-
getPixelOffset,
|
|
900
|
-
background: true
|
|
901
|
-
}),
|
|
902
|
-
Boolean(getSecondaryText) && this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
|
|
903
|
-
getText: getSecondaryText,
|
|
904
|
-
getPixelOffset: this.calculatePixelOffset(true),
|
|
905
|
-
getAlignmentBaseline: "top",
|
|
906
|
-
...getSecondaryColor && { getColor: getSecondaryColor },
|
|
907
|
-
...secondarySizeScale && { sizeScale: secondarySizeScale },
|
|
908
|
-
...secondaryOutlineColor && { outlineColor: secondaryOutlineColor }
|
|
909
|
-
})
|
|
910
|
-
];
|
|
911
|
-
return out;
|
|
912
|
-
}
|
|
913
|
-
};
|
|
914
|
-
var PointLabelLayer = _PointLabelLayer;
|
|
915
|
-
(() => {
|
|
916
|
-
_PointLabelLayer.layerName = "PointLabelLayer";
|
|
917
|
-
})();
|
|
918
|
-
(() => {
|
|
919
|
-
_PointLabelLayer.defaultProps = defaultProps3;
|
|
920
|
-
})();
|
|
921
|
-
|
|
922
|
-
// dist/layers/quadbin-tile-layer.js
|
|
923
|
-
var import_core7 = require("@deck.gl/core");
|
|
924
|
-
|
|
925
|
-
// dist/layers/quadbin-layer.js
|
|
926
|
-
var import_geo_layers4 = require("@deck.gl/geo-layers");
|
|
927
|
-
|
|
928
|
-
// dist/layers/quadbin-utils.js
|
|
929
|
-
var import_web_mercator = require("@math.gl/web-mercator");
|
|
930
|
-
var import_quadbin2 = require("quadbin");
|
|
931
|
-
var TILE_SIZE = 512;
|
|
932
|
-
function quadbinToOffset(quadbin) {
|
|
933
|
-
const { x, y, z } = (0, import_quadbin2.cellToTile)(quadbin);
|
|
934
|
-
const scale = TILE_SIZE / (1 << z);
|
|
935
|
-
return [x * scale, TILE_SIZE - y * scale, scale];
|
|
936
|
-
}
|
|
937
|
-
function quadbinToWorldBounds(quadbin, coverage) {
|
|
938
|
-
const [xOffset, yOffset, scale] = quadbinToOffset(quadbin);
|
|
939
|
-
return [
|
|
940
|
-
[xOffset, yOffset],
|
|
941
|
-
[xOffset + coverage * scale, yOffset - coverage * scale]
|
|
942
|
-
];
|
|
943
|
-
}
|
|
944
|
-
function getQuadbinPolygon(quadbin, coverage = 1) {
|
|
945
|
-
const [topLeft, bottomRight] = quadbinToWorldBounds(quadbin, coverage);
|
|
946
|
-
const [w, n] = (0, import_web_mercator.worldToLngLat)(topLeft);
|
|
947
|
-
const [e, s] = (0, import_web_mercator.worldToLngLat)(bottomRight);
|
|
948
|
-
return [e, n, e, s, w, s, w, n, e, n];
|
|
949
|
-
}
|
|
950
|
-
|
|
951
|
-
// dist/layers/quadbin-layer.js
|
|
952
|
-
var defaultProps4 = {
|
|
953
|
-
getQuadbin: { type: "accessor", value: (d) => d.quadbin }
|
|
954
|
-
};
|
|
955
|
-
var _QuadbinLayer = class extends import_geo_layers4._GeoCellLayer {
|
|
956
|
-
indexToBounds() {
|
|
957
|
-
const { data, extruded, getQuadbin } = this.props;
|
|
958
|
-
const coverage = extruded ? 0.99 : 1;
|
|
959
|
-
return {
|
|
960
|
-
data,
|
|
961
|
-
_normalize: false,
|
|
962
|
-
positionFormat: "XY",
|
|
963
|
-
getPolygon: (x, objectInfo) => getQuadbinPolygon(getQuadbin(x, objectInfo), coverage),
|
|
964
|
-
updateTriggers: { getPolygon: coverage }
|
|
965
|
-
};
|
|
966
|
-
}
|
|
967
|
-
};
|
|
968
|
-
var QuadbinLayer = _QuadbinLayer;
|
|
969
|
-
(() => {
|
|
970
|
-
_QuadbinLayer.layerName = "QuadbinLayer";
|
|
971
|
-
})();
|
|
972
|
-
(() => {
|
|
973
|
-
_QuadbinLayer.defaultProps = defaultProps4;
|
|
974
|
-
})();
|
|
975
|
-
|
|
976
|
-
// dist/layers/quadbin-tileset-2d.js
|
|
977
|
-
var import_geo_layers5 = require("@deck.gl/geo-layers");
|
|
978
|
-
var import_quadbin3 = require("quadbin");
|
|
979
|
-
var QuadbinTileset2D = class extends import_geo_layers5._Tileset2D {
|
|
980
|
-
getTileIndices(opts) {
|
|
981
|
-
return super.getTileIndices(opts).map(import_quadbin3.tileToCell).map((q) => ({ q, i: (0, import_quadbin3.bigIntToHex)(q) }));
|
|
982
|
-
}
|
|
983
|
-
getTileId({ q, i }) {
|
|
984
|
-
return i || (0, import_quadbin3.bigIntToHex)(q);
|
|
985
|
-
}
|
|
986
|
-
getTileMetadata({ q }) {
|
|
987
|
-
return super.getTileMetadata((0, import_quadbin3.cellToTile)(q));
|
|
988
|
-
}
|
|
989
|
-
getTileZoom({ q }) {
|
|
990
|
-
return Number((0, import_quadbin3.getResolution)(q));
|
|
991
|
-
}
|
|
992
|
-
getParentIndex({ q }) {
|
|
993
|
-
return { q: (0, import_quadbin3.cellToParent)(q) };
|
|
994
|
-
}
|
|
995
|
-
};
|
|
996
|
-
|
|
997
|
-
// dist/layers/quadbin-tile-layer.js
|
|
998
|
-
var import_quadbin4 = require("quadbin");
|
|
999
|
-
var renderSubLayers2 = (props) => {
|
|
1000
|
-
const { data } = props;
|
|
1001
|
-
if (!data || !data.length)
|
|
1002
|
-
return null;
|
|
1003
|
-
const isBigInt = typeof data[0].id === "bigint";
|
|
1004
|
-
return new QuadbinLayer(props, {
|
|
1005
|
-
getQuadbin: isBigInt ? (d) => d.id : (d) => (0, import_quadbin4.hexToBigInt)(d.id)
|
|
1006
|
-
});
|
|
1007
|
-
};
|
|
1008
|
-
var defaultProps5 = {
|
|
1009
|
-
data: TilejsonPropType,
|
|
1010
|
-
tileSize: DEFAULT_TILE_SIZE
|
|
1011
|
-
};
|
|
1012
|
-
var _QuadbinTileLayer = class extends import_core7.CompositeLayer {
|
|
1013
|
-
getLoadOptions() {
|
|
1014
|
-
const loadOptions = super.getLoadOptions() || {};
|
|
1015
|
-
const tileJSON = this.props.data;
|
|
1016
|
-
injectAccessToken(loadOptions, tileJSON.accessToken);
|
|
1017
|
-
loadOptions.cartoSpatialTile = { ...loadOptions.cartoSpatialTile, scheme: "quadbin" };
|
|
1018
|
-
return loadOptions;
|
|
1019
|
-
}
|
|
1020
|
-
renderLayers() {
|
|
1021
|
-
const tileJSON = this.props.data;
|
|
1022
|
-
if (!tileJSON)
|
|
1023
|
-
return null;
|
|
1024
|
-
const { tiles: data, maxresolution: maxZoom } = tileJSON;
|
|
1025
|
-
return [
|
|
1026
|
-
new SpatialIndexTileLayer(this.props, {
|
|
1027
|
-
id: `quadbin-tile-layer-${this.props.id}`,
|
|
1028
|
-
data,
|
|
1029
|
-
TilesetClass: QuadbinTileset2D,
|
|
1030
|
-
renderSubLayers: renderSubLayers2,
|
|
1031
|
-
maxZoom,
|
|
1032
|
-
loadOptions: this.getLoadOptions()
|
|
1033
|
-
})
|
|
1034
|
-
];
|
|
1035
|
-
}
|
|
1036
|
-
};
|
|
1037
|
-
var QuadbinTileLayer = _QuadbinTileLayer;
|
|
1038
|
-
(() => {
|
|
1039
|
-
_QuadbinTileLayer.layerName = "QuadbinTileLayer";
|
|
1040
|
-
})();
|
|
1041
|
-
(() => {
|
|
1042
|
-
_QuadbinTileLayer.defaultProps = defaultProps5;
|
|
1043
|
-
})();
|
|
1044
|
-
|
|
1045
|
-
// dist/layers/quadbin-heatmap-tile-layer.js
|
|
778
|
+
// dist/layers/heatmap-tile-layer.js
|
|
1046
779
|
var import_quadbin5 = require("quadbin");
|
|
1047
|
-
var
|
|
1048
|
-
var
|
|
780
|
+
var import_core8 = require("@deck.gl/core");
|
|
781
|
+
var import_layers = require("@deck.gl/layers");
|
|
1049
782
|
|
|
1050
783
|
// dist/layers/heatmap.js
|
|
1051
|
-
var import_shadertools = require("@luma.gl/shadertools");
|
|
1052
784
|
var fs = `uniform heatmapUniforms {
|
|
1053
785
|
vec2 delta;
|
|
1054
786
|
float radiusPixels;
|
|
@@ -1059,9 +791,9 @@ vec3 color3;
|
|
|
1059
791
|
vec3 color4;
|
|
1060
792
|
vec3 color5;
|
|
1061
793
|
vec3 color6;
|
|
794
|
+
float intensity;
|
|
1062
795
|
float opacity;
|
|
1063
796
|
} heatmap;
|
|
1064
|
-
const float SUPPORT = 8.0;
|
|
1065
797
|
const vec4 STOPS = vec4(0.2, 0.4, 0.6, 0.8);
|
|
1066
798
|
vec3 colorGradient(float value) {
|
|
1067
799
|
vec3 c1;
|
|
@@ -1079,17 +811,16 @@ c1 = heatmap.color3; c2 = heatmap.color4;
|
|
|
1079
811
|
} else if (value < STOPS.w) {
|
|
1080
812
|
range = STOPS.zw;
|
|
1081
813
|
c1 = heatmap.color4; c2 = heatmap.color5;
|
|
1082
|
-
} else
|
|
814
|
+
} else {
|
|
1083
815
|
range = vec2(STOPS.w, 1.0);
|
|
1084
816
|
c1 = heatmap.color5; c2 = heatmap.color6;
|
|
1085
|
-
} else {
|
|
1086
|
-
range = vec2(1.0, 10.0);
|
|
1087
|
-
c1 = heatmap.color6; c2 = vec3(255.0);
|
|
1088
817
|
}
|
|
1089
|
-
float f = (value - range.x) / (range.y - range.x);
|
|
818
|
+
float f = (clamp(value, 0.0, 1.0) - range.x) / (range.y - range.x);
|
|
1090
819
|
return mix(c1, c2, f) / 255.0;
|
|
1091
820
|
}
|
|
1092
821
|
const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
|
|
822
|
+
const float MAX_VAL = SHIFT.z * 255.0;
|
|
823
|
+
const float SCALE = MAX_VAL / 8.0;
|
|
1093
824
|
vec4 pack(float value) {
|
|
1094
825
|
return vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
|
|
1095
826
|
}
|
|
@@ -1099,12 +830,12 @@ return 255.0 * dot(color, SHIFT);
|
|
|
1099
830
|
vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
|
|
1100
831
|
bool firstPass = (heatmap.delta.y < 0.5);
|
|
1101
832
|
float accumulator = 0.0;
|
|
1102
|
-
float
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
833
|
+
float SUPPORT = clamp(heatmap.radiusPixels / 2.0, 8.0, 32.0);
|
|
834
|
+
float sigma = SUPPORT / 3.0;
|
|
835
|
+
float a = -0.5 / (sigma * sigma);
|
|
836
|
+
float w0 = 0.3989422804014327 / sigma;
|
|
1106
837
|
for (float t = -SUPPORT; t <= SUPPORT; t++) {
|
|
1107
|
-
vec2 percent = (t * heatmap.delta
|
|
838
|
+
vec2 percent = (t * heatmap.delta - 0.5) / SUPPORT;
|
|
1108
839
|
vec2 delta = percent * heatmap.radiusPixels / texSize;
|
|
1109
840
|
vec4 offsetColor = texture(source, texCoord + delta);
|
|
1110
841
|
float value = unpack(offsetColor.rgb);
|
|
@@ -1114,7 +845,9 @@ accumulator += value * weight;
|
|
|
1114
845
|
if (firstPass) {
|
|
1115
846
|
return pack(accumulator);
|
|
1116
847
|
}
|
|
1117
|
-
float
|
|
848
|
+
float density = 10.0 * heatmap.intensity * accumulator / SCALE;
|
|
849
|
+
vec2 domain = heatmap.colorDomain;
|
|
850
|
+
float f = (density - domain[0]) / (domain[1] - domain[0]);
|
|
1118
851
|
vec4 color = vec4(0.0);
|
|
1119
852
|
color.rgb = colorGradient(f);
|
|
1120
853
|
color.a = smoothstep(0.0, 0.1, f);
|
|
@@ -1143,6 +876,7 @@ var heatmap = {
|
|
|
1143
876
|
color4: { value: [0, 0, 0] },
|
|
1144
877
|
color5: { value: [0, 0, 0] },
|
|
1145
878
|
color6: { value: [0, 0, 0] },
|
|
879
|
+
intensity: { value: 1, min: 0.1, max: 10 },
|
|
1146
880
|
opacity: { value: 1, min: 0, max: 1 }
|
|
1147
881
|
},
|
|
1148
882
|
uniformTypes: {
|
|
@@ -1155,10 +889,11 @@ var heatmap = {
|
|
|
1155
889
|
color4: "vec3<f32>",
|
|
1156
890
|
color5: "vec3<f32>",
|
|
1157
891
|
color6: "vec3<f32>",
|
|
892
|
+
intensity: "f32",
|
|
1158
893
|
opacity: "f32"
|
|
1159
894
|
},
|
|
1160
895
|
getUniforms: (opts) => {
|
|
1161
|
-
const { delta = [1, 0], colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], opacity = 1 } = opts;
|
|
896
|
+
const { delta = [1, 0], colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], intensity = 1, opacity = 1 } = opts;
|
|
1162
897
|
const [color1, color2, color3, color4, color5, color6] = colorRange;
|
|
1163
898
|
return {
|
|
1164
899
|
delta,
|
|
@@ -1170,10 +905,10 @@ var heatmap = {
|
|
|
1170
905
|
color6,
|
|
1171
906
|
radiusPixels,
|
|
1172
907
|
colorDomain,
|
|
908
|
+
intensity,
|
|
1173
909
|
opacity
|
|
1174
910
|
};
|
|
1175
911
|
},
|
|
1176
|
-
dependencies: [import_shadertools.random],
|
|
1177
912
|
fs,
|
|
1178
913
|
passes: [
|
|
1179
914
|
{ sampler: true, uniforms: { delta: [1, 0] } },
|
|
@@ -1182,7 +917,7 @@ var heatmap = {
|
|
|
1182
917
|
};
|
|
1183
918
|
|
|
1184
919
|
// dist/layers/post-process-utils.js
|
|
1185
|
-
var
|
|
920
|
+
var import_core6 = require("@deck.gl/core");
|
|
1186
921
|
var TEXTURE_PROPS = {
|
|
1187
922
|
format: "rgba8unorm",
|
|
1188
923
|
mipmaps: false,
|
|
@@ -1199,7 +934,7 @@ function getPostProcessLayer(layer) {
|
|
|
1199
934
|
}
|
|
1200
935
|
return layer;
|
|
1201
936
|
}
|
|
1202
|
-
var _DrawCallbackLayer = class extends
|
|
937
|
+
var _DrawCallbackLayer = class extends import_core6.Layer {
|
|
1203
938
|
initializeState() {
|
|
1204
939
|
this.id = `draw-callback-${getPostProcessLayer(this).props.id}`;
|
|
1205
940
|
}
|
|
@@ -1236,7 +971,7 @@ function PostProcessModifier(BaseLayer, effect) {
|
|
|
1236
971
|
initializeState(context) {
|
|
1237
972
|
super.initializeState(context);
|
|
1238
973
|
this._createTextures();
|
|
1239
|
-
this.internalState.postProcess = new
|
|
974
|
+
this.internalState.postProcess = new import_core6.PostProcessEffect(effect, this.props);
|
|
1240
975
|
this.internalState.postProcess.setup(context);
|
|
1241
976
|
}
|
|
1242
977
|
updateState(params) {
|
|
@@ -1302,32 +1037,168 @@ function PostProcessModifier(BaseLayer, effect) {
|
|
|
1302
1037
|
})(), _a;
|
|
1303
1038
|
}
|
|
1304
1039
|
|
|
1305
|
-
// dist/layers/quadbin-
|
|
1306
|
-
var
|
|
1040
|
+
// dist/layers/quadbin-tile-layer.js
|
|
1041
|
+
var import_core7 = require("@deck.gl/core");
|
|
1042
|
+
|
|
1043
|
+
// dist/layers/quadbin-layer.js
|
|
1044
|
+
var import_geo_layers4 = require("@deck.gl/geo-layers");
|
|
1045
|
+
|
|
1046
|
+
// dist/layers/quadbin-utils.js
|
|
1047
|
+
var import_web_mercator = require("@math.gl/web-mercator");
|
|
1048
|
+
var import_quadbin2 = require("quadbin");
|
|
1049
|
+
var TILE_SIZE = 512;
|
|
1050
|
+
function quadbinToOffset(quadbin) {
|
|
1051
|
+
const { x, y, z } = (0, import_quadbin2.cellToTile)(quadbin);
|
|
1052
|
+
const scale = TILE_SIZE / (1 << z);
|
|
1053
|
+
return [x * scale, TILE_SIZE - y * scale, scale];
|
|
1054
|
+
}
|
|
1055
|
+
function quadbinToWorldBounds(quadbin, coverage) {
|
|
1056
|
+
const [xOffset, yOffset, scale] = quadbinToOffset(quadbin);
|
|
1057
|
+
return [
|
|
1058
|
+
[xOffset, yOffset],
|
|
1059
|
+
[xOffset + coverage * scale, yOffset - coverage * scale]
|
|
1060
|
+
];
|
|
1061
|
+
}
|
|
1062
|
+
function getQuadbinPolygon(quadbin, coverage = 1) {
|
|
1063
|
+
const [topLeft, bottomRight] = quadbinToWorldBounds(quadbin, coverage);
|
|
1064
|
+
const [w, n] = (0, import_web_mercator.worldToLngLat)(topLeft);
|
|
1065
|
+
const [e, s] = (0, import_web_mercator.worldToLngLat)(bottomRight);
|
|
1066
|
+
return [e, n, e, s, w, s, w, n, e, n];
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
// dist/layers/quadbin-layer.js
|
|
1070
|
+
var defaultProps3 = {
|
|
1071
|
+
getQuadbin: { type: "accessor", value: (d) => d.quadbin }
|
|
1072
|
+
};
|
|
1073
|
+
var _QuadbinLayer = class extends import_geo_layers4._GeoCellLayer {
|
|
1074
|
+
indexToBounds() {
|
|
1075
|
+
const { data, extruded, getQuadbin } = this.props;
|
|
1076
|
+
const coverage = extruded ? 0.99 : 1;
|
|
1077
|
+
return {
|
|
1078
|
+
data,
|
|
1079
|
+
_normalize: false,
|
|
1080
|
+
positionFormat: "XY",
|
|
1081
|
+
getPolygon: (x, objectInfo) => getQuadbinPolygon(getQuadbin(x, objectInfo), coverage),
|
|
1082
|
+
updateTriggers: { getPolygon: coverage }
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
};
|
|
1086
|
+
var QuadbinLayer = _QuadbinLayer;
|
|
1087
|
+
(() => {
|
|
1088
|
+
_QuadbinLayer.layerName = "QuadbinLayer";
|
|
1089
|
+
})();
|
|
1090
|
+
(() => {
|
|
1091
|
+
_QuadbinLayer.defaultProps = defaultProps3;
|
|
1092
|
+
})();
|
|
1093
|
+
|
|
1094
|
+
// dist/layers/quadbin-tileset-2d.js
|
|
1095
|
+
var import_geo_layers5 = require("@deck.gl/geo-layers");
|
|
1096
|
+
var import_quadbin3 = require("quadbin");
|
|
1097
|
+
var QuadbinTileset2D = class extends import_geo_layers5._Tileset2D {
|
|
1098
|
+
getTileIndices(opts) {
|
|
1099
|
+
return super.getTileIndices(opts).map(import_quadbin3.tileToCell).map((q) => ({ q, i: (0, import_quadbin3.bigIntToHex)(q) }));
|
|
1100
|
+
}
|
|
1101
|
+
getTileId({ q, i }) {
|
|
1102
|
+
return i || (0, import_quadbin3.bigIntToHex)(q);
|
|
1103
|
+
}
|
|
1104
|
+
getTileMetadata({ q }) {
|
|
1105
|
+
return super.getTileMetadata((0, import_quadbin3.cellToTile)(q));
|
|
1106
|
+
}
|
|
1107
|
+
getTileZoom({ q }) {
|
|
1108
|
+
return Number((0, import_quadbin3.getResolution)(q));
|
|
1109
|
+
}
|
|
1110
|
+
getParentIndex({ q }) {
|
|
1111
|
+
return { q: (0, import_quadbin3.cellToParent)(q) };
|
|
1112
|
+
}
|
|
1113
|
+
};
|
|
1114
|
+
|
|
1115
|
+
// dist/layers/quadbin-tile-layer.js
|
|
1116
|
+
var import_quadbin4 = require("quadbin");
|
|
1117
|
+
var renderSubLayers2 = (props) => {
|
|
1118
|
+
const { data } = props;
|
|
1119
|
+
if (!data || !data.length)
|
|
1120
|
+
return null;
|
|
1121
|
+
const isBigInt = typeof data[0].id === "bigint";
|
|
1122
|
+
return new QuadbinLayer(props, {
|
|
1123
|
+
getQuadbin: isBigInt ? (d) => d.id : (d) => (0, import_quadbin4.hexToBigInt)(d.id)
|
|
1124
|
+
});
|
|
1125
|
+
};
|
|
1126
|
+
var defaultProps4 = {
|
|
1127
|
+
data: TilejsonPropType,
|
|
1128
|
+
tileSize: DEFAULT_TILE_SIZE
|
|
1129
|
+
};
|
|
1130
|
+
var _QuadbinTileLayer = class extends import_core7.CompositeLayer {
|
|
1131
|
+
getLoadOptions() {
|
|
1132
|
+
const loadOptions = super.getLoadOptions() || {};
|
|
1133
|
+
const tileJSON = this.props.data;
|
|
1134
|
+
injectAccessToken(loadOptions, tileJSON.accessToken);
|
|
1135
|
+
loadOptions.cartoSpatialTile = { ...loadOptions.cartoSpatialTile, scheme: "quadbin" };
|
|
1136
|
+
return loadOptions;
|
|
1137
|
+
}
|
|
1138
|
+
renderLayers() {
|
|
1139
|
+
const tileJSON = this.props.data;
|
|
1140
|
+
if (!tileJSON)
|
|
1141
|
+
return null;
|
|
1142
|
+
const { tiles: data, maxresolution: maxZoom } = tileJSON;
|
|
1143
|
+
return [
|
|
1144
|
+
new SpatialIndexTileLayer(this.props, {
|
|
1145
|
+
id: `quadbin-tile-layer-${this.props.id}`,
|
|
1146
|
+
data,
|
|
1147
|
+
TilesetClass: QuadbinTileset2D,
|
|
1148
|
+
renderSubLayers: renderSubLayers2,
|
|
1149
|
+
maxZoom,
|
|
1150
|
+
loadOptions: this.getLoadOptions()
|
|
1151
|
+
})
|
|
1152
|
+
];
|
|
1153
|
+
}
|
|
1154
|
+
};
|
|
1155
|
+
var QuadbinTileLayer = _QuadbinTileLayer;
|
|
1156
|
+
(() => {
|
|
1157
|
+
_QuadbinTileLayer.layerName = "QuadbinTileLayer";
|
|
1158
|
+
})();
|
|
1159
|
+
(() => {
|
|
1160
|
+
_QuadbinTileLayer.defaultProps = defaultProps4;
|
|
1161
|
+
})();
|
|
1162
|
+
|
|
1163
|
+
// dist/layers/heatmap-tile-layer.js
|
|
1164
|
+
function unitDensityForCell(cell) {
|
|
1165
|
+
const cellResolution = Number((0, import_quadbin5.getResolution)(cell));
|
|
1166
|
+
return Math.pow(4, cellResolution);
|
|
1167
|
+
}
|
|
1168
|
+
var _RTTSolidPolygonLayer = class extends RTTModifier(import_layers.SolidPolygonLayer) {
|
|
1307
1169
|
getShaders(type) {
|
|
1308
1170
|
const shaders = super.getShaders(type);
|
|
1309
1171
|
shaders.inject = {
|
|
1310
|
-
"vs:#decl":
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1172
|
+
"vs:#decl": `
|
|
1173
|
+
uniform float densityFactor;
|
|
1174
|
+
`,
|
|
1175
|
+
"vs:#main-end": `
|
|
1176
|
+
// Value from getWeight accessor
|
|
1177
|
+
float weight = elevations;
|
|
1314
1178
|
|
|
1315
1179
|
// Keep "power" delivered to screen constant when tiles update
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
value *= relativeArea;
|
|
1180
|
+
// by outputting normalized density
|
|
1181
|
+
weight *= densityFactor;
|
|
1319
1182
|
|
|
1320
1183
|
// Pack float into 3 channels to pass to heatmap shader
|
|
1321
|
-
|
|
1322
|
-
|
|
1184
|
+
// SCALE value important, as we don't want to saturate
|
|
1185
|
+
// but also want enough definition to avoid banding
|
|
1186
|
+
const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
|
|
1187
|
+
const float MAX_VAL = SHIFT.z * 255.0;
|
|
1188
|
+
const float SCALE = MAX_VAL / 8.0;
|
|
1189
|
+
weight *= SCALE;
|
|
1190
|
+
weight = clamp(weight, 0.0, MAX_VAL);
|
|
1191
|
+
vColor = vec4(mod(vec3(weight, floor(weight / SHIFT.yz)), 256.0), 255.0) / 255.0;
|
|
1192
|
+
`
|
|
1323
1193
|
};
|
|
1324
1194
|
return shaders;
|
|
1325
1195
|
}
|
|
1326
1196
|
draw(opts) {
|
|
1327
|
-
const
|
|
1328
|
-
const
|
|
1197
|
+
const cell = this.props.data[0];
|
|
1198
|
+
const maxDensity = this.props.elevationScale;
|
|
1199
|
+
const densityFactor = unitDensityForCell(cell.id) / maxDensity;
|
|
1329
1200
|
for (const model of this.state.models) {
|
|
1330
|
-
model.setUniforms({
|
|
1201
|
+
model.setUniforms({ densityFactor });
|
|
1331
1202
|
}
|
|
1332
1203
|
super.draw(opts);
|
|
1333
1204
|
}
|
|
@@ -1337,17 +1208,30 @@ var RTTSolidPolygonLayer = _RTTSolidPolygonLayer;
|
|
|
1337
1208
|
_RTTSolidPolygonLayer.layerName = "RTTSolidPolygonLayer";
|
|
1338
1209
|
})();
|
|
1339
1210
|
var PostProcessQuadbinTileLayer = PostProcessModifier(QuadbinTileLayer, heatmap);
|
|
1340
|
-
|
|
1341
|
-
return [w % 256, Math.floor(w / 256), Math.floor(w / (256 * 256))];
|
|
1342
|
-
}
|
|
1343
|
-
var defaultProps6 = {
|
|
1211
|
+
var defaultProps5 = {
|
|
1344
1212
|
data: TilejsonPropType,
|
|
1345
|
-
getWeight: { type: "accessor", value: 1 }
|
|
1213
|
+
getWeight: { type: "accessor", value: 1 },
|
|
1214
|
+
onMaxDensityChange: { type: "function", optional: true, value: null },
|
|
1215
|
+
colorDomain: { type: "array", value: [0, 1] },
|
|
1216
|
+
intensity: { type: "number", value: 1 },
|
|
1217
|
+
radiusPixels: { type: "number", min: 0, max: 100, value: 20 }
|
|
1346
1218
|
};
|
|
1347
|
-
var
|
|
1219
|
+
var _HeatmapTileLayer = class extends import_core8.CompositeLayer {
|
|
1220
|
+
initializeState() {
|
|
1221
|
+
this.state = {
|
|
1222
|
+
isLoaded: false,
|
|
1223
|
+
tiles: /* @__PURE__ */ new Set(),
|
|
1224
|
+
viewportChanged: false
|
|
1225
|
+
};
|
|
1226
|
+
}
|
|
1227
|
+
shouldUpdateState({ changeFlags }) {
|
|
1228
|
+
const { viewportChanged } = changeFlags;
|
|
1229
|
+
this.setState({ viewportChanged });
|
|
1230
|
+
return changeFlags.somethingChanged;
|
|
1231
|
+
}
|
|
1348
1232
|
renderLayers() {
|
|
1349
1233
|
var _a, _b, _c;
|
|
1350
|
-
const { getWeight, colorDomain, colorRange, radiusPixels, _subLayerProps } = this.props;
|
|
1234
|
+
const { data, getWeight, colorDomain, colorRange, intensity, radiusPixels, _subLayerProps, updateTriggers, onMaxDensityChange, onViewportLoad, onTileLoad, onTileUnload, ...tileLayerProps } = this.props;
|
|
1351
1235
|
const subLayerProps = {
|
|
1352
1236
|
..._subLayerProps,
|
|
1353
1237
|
cell: {
|
|
@@ -1361,29 +1245,221 @@ var _QuadbinHeatmapTileLayer = class extends import_core9.CompositeLayer {
|
|
|
1361
1245
|
}
|
|
1362
1246
|
}
|
|
1363
1247
|
};
|
|
1364
|
-
|
|
1365
|
-
|
|
1248
|
+
let tileZ = 0;
|
|
1249
|
+
let maxDensity = 0;
|
|
1250
|
+
const tiles = [...this.state.tiles].filter((t) => t.isVisible && t.data);
|
|
1251
|
+
for (const tile of tiles) {
|
|
1252
|
+
const cell = tile.data[0];
|
|
1253
|
+
const unitDensity = unitDensityForCell(cell.id);
|
|
1254
|
+
maxDensity = Math.max(tile.userData.maxWeight * unitDensity, maxDensity);
|
|
1255
|
+
tileZ = Math.max(tile.zoom, tileZ);
|
|
1256
|
+
}
|
|
1257
|
+
const overzoom = this.context.viewport.zoom - tileZ;
|
|
1258
|
+
const estimatedMaxDensity = maxDensity * Math.pow(2, overzoom);
|
|
1259
|
+
maxDensity = estimatedMaxDensity;
|
|
1260
|
+
if (typeof onMaxDensityChange === "function") {
|
|
1261
|
+
onMaxDensityChange(maxDensity);
|
|
1262
|
+
}
|
|
1263
|
+
return new PostProcessQuadbinTileLayer(tileLayerProps, this.getSubLayerProps({
|
|
1366
1264
|
id: "heatmap",
|
|
1367
|
-
data
|
|
1368
|
-
getFillColor,
|
|
1265
|
+
data,
|
|
1266
|
+
getFillColor: 0,
|
|
1267
|
+
getElevation: getWeight,
|
|
1268
|
+
elevationScale: maxDensity,
|
|
1369
1269
|
colorDomain,
|
|
1370
1270
|
colorRange,
|
|
1371
1271
|
radiusPixels,
|
|
1272
|
+
intensity,
|
|
1372
1273
|
_subLayerProps: subLayerProps,
|
|
1274
|
+
refinementStrategy: "no-overlap",
|
|
1275
|
+
extruded: false,
|
|
1276
|
+
stroked: false,
|
|
1373
1277
|
updateTriggers: {
|
|
1374
|
-
|
|
1375
|
-
}
|
|
1278
|
+
getElevation: updateTriggers.getWeight
|
|
1279
|
+
},
|
|
1280
|
+
onViewportLoad: (tiles2) => {
|
|
1281
|
+
this.setState({ isLoaded: true });
|
|
1282
|
+
if (typeof onViewportLoad === "function") {
|
|
1283
|
+
onViewportLoad(tiles2);
|
|
1284
|
+
}
|
|
1285
|
+
},
|
|
1286
|
+
onTileLoad: (tile) => {
|
|
1287
|
+
let maxWeight = -Infinity;
|
|
1288
|
+
if (typeof getWeight !== "function") {
|
|
1289
|
+
maxWeight = getWeight;
|
|
1290
|
+
} else if (tile.content) {
|
|
1291
|
+
for (const d of tile.content) {
|
|
1292
|
+
maxWeight = Math.max(getWeight(d, {}), maxWeight);
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
tile.userData = { maxWeight };
|
|
1296
|
+
this.state.tiles.add(tile);
|
|
1297
|
+
if (typeof onTileLoad === "function") {
|
|
1298
|
+
onTileLoad(tile);
|
|
1299
|
+
}
|
|
1300
|
+
},
|
|
1301
|
+
onTileUnload: (tile) => {
|
|
1302
|
+
this.state.tiles.delete(tile);
|
|
1303
|
+
if (typeof onTileUnload === "function") {
|
|
1304
|
+
onTileUnload(tile);
|
|
1305
|
+
}
|
|
1306
|
+
},
|
|
1307
|
+
transitions: { elevationScale: { type: "spring", stiffness: 0.3, damping: 0.5 } }
|
|
1376
1308
|
}));
|
|
1377
1309
|
}
|
|
1378
1310
|
};
|
|
1379
|
-
var
|
|
1311
|
+
var HeatmapTileLayer = _HeatmapTileLayer;
|
|
1312
|
+
(() => {
|
|
1313
|
+
_HeatmapTileLayer.layerName = "HeatmapTileLayer";
|
|
1314
|
+
})();
|
|
1315
|
+
(() => {
|
|
1316
|
+
_HeatmapTileLayer.defaultProps = defaultProps5;
|
|
1317
|
+
})();
|
|
1318
|
+
var heatmap_tile_layer_default = HeatmapTileLayer;
|
|
1319
|
+
|
|
1320
|
+
// dist/layers/point-label-layer.js
|
|
1321
|
+
var import_core9 = require("@deck.gl/core");
|
|
1322
|
+
var import_layers2 = require("@deck.gl/layers");
|
|
1323
|
+
var [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
|
|
1324
|
+
var _EnhancedTextBackgroundLayer = class extends import_layers2._TextBackgroundLayer {
|
|
1325
|
+
getShaders() {
|
|
1326
|
+
const shaders = super.getShaders();
|
|
1327
|
+
let vs = shaders.vs;
|
|
1328
|
+
vs = vs.replaceAll("padding.", "_padding.");
|
|
1329
|
+
vs = vs.replace("void main(void) {", "void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);");
|
|
1330
|
+
return { ...shaders, vs };
|
|
1331
|
+
}
|
|
1332
|
+
};
|
|
1333
|
+
var EnhancedTextBackgroundLayer = _EnhancedTextBackgroundLayer;
|
|
1334
|
+
(() => {
|
|
1335
|
+
_EnhancedTextBackgroundLayer.layerName = "EnhancedTextBackgroundLayer";
|
|
1336
|
+
})();
|
|
1337
|
+
var _EnhancedTextLayer = class extends import_layers2.TextLayer {
|
|
1338
|
+
filterSubLayer({ layer, renderPass }) {
|
|
1339
|
+
const background = layer.id.includes("primary-background");
|
|
1340
|
+
if (renderPass === "collision") {
|
|
1341
|
+
return background;
|
|
1342
|
+
}
|
|
1343
|
+
return !background;
|
|
1344
|
+
}
|
|
1345
|
+
};
|
|
1346
|
+
var EnhancedTextLayer = _EnhancedTextLayer;
|
|
1347
|
+
(() => {
|
|
1348
|
+
_EnhancedTextLayer.layerName = "EnhancedTextLayer";
|
|
1349
|
+
})();
|
|
1350
|
+
var defaultProps6 = {
|
|
1351
|
+
...import_layers2.TextLayer.defaultProps,
|
|
1352
|
+
getRadius: { type: "accessor", value: 1 },
|
|
1353
|
+
radiusScale: { type: "number", min: 0, value: 1 }
|
|
1354
|
+
};
|
|
1355
|
+
var _PointLabelLayer = class extends import_core9.CompositeLayer {
|
|
1356
|
+
calculatePixelOffset(secondary) {
|
|
1357
|
+
const { getTextAnchor: anchor, getAlignmentBaseline: alignment, getRadius, getSecondaryText, radiusScale, secondarySizeScale, sizeScale } = this.props;
|
|
1358
|
+
const xMult = anchor === "middle" ? 0 : anchor === "start" ? 1 : -1;
|
|
1359
|
+
const yMult = alignment === "center" ? 0 : alignment === "bottom" ? 1 : -1;
|
|
1360
|
+
const xPadding = sizeScale / 4;
|
|
1361
|
+
const yPadding = sizeScale * (1 + 1 / 4);
|
|
1362
|
+
const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
|
|
1363
|
+
let yOffset = secondary ? secondaryOffset : 0;
|
|
1364
|
+
if (anchor === "middle" && alignment === "top" && getSecondaryText) {
|
|
1365
|
+
yOffset -= secondaryOffset;
|
|
1366
|
+
yOffset -= secondarySizeScale;
|
|
1367
|
+
yOffset += sizeScale;
|
|
1368
|
+
}
|
|
1369
|
+
const radiusPadding = 1 + 1 / 4;
|
|
1370
|
+
return typeof getRadius === "function" ? (d, info) => {
|
|
1371
|
+
const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
|
|
1372
|
+
return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
|
|
1373
|
+
} : [
|
|
1374
|
+
xMult * (getRadius * radiusScale * radiusPadding + xPadding),
|
|
1375
|
+
yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
|
|
1376
|
+
];
|
|
1377
|
+
}
|
|
1378
|
+
calculateBackgroundPadding() {
|
|
1379
|
+
const { getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale } = this.props;
|
|
1380
|
+
const paddingX = 12 * sizeScale;
|
|
1381
|
+
const paddingY = 3 * sizeScale;
|
|
1382
|
+
const backgroundPadding = [0, 0, 0, 0];
|
|
1383
|
+
if (alignment === "top") {
|
|
1384
|
+
backgroundPadding[TOP] = paddingY;
|
|
1385
|
+
} else if (alignment === "bottom") {
|
|
1386
|
+
backgroundPadding[BOTTOM] = paddingY;
|
|
1387
|
+
} else {
|
|
1388
|
+
backgroundPadding[TOP] = 0.5 * paddingY;
|
|
1389
|
+
backgroundPadding[BOTTOM] = 0.5 * paddingY;
|
|
1390
|
+
}
|
|
1391
|
+
if (anchor === "start") {
|
|
1392
|
+
backgroundPadding[LEFT] = paddingX;
|
|
1393
|
+
} else if (anchor === "end") {
|
|
1394
|
+
backgroundPadding[RIGHT] = paddingX;
|
|
1395
|
+
} else {
|
|
1396
|
+
backgroundPadding[LEFT] = 0.5 * paddingX;
|
|
1397
|
+
backgroundPadding[RIGHT] = 0.5 * paddingX;
|
|
1398
|
+
}
|
|
1399
|
+
return backgroundPadding;
|
|
1400
|
+
}
|
|
1401
|
+
renderTextLayer(id4, { updateTriggers: updateTriggersOverride = {}, ...props }) {
|
|
1402
|
+
const { data, characterSet, fontFamily, fontSettings, fontWeight, outlineColor, outlineWidth, sizeScale, radiusScale, getAlignmentBaseline, getColor, getPosition, getTextAnchor, updateTriggers } = this.props;
|
|
1403
|
+
return new EnhancedTextLayer(this.getSubLayerProps({
|
|
1404
|
+
id: id4,
|
|
1405
|
+
data,
|
|
1406
|
+
characterSet,
|
|
1407
|
+
fontFamily,
|
|
1408
|
+
fontSettings,
|
|
1409
|
+
fontWeight,
|
|
1410
|
+
outlineColor,
|
|
1411
|
+
outlineWidth,
|
|
1412
|
+
sizeScale,
|
|
1413
|
+
getAlignmentBaseline,
|
|
1414
|
+
getColor,
|
|
1415
|
+
getPosition,
|
|
1416
|
+
getTextAnchor,
|
|
1417
|
+
updateTriggers: {
|
|
1418
|
+
...updateTriggers,
|
|
1419
|
+
...updateTriggersOverride,
|
|
1420
|
+
getPixelOffset: [
|
|
1421
|
+
updateTriggers.getRadius,
|
|
1422
|
+
updateTriggers.getTextAnchor,
|
|
1423
|
+
updateTriggers.getAlignmentBaseline,
|
|
1424
|
+
radiusScale,
|
|
1425
|
+
sizeScale
|
|
1426
|
+
]
|
|
1427
|
+
}
|
|
1428
|
+
}), {
|
|
1429
|
+
getSize: 1,
|
|
1430
|
+
_subLayerProps: { background: { type: EnhancedTextBackgroundLayer } }
|
|
1431
|
+
}, props);
|
|
1432
|
+
}
|
|
1433
|
+
renderLayers() {
|
|
1434
|
+
const { getText, getSecondaryColor, getSecondaryText, secondaryOutlineColor, secondarySizeScale, updateTriggers } = this.props;
|
|
1435
|
+
const getPixelOffset = this.calculatePixelOffset(false);
|
|
1436
|
+
const backgroundPadding = this.calculateBackgroundPadding();
|
|
1437
|
+
const out = [
|
|
1438
|
+
this.renderTextLayer(`${updateTriggers.getText}-primary`, {
|
|
1439
|
+
backgroundPadding,
|
|
1440
|
+
getText,
|
|
1441
|
+
getPixelOffset,
|
|
1442
|
+
background: true
|
|
1443
|
+
}),
|
|
1444
|
+
Boolean(getSecondaryText) && this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
|
|
1445
|
+
getText: getSecondaryText,
|
|
1446
|
+
getPixelOffset: this.calculatePixelOffset(true),
|
|
1447
|
+
getAlignmentBaseline: "top",
|
|
1448
|
+
...getSecondaryColor && { getColor: getSecondaryColor },
|
|
1449
|
+
...secondarySizeScale && { sizeScale: secondarySizeScale },
|
|
1450
|
+
...secondaryOutlineColor && { outlineColor: secondaryOutlineColor }
|
|
1451
|
+
})
|
|
1452
|
+
];
|
|
1453
|
+
return out;
|
|
1454
|
+
}
|
|
1455
|
+
};
|
|
1456
|
+
var PointLabelLayer = _PointLabelLayer;
|
|
1380
1457
|
(() => {
|
|
1381
|
-
|
|
1458
|
+
_PointLabelLayer.layerName = "PointLabelLayer";
|
|
1382
1459
|
})();
|
|
1383
1460
|
(() => {
|
|
1384
|
-
|
|
1461
|
+
_PointLabelLayer.defaultProps = defaultProps6;
|
|
1385
1462
|
})();
|
|
1386
|
-
var quadbin_heatmap_tile_layer_default = QuadbinHeatmapTileLayer;
|
|
1387
1463
|
|
|
1388
1464
|
// dist/layers/raster-tile-layer.js
|
|
1389
1465
|
var import_core11 = require("@deck.gl/core");
|
|
@@ -1639,7 +1715,7 @@ var carto_properties_tile_loader_default = CartoPropertiesTileLoader;
|
|
|
1639
1715
|
|
|
1640
1716
|
// dist/layers/schema/carto-vector-tile-loader.js
|
|
1641
1717
|
var import_earcut = __toESM(require("earcut"), 1);
|
|
1642
|
-
var VERSION3 = true ? "9.0.
|
|
1718
|
+
var VERSION3 = true ? "9.0.18" : "latest";
|
|
1643
1719
|
var id3 = "cartoVectorTile";
|
|
1644
1720
|
var DEFAULT_OPTIONS3 = {
|
|
1645
1721
|
cartoVectorTile: {
|
|
@@ -1699,7 +1775,6 @@ var carto_vector_tile_loader_default = CartoVectorTileLoader;
|
|
|
1699
1775
|
var import_extensions = require("@deck.gl/extensions");
|
|
1700
1776
|
var import_geo_layers6 = require("@deck.gl/geo-layers");
|
|
1701
1777
|
var import_layers4 = require("@deck.gl/layers");
|
|
1702
|
-
var import_gis = require("@loaders.gl/gis");
|
|
1703
1778
|
(0, import_core12.registerLoaders)([carto_properties_tile_loader_default, carto_vector_tile_loader_default]);
|
|
1704
1779
|
var defaultProps9 = {
|
|
1705
1780
|
...import_geo_layers6.MVTLayer.defaultProps,
|
|
@@ -1778,15 +1853,10 @@ var _VectorTileLayer = class extends import_geo_layers6.MVTLayer {
|
|
|
1778
1853
|
const subLayer = new import_layers4.GeoJsonLayer(subLayerProps);
|
|
1779
1854
|
return subLayer;
|
|
1780
1855
|
}
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
info.object = (0, import_gis.binaryToGeojson)(data, {
|
|
1786
|
-
globalFeatureId: info.index
|
|
1787
|
-
});
|
|
1788
|
-
}
|
|
1789
|
-
return info;
|
|
1856
|
+
_isWGS84() {
|
|
1857
|
+
if (this.state.mvt)
|
|
1858
|
+
return super._isWGS84();
|
|
1859
|
+
return true;
|
|
1790
1860
|
}
|
|
1791
1861
|
};
|
|
1792
1862
|
var VectorTileLayer = _VectorTileLayer;
|
|
@@ -1799,7 +1869,7 @@ var VectorTileLayer = _VectorTileLayer;
|
|
|
1799
1869
|
|
|
1800
1870
|
// dist/api/carto-api-error.js
|
|
1801
1871
|
var CartoAPIError = class extends Error {
|
|
1802
|
-
constructor(error, errorContext, response) {
|
|
1872
|
+
constructor(error, errorContext, response, responseJson) {
|
|
1803
1873
|
let responseString = "Failed to connect";
|
|
1804
1874
|
if (response) {
|
|
1805
1875
|
responseString = "Server returned: ";
|
|
@@ -1828,6 +1898,7 @@ ${formatErrorKey(key)}: ${errorContext[key]}`;
|
|
|
1828
1898
|
super(message);
|
|
1829
1899
|
this.name = "CartoAPIError";
|
|
1830
1900
|
this.response = response;
|
|
1901
|
+
this.responseJson = responseJson;
|
|
1831
1902
|
this.error = error;
|
|
1832
1903
|
this.errorContext = errorContext;
|
|
1833
1904
|
}
|
|
@@ -2042,19 +2113,10 @@ function colorContinuous({ attr, domain, colors = DEFAULT_PALETTE, nullColor = N
|
|
|
2042
2113
|
}
|
|
2043
2114
|
|
|
2044
2115
|
// dist/api/common.js
|
|
2045
|
-
var import_core13 = require("@deck.gl/core");
|
|
2046
2116
|
var DEFAULT_API_BASE_URL = "https://gcp-us-east1.api.carto.com";
|
|
2047
2117
|
var DEFAULT_CLIENT = "deck-gl-carto";
|
|
2048
2118
|
var V3_MINOR_VERSION = "3.4";
|
|
2049
2119
|
var MAX_GET_LENGTH = 8192;
|
|
2050
|
-
var DEFAULT_PARAMETERS = {
|
|
2051
|
-
v: V3_MINOR_VERSION,
|
|
2052
|
-
deckglVersion: import_core13.VERSION
|
|
2053
|
-
};
|
|
2054
|
-
var DEFAULT_HEADERS = {
|
|
2055
|
-
Accept: "application/json",
|
|
2056
|
-
"Content-Type": "application/json"
|
|
2057
|
-
};
|
|
2058
2120
|
|
|
2059
2121
|
// dist/api/endpoints.js
|
|
2060
2122
|
function joinPath(...args) {
|
|
@@ -2080,34 +2142,40 @@ function buildQueryUrl({ apiBaseUrl, connectionName }) {
|
|
|
2080
2142
|
}
|
|
2081
2143
|
|
|
2082
2144
|
// dist/api/request-with-parameters.js
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2145
|
+
var import_core13 = require("@deck.gl/core");
|
|
2146
|
+
var DEFAULT_PARAMETERS = {
|
|
2147
|
+
v: V3_MINOR_VERSION,
|
|
2148
|
+
deckglVersion: import_core13.VERSION
|
|
2149
|
+
};
|
|
2150
|
+
var DEFAULT_HEADERS = {
|
|
2151
|
+
Accept: "application/json",
|
|
2152
|
+
"Content-Type": "application/json"
|
|
2153
|
+
};
|
|
2089
2154
|
var REQUEST_CACHE = /* @__PURE__ */ new Map();
|
|
2090
|
-
async function requestWithParameters({ baseUrl, parameters, headers: customHeaders, errorContext }) {
|
|
2155
|
+
async function requestWithParameters({ baseUrl, parameters = {}, headers: customHeaders = {}, errorContext }) {
|
|
2091
2156
|
parameters = { ...DEFAULT_PARAMETERS, ...parameters };
|
|
2092
|
-
|
|
2157
|
+
baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));
|
|
2158
|
+
const key = createCacheKey(baseUrl, parameters, customHeaders);
|
|
2093
2159
|
if (REQUEST_CACHE.has(key)) {
|
|
2094
2160
|
return REQUEST_CACHE.get(key);
|
|
2095
2161
|
}
|
|
2096
|
-
const url =
|
|
2162
|
+
const url = createURLWithParameters(baseUrl, parameters);
|
|
2097
2163
|
const headers = { ...DEFAULT_HEADERS, ...customHeaders };
|
|
2098
2164
|
const fetchPromise = url.length > MAX_GET_LENGTH ? fetch(baseUrl, { method: "POST", body: JSON.stringify(parameters), headers }) : fetch(url, { headers });
|
|
2099
2165
|
let response;
|
|
2166
|
+
let responseJson;
|
|
2100
2167
|
const jsonPromise = fetchPromise.then((_response) => {
|
|
2101
2168
|
response = _response;
|
|
2102
2169
|
return response.json();
|
|
2103
2170
|
}).then((json) => {
|
|
2171
|
+
responseJson = json;
|
|
2104
2172
|
if (!response || !response.ok) {
|
|
2105
2173
|
throw new Error(json.error);
|
|
2106
2174
|
}
|
|
2107
2175
|
return json;
|
|
2108
2176
|
}).catch((error) => {
|
|
2109
2177
|
REQUEST_CACHE.delete(key);
|
|
2110
|
-
throw new CartoAPIError(error, errorContext, response);
|
|
2178
|
+
throw new CartoAPIError(error, errorContext, response, responseJson);
|
|
2111
2179
|
});
|
|
2112
2180
|
REQUEST_CACHE.set(key, jsonPromise);
|
|
2113
2181
|
return jsonPromise;
|
|
@@ -2117,9 +2185,25 @@ function createCacheKey(baseUrl, parameters, headers) {
|
|
|
2117
2185
|
const headerEntries = Object.entries(headers).sort(([a], [b]) => a > b ? 1 : -1);
|
|
2118
2186
|
return JSON.stringify({ baseUrl, parameters: parameterEntries, headers: headerEntries });
|
|
2119
2187
|
}
|
|
2120
|
-
function createURLWithParameters(
|
|
2121
|
-
const
|
|
2122
|
-
|
|
2188
|
+
function createURLWithParameters(baseUrlString, parameters) {
|
|
2189
|
+
const baseUrl = new URL(baseUrlString);
|
|
2190
|
+
for (const [key, value] of Object.entries(parameters)) {
|
|
2191
|
+
if (isPureObject(value) || Array.isArray(value)) {
|
|
2192
|
+
baseUrl.searchParams.set(key, JSON.stringify(value));
|
|
2193
|
+
} else {
|
|
2194
|
+
baseUrl.searchParams.set(key, value.toString());
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2197
|
+
return baseUrl.toString();
|
|
2198
|
+
}
|
|
2199
|
+
function excludeURLParameters(baseUrlString, parameters) {
|
|
2200
|
+
const baseUrl = new URL(baseUrlString);
|
|
2201
|
+
for (const param of parameters) {
|
|
2202
|
+
if (baseUrl.searchParams.has(param)) {
|
|
2203
|
+
baseUrl.searchParams.delete(param);
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
2206
|
+
return baseUrl.toString();
|
|
2123
2207
|
}
|
|
2124
2208
|
|
|
2125
2209
|
// dist/sources/base-source.js
|
|
@@ -2255,8 +2339,11 @@ var h3TilesetSource = async function(options) {
|
|
|
2255
2339
|
|
|
2256
2340
|
// dist/sources/raster-source.js
|
|
2257
2341
|
var rasterSource = async function(options) {
|
|
2258
|
-
const { tableName } = options;
|
|
2342
|
+
const { tableName, filters } = options;
|
|
2259
2343
|
const urlParameters = { name: tableName };
|
|
2344
|
+
if (filters) {
|
|
2345
|
+
urlParameters.filters = filters;
|
|
2346
|
+
}
|
|
2260
2347
|
return baseSource("raster", options, urlParameters);
|
|
2261
2348
|
};
|
|
2262
2349
|
|
|
@@ -3212,9 +3299,9 @@ var query = async function(options) {
|
|
|
3212
3299
|
// dist/index.js
|
|
3213
3300
|
var CARTO_LAYERS = {
|
|
3214
3301
|
H3TileLayer,
|
|
3302
|
+
HeatmapTileLayer: heatmap_tile_layer_default,
|
|
3215
3303
|
_PointLabelLayer: PointLabelLayer,
|
|
3216
3304
|
QuadbinTileLayer,
|
|
3217
|
-
QuadbinHeatmapTileLayer: quadbin_heatmap_tile_layer_default,
|
|
3218
3305
|
RasterTileLayer,
|
|
3219
3306
|
VectorTileLayer
|
|
3220
3307
|
};
|