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