@deck.gl/carto 9.0.17 → 9.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cartoRasterTile-worker.js +1 -1
- package/dist/cartoSpatialTile-worker.js +1 -1
- package/dist/cartoVectorTile-worker.js +1 -1
- package/dist/dist.dev.js +440 -531
- package/dist/index.cjs +492 -422
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/layers/heatmap-tile-layer.d.ts +36 -0
- package/dist/layers/heatmap-tile-layer.d.ts.map +1 -0
- package/dist/layers/heatmap-tile-layer.js +165 -0
- package/dist/layers/heatmap.d.ts +5 -0
- package/dist/layers/heatmap.d.ts.map +1 -1
- package/dist/layers/heatmap.js +17 -15
- package/dist/layers/schema/carto-raster-tile-loader.js +1 -1
- package/dist/layers/schema/carto-spatial-tile-loader.js +1 -1
- package/dist/layers/schema/carto-vector-tile-loader.js +1 -1
- package/dist/layers/vector-tile-layer.d.ts +1 -1
- package/dist/layers/vector-tile-layer.d.ts.map +1 -1
- package/dist/layers/vector-tile-layer.js +5 -10
- package/dist.min.js +37 -31
- package/package.json +2 -2
- package/src/index.ts +3 -3
- package/src/layers/heatmap-tile-layer.ts +236 -0
- package/src/layers/heatmap.ts +31 -18
- package/src/layers/vector-tile-layer.ts +4 -14
- package/dist/layers/quadbin-heatmap-tile-layer.d.ts +0 -24
- package/dist/layers/quadbin-heatmap-tile-layer.d.ts.map +0 -1
- package/dist/layers/quadbin-heatmap-tile-layer.js +0 -84
- package/src/layers/quadbin-heatmap-tile-layer.ts +0 -135
package/dist/index.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.19" : "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.19" : "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
|
}
|
|
@@ -1209,125 +944,261 @@ var _DrawCallbackLayer = class extends import_core8.Layer {
|
|
|
1209
944
|
};
|
|
1210
945
|
var DrawCallbackLayer = _DrawCallbackLayer;
|
|
1211
946
|
(() => {
|
|
1212
|
-
_DrawCallbackLayer.layerName = "DrawCallbackLayer";
|
|
947
|
+
_DrawCallbackLayer.layerName = "DrawCallbackLayer";
|
|
948
|
+
})();
|
|
949
|
+
function RTTModifier(BaseLayer) {
|
|
950
|
+
var _a;
|
|
951
|
+
return _a = class extends BaseLayer {
|
|
952
|
+
draw(opts) {
|
|
953
|
+
const { moduleParameters } = opts;
|
|
954
|
+
const { picking } = moduleParameters;
|
|
955
|
+
const postProcessLayer = getPostProcessLayer(this);
|
|
956
|
+
if (!picking.isActive) {
|
|
957
|
+
postProcessLayer.enableRTT(opts);
|
|
958
|
+
}
|
|
959
|
+
super.draw(opts);
|
|
960
|
+
if (!picking.isActive) {
|
|
961
|
+
postProcessLayer.disableRTT();
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
}, (() => {
|
|
965
|
+
_a.layerName = `RTT-${BaseLayer.layerName}`;
|
|
966
|
+
})(), _a;
|
|
967
|
+
}
|
|
968
|
+
function PostProcessModifier(BaseLayer, effect) {
|
|
969
|
+
var _a;
|
|
970
|
+
return _a = class extends BaseLayer {
|
|
971
|
+
initializeState(context) {
|
|
972
|
+
super.initializeState(context);
|
|
973
|
+
this._createTextures();
|
|
974
|
+
this.internalState.postProcess = new import_core6.PostProcessEffect(effect, this.props);
|
|
975
|
+
this.internalState.postProcess.setup(context);
|
|
976
|
+
}
|
|
977
|
+
updateState(params) {
|
|
978
|
+
super.updateState(params);
|
|
979
|
+
this.internalState.postProcess.setProps(this.props);
|
|
980
|
+
}
|
|
981
|
+
renderLayers() {
|
|
982
|
+
let subLayers = super.renderLayers();
|
|
983
|
+
if (!subLayers) {
|
|
984
|
+
return null;
|
|
985
|
+
}
|
|
986
|
+
subLayers = Array.isArray(subLayers) ? subLayers : [subLayers];
|
|
987
|
+
return [...subLayers, new DrawCallbackLayer()];
|
|
988
|
+
}
|
|
989
|
+
_createTextures() {
|
|
990
|
+
const { device } = this.context;
|
|
991
|
+
this.internalState.renderBuffers = [0, 1].map((i) => {
|
|
992
|
+
return device.createFramebuffer({
|
|
993
|
+
id: `layer-fbo-${i}`,
|
|
994
|
+
colorAttachments: [device.createTexture(TEXTURE_PROPS)],
|
|
995
|
+
depthStencilAttachment: "depth16unorm"
|
|
996
|
+
});
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
_resizeBuffers(opts) {
|
|
1000
|
+
const { moduleParameters } = opts;
|
|
1001
|
+
const { viewport } = this.context;
|
|
1002
|
+
const width = moduleParameters.devicePixelRatio * viewport.width;
|
|
1003
|
+
const height = moduleParameters.devicePixelRatio * viewport.height;
|
|
1004
|
+
this.internalState.renderBuffers.forEach((fbo) => fbo.resize({ width, height }));
|
|
1005
|
+
}
|
|
1006
|
+
enableRTT(opts) {
|
|
1007
|
+
this._resizeBuffers(opts);
|
|
1008
|
+
this.internalState.originalRenderPass = this.context.renderPass;
|
|
1009
|
+
const [framebuffer] = this.internalState.renderBuffers;
|
|
1010
|
+
this.internalState.internalRenderPass = this.context.device.beginRenderPass({
|
|
1011
|
+
framebuffer,
|
|
1012
|
+
parameters: { viewport: [0, 0, framebuffer.width, framebuffer.height] },
|
|
1013
|
+
clearColor: this.internalState.renderInProgress ? false : [0, 0, 0, 0]
|
|
1014
|
+
});
|
|
1015
|
+
this.internalState.renderInProgress = true;
|
|
1016
|
+
this.context.renderPass = this.internalState.internalRenderPass;
|
|
1017
|
+
}
|
|
1018
|
+
disableRTT() {
|
|
1019
|
+
this.internalState.internalRenderPass.end();
|
|
1020
|
+
this.context.renderPass = this.internalState.originalRenderPass;
|
|
1021
|
+
}
|
|
1022
|
+
applyPostProcess() {
|
|
1023
|
+
if (!this.internalState.renderInProgress) {
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
const [inputBuffer, swapBuffer] = this.internalState.renderBuffers;
|
|
1027
|
+
const { framebuffer: target } = this.context.renderPass.props;
|
|
1028
|
+
this.internalState.postProcess.postRender({
|
|
1029
|
+
inputBuffer,
|
|
1030
|
+
swapBuffer,
|
|
1031
|
+
target
|
|
1032
|
+
});
|
|
1033
|
+
this.internalState.renderInProgress = false;
|
|
1034
|
+
}
|
|
1035
|
+
}, (() => {
|
|
1036
|
+
_a.layerName = `PostProcess${BaseLayer.layerName}`;
|
|
1037
|
+
})(), _a;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
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;
|
|
1213
1161
|
})();
|
|
1214
|
-
function RTTModifier(BaseLayer) {
|
|
1215
|
-
var _a;
|
|
1216
|
-
return _a = class extends BaseLayer {
|
|
1217
|
-
draw(opts) {
|
|
1218
|
-
const { moduleParameters } = opts;
|
|
1219
|
-
const { picking } = moduleParameters;
|
|
1220
|
-
const postProcessLayer = getPostProcessLayer(this);
|
|
1221
|
-
if (!picking.isActive) {
|
|
1222
|
-
postProcessLayer.enableRTT(opts);
|
|
1223
|
-
}
|
|
1224
|
-
super.draw(opts);
|
|
1225
|
-
if (!picking.isActive) {
|
|
1226
|
-
postProcessLayer.disableRTT();
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
}, (() => {
|
|
1230
|
-
_a.layerName = `RTT-${BaseLayer.layerName}`;
|
|
1231
|
-
})(), _a;
|
|
1232
|
-
}
|
|
1233
|
-
function PostProcessModifier(BaseLayer, effect) {
|
|
1234
|
-
var _a;
|
|
1235
|
-
return _a = class extends BaseLayer {
|
|
1236
|
-
initializeState(context) {
|
|
1237
|
-
super.initializeState(context);
|
|
1238
|
-
this._createTextures();
|
|
1239
|
-
this.internalState.postProcess = new import_core8.PostProcessEffect(effect, this.props);
|
|
1240
|
-
this.internalState.postProcess.setup(context);
|
|
1241
|
-
}
|
|
1242
|
-
updateState(params) {
|
|
1243
|
-
super.updateState(params);
|
|
1244
|
-
this.internalState.postProcess.setProps(this.props);
|
|
1245
|
-
}
|
|
1246
|
-
renderLayers() {
|
|
1247
|
-
let subLayers = super.renderLayers();
|
|
1248
|
-
if (!subLayers) {
|
|
1249
|
-
return null;
|
|
1250
|
-
}
|
|
1251
|
-
subLayers = Array.isArray(subLayers) ? subLayers : [subLayers];
|
|
1252
|
-
return [...subLayers, new DrawCallbackLayer()];
|
|
1253
|
-
}
|
|
1254
|
-
_createTextures() {
|
|
1255
|
-
const { device } = this.context;
|
|
1256
|
-
this.internalState.renderBuffers = [0, 1].map((i) => {
|
|
1257
|
-
return device.createFramebuffer({
|
|
1258
|
-
id: `layer-fbo-${i}`,
|
|
1259
|
-
colorAttachments: [device.createTexture(TEXTURE_PROPS)],
|
|
1260
|
-
depthStencilAttachment: "depth16unorm"
|
|
1261
|
-
});
|
|
1262
|
-
});
|
|
1263
|
-
}
|
|
1264
|
-
_resizeBuffers(opts) {
|
|
1265
|
-
const { moduleParameters } = opts;
|
|
1266
|
-
const { viewport } = this.context;
|
|
1267
|
-
const width = moduleParameters.devicePixelRatio * viewport.width;
|
|
1268
|
-
const height = moduleParameters.devicePixelRatio * viewport.height;
|
|
1269
|
-
this.internalState.renderBuffers.forEach((fbo) => fbo.resize({ width, height }));
|
|
1270
|
-
}
|
|
1271
|
-
enableRTT(opts) {
|
|
1272
|
-
this._resizeBuffers(opts);
|
|
1273
|
-
this.internalState.originalRenderPass = this.context.renderPass;
|
|
1274
|
-
const [framebuffer] = this.internalState.renderBuffers;
|
|
1275
|
-
this.internalState.internalRenderPass = this.context.device.beginRenderPass({
|
|
1276
|
-
framebuffer,
|
|
1277
|
-
parameters: { viewport: [0, 0, framebuffer.width, framebuffer.height] },
|
|
1278
|
-
clearColor: this.internalState.renderInProgress ? false : [0, 0, 0, 0]
|
|
1279
|
-
});
|
|
1280
|
-
this.internalState.renderInProgress = true;
|
|
1281
|
-
this.context.renderPass = this.internalState.internalRenderPass;
|
|
1282
|
-
}
|
|
1283
|
-
disableRTT() {
|
|
1284
|
-
this.internalState.internalRenderPass.end();
|
|
1285
|
-
this.context.renderPass = this.internalState.originalRenderPass;
|
|
1286
|
-
}
|
|
1287
|
-
applyPostProcess() {
|
|
1288
|
-
if (!this.internalState.renderInProgress) {
|
|
1289
|
-
return;
|
|
1290
|
-
}
|
|
1291
|
-
const [inputBuffer, swapBuffer] = this.internalState.renderBuffers;
|
|
1292
|
-
const { framebuffer: target } = this.context.renderPass.props;
|
|
1293
|
-
this.internalState.postProcess.postRender({
|
|
1294
|
-
inputBuffer,
|
|
1295
|
-
swapBuffer,
|
|
1296
|
-
target
|
|
1297
|
-
});
|
|
1298
|
-
this.internalState.renderInProgress = false;
|
|
1299
|
-
}
|
|
1300
|
-
}, (() => {
|
|
1301
|
-
_a.layerName = `PostProcess${BaseLayer.layerName}`;
|
|
1302
|
-
})(), _a;
|
|
1303
|
-
}
|
|
1304
1162
|
|
|
1305
|
-
// dist/layers/
|
|
1306
|
-
|
|
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 { data, getWeight, colorDomain, colorRange, radiusPixels, _subLayerProps, updateTriggers, ...tileLayerProps } = 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
|
-
|
|
1248
|
+
let tileZ = 0;
|
|
1249
|
+
let maxDensity = 0;
|
|
1250
|
+
const tiles = [...this.state.tiles].filter((t) => t.isVisible && t.content);
|
|
1251
|
+
for (const tile of tiles) {
|
|
1252
|
+
const cell = tile.content[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
|
+
}
|
|
1365
1263
|
return new PostProcessQuadbinTileLayer(tileLayerProps, this.getSubLayerProps({
|
|
1366
1264
|
id: "heatmap",
|
|
1367
1265
|
data,
|
|
1368
|
-
getFillColor,
|
|
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.19" : "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;
|
|
@@ -3229,9 +3299,9 @@ var query = async function(options) {
|
|
|
3229
3299
|
// dist/index.js
|
|
3230
3300
|
var CARTO_LAYERS = {
|
|
3231
3301
|
H3TileLayer,
|
|
3302
|
+
HeatmapTileLayer: heatmap_tile_layer_default,
|
|
3232
3303
|
_PointLabelLayer: PointLabelLayer,
|
|
3233
3304
|
QuadbinTileLayer,
|
|
3234
|
-
QuadbinHeatmapTileLayer: quadbin_heatmap_tile_layer_default,
|
|
3235
3305
|
RasterTileLayer,
|
|
3236
3306
|
VectorTileLayer
|
|
3237
3307
|
};
|