isard 1.0.0 → 1.2.0
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/CHANGELOG.md +51 -0
- package/dist/{basemaps.d.ts → basemap/basemaps.d.ts} +3 -3
- package/dist/{basemaps.js → basemap/basemaps.js} +3 -3
- package/dist/basemap/basemaps.js.map +1 -0
- package/dist/{grid.d.ts → basemap/grid.d.ts} +6 -6
- package/dist/{grid.js → basemap/grid.js} +61 -67
- package/dist/basemap/grid.js.map +1 -0
- package/dist/{mvt.d.ts → basemap/mvt.d.ts} +1 -1
- package/dist/{mvt.js → basemap/mvt.js} +6 -6
- package/dist/basemap/mvt.js.map +1 -0
- package/dist/{pmtiles.d.ts → basemap/pmtiles.d.ts} +16 -10
- package/dist/{pmtiles.js → basemap/pmtiles.js} +41 -33
- package/dist/basemap/pmtiles.js.map +1 -0
- package/dist/{resample.d.ts → basemap/resample.d.ts} +11 -2
- package/dist/{resample.js → basemap/resample.js} +18 -16
- package/dist/basemap/resample.js.map +1 -0
- package/dist/{terrain.d.ts → basemap/terrain.d.ts} +3 -3
- package/dist/{terrain.js → basemap/terrain.js} +7 -7
- package/dist/basemap/terrain.js.map +1 -0
- package/dist/{vectorstyle.d.ts → basemap/vectorstyle.d.ts} +12 -10
- package/dist/{vectorstyle.js → basemap/vectorstyle.js} +129 -111
- package/dist/basemap/vectorstyle.js.map +1 -0
- package/dist/{vectortiles.d.ts → basemap/vectortiles.d.ts} +18 -18
- package/dist/{vectortiles.js → basemap/vectortiles.js} +157 -109
- package/dist/basemap/vectortiles.js.map +1 -0
- package/dist/{wmts.d.ts → basemap/wmts.d.ts} +3 -3
- package/dist/{wmts.js → basemap/wmts.js} +19 -14
- package/dist/basemap/wmts.js.map +1 -0
- package/dist/basemap.worker.js +2 -2
- package/dist/basemap.worker.js.map +14 -13
- package/dist/bind/layers.d.ts +46 -0
- package/dist/bind/layers.js +154 -0
- package/dist/bind/layers.js.map +1 -0
- package/dist/{crs.d.ts → data/crs.d.ts} +11 -11
- package/dist/{crs.js → data/crs.js} +38 -34
- package/dist/data/crs.js.map +1 -0
- package/dist/{gpx.d.ts → data/gpx.d.ts} +2 -2
- package/dist/{gpx.js → data/gpx.js} +20 -20
- package/dist/data/gpx.js.map +1 -0
- package/dist/{kml.d.ts → data/kml.d.ts} +2 -2
- package/dist/{kml.js → data/kml.js} +42 -39
- package/dist/data/kml.js.map +1 -0
- package/dist/{topojson.d.ts → data/topojson.d.ts} +2 -2
- package/dist/{topojson.js → data/topojson.js} +15 -10
- package/dist/data/topojson.js.map +1 -0
- package/dist/{xml.d.ts → data/xml.d.ts} +5 -5
- package/dist/{xml.js → data/xml.js} +19 -18
- package/dist/data/xml.js.map +1 -0
- package/dist/decoder.worker.js +4 -4
- package/dist/decoder.worker.js.map +7 -7
- package/dist/{decoders.d.ts → engine/decoders.d.ts} +3 -3
- package/dist/{decoders.js → engine/decoders.js} +28 -25
- package/dist/engine/decoders.js.map +1 -0
- package/dist/{loader.d.ts → engine/loader.d.ts} +1 -1
- package/dist/{loader.js → engine/loader.js} +17 -14
- package/dist/engine/loader.js.map +1 -0
- package/dist/{protocol.d.ts → engine/protocol.d.ts} +1 -1
- package/dist/engine/protocol.js +3 -0
- package/dist/engine/protocol.js.map +1 -0
- package/dist/{requests.d.ts → engine/requests.d.ts} +1 -1
- package/dist/{requests.js → engine/requests.js} +19 -16
- package/dist/engine/requests.js.map +1 -0
- package/dist/engine-loader.d.ts +13 -9
- package/dist/engine-loader.js +30 -30
- package/dist/engine-loader.js.map +1 -1
- package/dist/formats.d.ts +3 -3
- package/dist/formats.js +3 -3
- package/dist/formats.js.map +1 -1
- package/dist/geoplateforme.d.ts +13 -13
- package/dist/geoplateforme.js +23 -21
- package/dist/geoplateforme.js.map +1 -1
- package/dist/index.d.ts +30 -29
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/isard_bg.wasm +0 -0
- package/dist/isard_core_bg.wasm +0 -0
- package/dist/isard_points_bg.wasm +0 -0
- package/dist/{extrusions.d.ts → layers/extrusions.d.ts} +1 -1
- package/dist/{extrusions.js → layers/extrusions.js} +10 -5
- package/dist/layers/extrusions.js.map +1 -0
- package/dist/{features.d.ts → layers/features.d.ts} +10 -10
- package/dist/{features.js → layers/features.js} +44 -45
- package/dist/layers/features.js.map +1 -0
- package/dist/{glyphs.d.ts → layers/glyphs.d.ts} +6 -6
- package/dist/{glyphs.js → layers/glyphs.js} +45 -41
- package/dist/layers/glyphs.js.map +1 -0
- package/dist/{icons.d.ts → layers/icons.d.ts} +10 -10
- package/dist/{icons.js → layers/icons.js} +84 -69
- package/dist/layers/icons.js.map +1 -0
- package/dist/{layers.d.ts → layers/layers.d.ts} +9 -4
- package/dist/{layers.js → layers/layers.js} +35 -31
- package/dist/layers/layers.js.map +1 -0
- package/dist/{panoramas.d.ts → layers/panoramas.d.ts} +3 -3
- package/dist/{panoramas.js → layers/panoramas.js} +54 -43
- package/dist/layers/panoramas.js.map +1 -0
- package/dist/{pointclouds.d.ts → layers/pointclouds.d.ts} +5 -5
- package/dist/{pointclouds.js → layers/pointclouds.js} +26 -34
- package/dist/layers/pointclouds.js.map +1 -0
- package/dist/{symbols.d.ts → layers/symbols.d.ts} +3 -3
- package/dist/{symbols.js → layers/symbols.js} +69 -72
- package/dist/layers/symbols.js.map +1 -0
- package/dist/map/basemap-layers.d.ts +26 -0
- package/dist/map/basemap-layers.js +61 -0
- package/dist/map/basemap-layers.js.map +1 -0
- package/dist/map/canvas.d.ts +17 -0
- package/dist/map/canvas.js +56 -0
- package/dist/map/canvas.js.map +1 -0
- package/dist/map/checks.d.ts +11 -0
- package/dist/map/checks.js +39 -0
- package/dist/map/checks.js.map +1 -0
- package/dist/map/credits.d.ts +17 -0
- package/dist/map/credits.js +34 -0
- package/dist/map/credits.js.map +1 -0
- package/dist/map/engine-settings.d.ts +15 -0
- package/dist/map/engine-settings.js +45 -0
- package/dist/map/engine-settings.js.map +1 -0
- package/dist/map/engines.d.ts +41 -0
- package/dist/map/engines.js +77 -0
- package/dist/map/engines.js.map +1 -0
- package/dist/map/events.d.ts +14 -0
- package/dist/map/events.js +46 -0
- package/dist/map/events.js.map +1 -0
- package/dist/map/frame-loop.d.ts +61 -0
- package/dist/map/frame-loop.js +139 -0
- package/dist/map/frame-loop.js.map +1 -0
- package/dist/map/hover-pick.d.ts +30 -0
- package/dist/map/hover-pick.js +56 -0
- package/dist/map/hover-pick.js.map +1 -0
- package/dist/map/layer-spec.d.ts +42 -0
- package/dist/map/layer-spec.js +34 -0
- package/dist/map/layer-spec.js.map +1 -0
- package/dist/map/layer-stack.d.ts +36 -0
- package/dist/map/layer-stack.js +101 -0
- package/dist/map/layer-stack.js.map +1 -0
- package/dist/map/overlay-host.d.ts +36 -0
- package/dist/map/overlay-host.js +101 -0
- package/dist/map/overlay-host.js.map +1 -0
- package/dist/map/panorama-host.d.ts +5 -0
- package/dist/map/panorama-host.js +32 -0
- package/dist/map/panorama-host.js.map +1 -0
- package/dist/map/raster-source.d.ts +11 -0
- package/dist/map/raster-source.js +26 -0
- package/dist/map/raster-source.js.map +1 -0
- package/dist/map/symbol-atlases.d.ts +26 -0
- package/dist/map/symbol-atlases.js +59 -0
- package/dist/map/symbol-atlases.js.map +1 -0
- package/dist/map/viewshed.d.ts +5 -0
- package/dist/map/viewshed.js +28 -0
- package/dist/map/viewshed.js.map +1 -0
- package/dist/map/workers.d.ts +46 -0
- package/dist/map/workers.js +73 -0
- package/dist/map/workers.js.map +1 -0
- package/dist/map.d.ts +46 -127
- package/dist/map.js +183 -698
- package/dist/map.js.map +1 -1
- package/dist/projections.d.ts +3 -3
- package/dist/projections.js +2 -2
- package/dist/projections.js.map +1 -1
- package/dist/react/Control.d.ts +11 -0
- package/dist/react/Control.js +18 -0
- package/dist/react/Control.js.map +1 -0
- package/dist/react/CustomLayer.d.ts +11 -0
- package/dist/react/CustomLayer.js +30 -0
- package/dist/react/CustomLayer.js.map +1 -0
- package/dist/react/IsardMap.d.ts +43 -0
- package/dist/react/IsardMap.js +146 -0
- package/dist/react/IsardMap.js.map +1 -0
- package/dist/react/Layer.d.ts +42 -0
- package/dist/react/Layer.js +74 -0
- package/dist/react/Layer.js.map +1 -0
- package/dist/react/Marker.d.ts +24 -0
- package/dist/react/Marker.js +53 -0
- package/dist/react/Marker.js.map +1 -0
- package/dist/react/Panel.d.ts +11 -0
- package/dist/react/Panel.js +37 -0
- package/dist/react/Panel.js.map +1 -0
- package/dist/react/Popup.d.ts +18 -0
- package/dist/react/Popup.js +60 -0
- package/dist/react/Popup.js.map +1 -0
- package/dist/react/Swipe.d.ts +9 -0
- package/dist/react/Swipe.js +41 -0
- package/dist/react/Swipe.js.map +1 -0
- package/dist/react/Viewshed.d.ts +5 -0
- package/dist/react/Viewshed.js +28 -0
- package/dist/react/Viewshed.js.map +1 -0
- package/dist/react/context.d.ts +32 -0
- package/dist/react/context.js +20 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/index.d.ts +26 -0
- package/dist/react/index.js +22 -0
- package/dist/react/index.js.map +1 -0
- package/dist/settings.d.ts +6 -10
- package/dist/settings.js +19 -17
- package/dist/settings.js.map +1 -1
- package/dist/types.d.ts +8 -8
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/{controls.d.ts → ui/controls.d.ts} +1 -1
- package/dist/{controls.js → ui/controls.js} +6 -4
- package/dist/ui/controls.js.map +1 -0
- package/dist/{interaction.d.ts → ui/interaction.d.ts} +9 -5
- package/dist/{interaction.js → ui/interaction.js} +9 -8
- package/dist/ui/interaction.js.map +1 -0
- package/dist/{overlay.d.ts → ui/overlay.d.ts} +2 -2
- package/dist/{overlay.js → ui/overlay.js} +18 -20
- package/dist/ui/overlay.js.map +1 -0
- package/dist/{style.d.ts → ui/style.d.ts} +1 -1
- package/dist/{style.js → ui/style.js} +2 -2
- package/dist/ui/style.js.map +1 -0
- package/dist/{animation.d.ts → util/animation.d.ts} +9 -5
- package/dist/{animation.js → util/animation.js} +6 -6
- package/dist/util/animation.js.map +1 -0
- package/dist/{color.d.ts → util/color.d.ts} +1 -1
- package/dist/{color.js → util/color.js} +14 -16
- package/dist/util/color.js.map +1 -0
- package/dist/{geo.d.ts → util/geo.d.ts} +6 -6
- package/dist/{geo.js → util/geo.js} +12 -12
- package/dist/util/geo.js.map +1 -0
- package/dist/util/guards.d.ts +7 -0
- package/dist/util/guards.js +8 -0
- package/dist/util/guards.js.map +1 -0
- package/dist/util/lru.js.map +1 -0
- package/dist/wasm/isard.d.ts +168 -0
- package/dist/wasm/isard.js +146 -0
- package/dist/wasm/isard_core.d.ts +144 -0
- package/dist/wasm/isard_core.js +122 -0
- package/dist/{basemap.worker.d.ts → workers/basemap.worker.d.ts} +17 -7
- package/dist/workers/basemap.worker.js +658 -0
- package/dist/workers/basemap.worker.js.map +1 -0
- package/package.json +24 -1
- package/vite.js +1 -1
- package/dist/animation.js.map +0 -1
- package/dist/basemaps.js.map +0 -1
- package/dist/color.js.map +0 -1
- package/dist/controls.js.map +0 -1
- package/dist/crs.js.map +0 -1
- package/dist/decoders.js.map +0 -1
- package/dist/extrusions.js.map +0 -1
- package/dist/features.js.map +0 -1
- package/dist/geo.js.map +0 -1
- package/dist/glyphs.js.map +0 -1
- package/dist/gpx.js.map +0 -1
- package/dist/grid.js.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/interaction.js.map +0 -1
- package/dist/kml.js.map +0 -1
- package/dist/layers.js.map +0 -1
- package/dist/loader.js.map +0 -1
- package/dist/lru.js.map +0 -1
- package/dist/mvt.js.map +0 -1
- package/dist/overlay.js.map +0 -1
- package/dist/panoramas.js.map +0 -1
- package/dist/pmtiles.js.map +0 -1
- package/dist/pointclouds.js.map +0 -1
- package/dist/protocol.js +0 -2
- package/dist/protocol.js.map +0 -1
- package/dist/requests.js.map +0 -1
- package/dist/resample.js.map +0 -1
- package/dist/style.js.map +0 -1
- package/dist/symbols.js.map +0 -1
- package/dist/terrain.js.map +0 -1
- package/dist/topojson.js.map +0 -1
- package/dist/vectorstyle.js.map +0 -1
- package/dist/vectortiles.js.map +0 -1
- package/dist/wmts.js.map +0 -1
- package/dist/xml.js.map +0 -1
- /package/dist/{lru.d.ts → util/lru.d.ts} +0 -0
- /package/dist/{lru.js → util/lru.js} +0 -0
|
@@ -6,43 +6,52 @@
|
|
|
6
6
|
* `format`, conversions and assertions, `upcase`, `downcase`, `literal`…; others give null, with a warning), colors
|
|
7
7
|
* interpolated in RGBA, `{token}` text fields.
|
|
8
8
|
*/
|
|
9
|
-
import { parseCssColor } from "
|
|
9
|
+
import { parseCssColor } from "../util/color.js";
|
|
10
|
+
import { isRecord } from "../util/guards.js";
|
|
11
|
+
/** A MapLibre style, as far as the basemap reads it: its sources and its layers (an id and a type each) */
|
|
12
|
+
export const isStyle = (value) => isRecord(value) &&
|
|
13
|
+
isRecord(value.sources) &&
|
|
14
|
+
Object.values(value.sources).every((s) => isRecord(s) && typeof s.type === 'string') &&
|
|
15
|
+
Array.isArray(value.layers) &&
|
|
16
|
+
value.layers.every((l) => isRecord(l) && typeof l.id === 'string' && typeof l.type === 'string');
|
|
10
17
|
const TYPES = ['Unknown', 'Point', 'LineString', 'Polygon'];
|
|
11
|
-
export
|
|
18
|
+
export const context = (feature, zoom) => {
|
|
12
19
|
return { zoom, properties: feature.properties, type: TYPES[feature.type] ?? 'Unknown' };
|
|
13
|
-
}
|
|
20
|
+
};
|
|
14
21
|
// ── Colors ──
|
|
15
22
|
/** A color to RGBA 0-1, undefined if it is not one */
|
|
16
|
-
export
|
|
23
|
+
export const color = (value) => {
|
|
17
24
|
return parseCssColor(value);
|
|
18
|
-
}
|
|
19
|
-
export
|
|
25
|
+
};
|
|
26
|
+
export const css = ([r, g, b, a]) => {
|
|
20
27
|
return `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)},${a})`;
|
|
21
|
-
}
|
|
28
|
+
};
|
|
22
29
|
// ── Interpolation ──
|
|
23
30
|
/** Factor between two stops: linear, or exponential of `base` */
|
|
24
|
-
|
|
31
|
+
const factor = (x, x0, x1, base = 1) => {
|
|
25
32
|
const d = x1 - x0;
|
|
26
33
|
if (d === 0)
|
|
27
34
|
return 0;
|
|
28
35
|
const t = x - x0;
|
|
29
36
|
return base === 1 ? t / d : (base ** t - 1) / (base ** d - 1);
|
|
30
|
-
}
|
|
31
|
-
|
|
37
|
+
};
|
|
38
|
+
const mix = (a, b, t) => {
|
|
32
39
|
if (typeof a === 'number' && typeof b === 'number')
|
|
33
40
|
return a + (b - a) * t;
|
|
34
41
|
const ca = color(a);
|
|
35
42
|
const cb = color(b);
|
|
36
|
-
if (ca && cb)
|
|
37
|
-
|
|
43
|
+
if (ca && cb) {
|
|
44
|
+
const lerp = (i) => ca[i] + (cb[i] - ca[i]) * t;
|
|
45
|
+
return css([lerp(0), lerp(1), lerp(2), lerp(3)]);
|
|
46
|
+
}
|
|
38
47
|
if (Array.isArray(a) && Array.isArray(b))
|
|
39
48
|
return a.map((v, i) => mix(v, b[i], t));
|
|
40
49
|
return t < 0.5 ? a : b;
|
|
41
|
-
}
|
|
42
|
-
|
|
50
|
+
};
|
|
51
|
+
const isFunction = (v) => {
|
|
43
52
|
return typeof v === 'object' && v !== null && !Array.isArray(v) && Array.isArray(v.stops);
|
|
44
|
-
}
|
|
45
|
-
|
|
53
|
+
};
|
|
54
|
+
const legacy = (f, ctx) => {
|
|
46
55
|
const input = f.property === undefined ? ctx.zoom : ctx.properties[f.property];
|
|
47
56
|
const stops = f.stops;
|
|
48
57
|
const type = f.type ?? (f.property === undefined || typeof stops[0]?.[0] === 'number' ? 'exponential' : 'categorical');
|
|
@@ -53,30 +62,45 @@ function legacy(f, ctx) {
|
|
|
53
62
|
if (typeof input !== 'number' || !stops.length)
|
|
54
63
|
return f.default ?? stops[0]?.[1];
|
|
55
64
|
// Zoom-and-property stops ({ zoom, value } keys) are taken at their zoom only
|
|
56
|
-
const key = (
|
|
65
|
+
const key = ([k]) => {
|
|
66
|
+
if (Array.isArray(k))
|
|
67
|
+
return Number.NaN;
|
|
68
|
+
return isRecord(k) ? Number(k.zoom) : Number(k);
|
|
69
|
+
};
|
|
57
70
|
const first = stops[0];
|
|
58
71
|
if (!first)
|
|
59
72
|
return f.default;
|
|
60
73
|
if (input <= key(first))
|
|
61
74
|
return first[1];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return stops.at(-1)?.[1];
|
|
73
|
-
}
|
|
75
|
+
const at = stops.findIndex((s1, i) => i > 0 && Boolean(stops[i - 1]) && Boolean(s1) && input < key(s1));
|
|
76
|
+
const [s0, s1] = [stops[at - 1], stops[at]];
|
|
77
|
+
if (at < 0 || !s0 || !s1)
|
|
78
|
+
return stops.at(-1)?.[1];
|
|
79
|
+
if (type === 'interval')
|
|
80
|
+
return s0[1];
|
|
81
|
+
return mix(s0[1], s1[1], factor(input, key(s0), key(s1), f.base ?? 1));
|
|
82
|
+
};
|
|
74
83
|
// ── Expressions ──
|
|
75
|
-
|
|
84
|
+
/** A list of values to look a value up in (any value: `includes` compares with `===`) */
|
|
85
|
+
const labels = (values) => values;
|
|
86
|
+
const ORDERS = {
|
|
87
|
+
'<': (a, b) => a < b,
|
|
88
|
+
'<=': (a, b) => a <= b,
|
|
89
|
+
'>': (a, b) => a > b,
|
|
90
|
+
'>=': (a, b) => a >= b,
|
|
91
|
+
};
|
|
92
|
+
/** A comparison of any two values the way JavaScript's operators make it: two strings (lists and objects as their
|
|
93
|
+
* text) in text order, anything else as numbers */
|
|
94
|
+
const compare = (op, a, b) => {
|
|
95
|
+
const text = (v) => (typeof v === 'object' && v !== null ? String(v) : v);
|
|
96
|
+
const [x, y] = [text(a), text(b)];
|
|
97
|
+
return typeof x === 'string' && typeof y === 'string' ? ORDERS[op](x, y) : ORDERS[op](Number(x), Number(y));
|
|
98
|
+
};
|
|
99
|
+
const get = (ctx, key) => {
|
|
76
100
|
if (key === '$type')
|
|
77
101
|
return ctx.type;
|
|
78
102
|
return typeof key === 'string' ? ctx.properties[key] : undefined;
|
|
79
|
-
}
|
|
103
|
+
};
|
|
80
104
|
/** The operators `evaluate` knows */
|
|
81
105
|
const OPERATORS = new Set([
|
|
82
106
|
'literal',
|
|
@@ -142,13 +166,13 @@ const OPERATORS = new Set([
|
|
|
142
166
|
'e',
|
|
143
167
|
]);
|
|
144
168
|
/** Whether a value is an expression (an array starting with a known operator), not a literal array */
|
|
145
|
-
export
|
|
169
|
+
export const isExpression = (e) => {
|
|
146
170
|
return Array.isArray(e) && typeof e[0] === 'string' && OPERATORS.has(e[0]);
|
|
147
|
-
}
|
|
171
|
+
};
|
|
148
172
|
/** Operators already warned about */
|
|
149
173
|
const warned = new Set();
|
|
150
174
|
const str = (v) => (v === undefined || v === null ? '' : String(v));
|
|
151
|
-
export
|
|
175
|
+
export const evaluate = (e, ctx) => {
|
|
152
176
|
if (isFunction(e))
|
|
153
177
|
return legacy(e, ctx);
|
|
154
178
|
if (!Array.isArray(e))
|
|
@@ -184,13 +208,17 @@ export function evaluate(e, ctx) {
|
|
|
184
208
|
case 'image':
|
|
185
209
|
return ev(0);
|
|
186
210
|
case 'number-format': {
|
|
187
|
-
const options = (args[1]
|
|
211
|
+
const options = isRecord(args[1]) ? args[1] : {};
|
|
212
|
+
const option = (key) => {
|
|
213
|
+
const v = options[key];
|
|
214
|
+
return typeof v === 'number' ? v : undefined;
|
|
215
|
+
};
|
|
188
216
|
const n = num(0);
|
|
189
217
|
if (!Number.isFinite(n))
|
|
190
218
|
return '';
|
|
191
|
-
return n.toLocaleString(options.locale, {
|
|
192
|
-
minimumFractionDigits:
|
|
193
|
-
maximumFractionDigits:
|
|
219
|
+
return n.toLocaleString(typeof options.locale === 'string' ? options.locale : undefined, {
|
|
220
|
+
minimumFractionDigits: option('min-fraction-digits'),
|
|
221
|
+
maximumFractionDigits: option('max-fraction-digits'),
|
|
194
222
|
});
|
|
195
223
|
}
|
|
196
224
|
case 'to-number': {
|
|
@@ -262,13 +290,10 @@ export function evaluate(e, ctx) {
|
|
|
262
290
|
case '!=':
|
|
263
291
|
return ev(0) !== ev(1);
|
|
264
292
|
case '<':
|
|
265
|
-
return ev(0) < ev(1);
|
|
266
293
|
case '<=':
|
|
267
|
-
return ev(0) <= ev(1);
|
|
268
294
|
case '>':
|
|
269
|
-
return ev(0) > ev(1);
|
|
270
295
|
case '>=':
|
|
271
|
-
return ev(0)
|
|
296
|
+
return compare(op, ev(0), ev(1));
|
|
272
297
|
case 'in': {
|
|
273
298
|
const haystack = ev(1);
|
|
274
299
|
const needle = ev(0);
|
|
@@ -277,19 +302,15 @@ export function evaluate(e, ctx) {
|
|
|
277
302
|
return Array.isArray(haystack) && haystack.includes(needle);
|
|
278
303
|
}
|
|
279
304
|
case 'case': {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return ev(i + 1);
|
|
283
|
-
return ev(args.length - 1);
|
|
305
|
+
const hit = args.findIndex((_, i) => i % 2 === 0 && i + 1 < args.length && Boolean(ev(i)));
|
|
306
|
+
return hit < 0 ? ev(args.length - 1) : ev(hit + 1);
|
|
284
307
|
}
|
|
285
308
|
case 'match': {
|
|
286
309
|
const input = ev(0);
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
return ev(args.length - 1);
|
|
310
|
+
const hit = args.findIndex((label, i) => i % 2 === 1 &&
|
|
311
|
+
i + 1 < args.length &&
|
|
312
|
+
(Array.isArray(label) ? labels(label).includes(input) : label === input));
|
|
313
|
+
return hit < 0 ? ev(args.length - 1) : ev(hit + 1);
|
|
293
314
|
}
|
|
294
315
|
case 'step': {
|
|
295
316
|
const input = num(0);
|
|
@@ -308,20 +329,20 @@ export function evaluate(e, ctx) {
|
|
|
308
329
|
const kind = args[0];
|
|
309
330
|
const input = num(1);
|
|
310
331
|
const base = Array.isArray(kind) && kind[0] === 'exponential' ? Number(kind[1]) : 1;
|
|
311
|
-
const stops = [
|
|
312
|
-
|
|
313
|
-
|
|
332
|
+
const stops = Array.from({ length: Math.floor((args.length - 2) / 2) }, (_, k) => [
|
|
333
|
+
Number(args[2 + 2 * k]),
|
|
334
|
+
args[3 + 2 * k] ?? null,
|
|
335
|
+
]);
|
|
314
336
|
const first = stops[0];
|
|
315
337
|
if (!first)
|
|
316
338
|
return null;
|
|
317
339
|
if (input <= first[0])
|
|
318
340
|
return evaluate(first[1], ctx);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
return evaluate(stops.at(-1)?.[1] ?? null, ctx);
|
|
341
|
+
const at = stops.findIndex((s1, i) => i > 0 && input < s1[0]);
|
|
342
|
+
const [s0, s1] = [stops[at - 1], stops[at]];
|
|
343
|
+
if (at < 0 || !s0 || !s1)
|
|
344
|
+
return evaluate(stops.at(-1)?.[1] ?? null, ctx);
|
|
345
|
+
return mix(evaluate(s0[1], ctx), evaluate(s1[1], ctx), factor(input, s0[0], s1[0], base));
|
|
325
346
|
}
|
|
326
347
|
case 'rgb':
|
|
327
348
|
case 'rgba':
|
|
@@ -371,12 +392,12 @@ export function evaluate(e, ctx) {
|
|
|
371
392
|
}
|
|
372
393
|
return null;
|
|
373
394
|
}
|
|
374
|
-
}
|
|
395
|
+
};
|
|
375
396
|
// ── Filters ──
|
|
376
397
|
const LEGACY_COMPARISONS = new Set(['==', '!=', '<', '<=', '>', '>=']);
|
|
377
398
|
/** Whether a filter (not `all`, `any`, `none`) is in the legacy form: `["==", "key", value]`, `["in", "key", a, b]`,
|
|
378
399
|
* `["has", "key"]`; a key and literal values, as MapLibre tells them from expressions */
|
|
379
|
-
|
|
400
|
+
const isLegacyLeaf = (f) => {
|
|
380
401
|
const [op, a, ...rest] = f;
|
|
381
402
|
if (typeof op !== 'string' || typeof a !== 'string' || rest.some(Array.isArray))
|
|
382
403
|
return false;
|
|
@@ -385,8 +406,8 @@ function isLegacyLeaf(f) {
|
|
|
385
406
|
if (op === 'in')
|
|
386
407
|
return f.length !== 3 || !Array.isArray(f[2]);
|
|
387
408
|
return op === '!in' || op === 'has' || op === '!has';
|
|
388
|
-
}
|
|
389
|
-
|
|
409
|
+
};
|
|
410
|
+
const legacyFilter = (f, ctx) => {
|
|
390
411
|
const [op, key, ...rest] = f;
|
|
391
412
|
const v = get(ctx, key);
|
|
392
413
|
switch (op) {
|
|
@@ -395,17 +416,14 @@ function legacyFilter(f, ctx) {
|
|
|
395
416
|
case '!=':
|
|
396
417
|
return v !== rest[0];
|
|
397
418
|
case '<':
|
|
398
|
-
return v < rest[0];
|
|
399
419
|
case '<=':
|
|
400
|
-
return v <= rest[0];
|
|
401
420
|
case '>':
|
|
402
|
-
return v > rest[0];
|
|
403
421
|
case '>=':
|
|
404
|
-
return v
|
|
422
|
+
return compare(op, v, rest[0]);
|
|
405
423
|
case 'in':
|
|
406
|
-
return rest.includes(v);
|
|
424
|
+
return labels(rest).includes(v);
|
|
407
425
|
case '!in':
|
|
408
|
-
return !rest.includes(v);
|
|
426
|
+
return !labels(rest).includes(v);
|
|
409
427
|
case 'has':
|
|
410
428
|
return v !== undefined;
|
|
411
429
|
case '!has':
|
|
@@ -413,53 +431,53 @@ function legacyFilter(f, ctx) {
|
|
|
413
431
|
default:
|
|
414
432
|
return true;
|
|
415
433
|
}
|
|
416
|
-
}
|
|
434
|
+
};
|
|
417
435
|
/** Compiled filters, by filter object */
|
|
418
436
|
const compiled = new WeakMap();
|
|
419
437
|
/** A filter as a function: `all`, `any`, `none` of their parts, each part legacy or an expression (they may mix) */
|
|
420
|
-
|
|
438
|
+
const compile = (f) => {
|
|
421
439
|
if (!Array.isArray(f))
|
|
422
440
|
return () => Boolean(f);
|
|
423
441
|
const hit = compiled.get(f);
|
|
424
442
|
if (hit)
|
|
425
443
|
return hit;
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
test = (ctx) => Boolean(evaluate(f, ctx));
|
|
442
|
-
}
|
|
444
|
+
const make = () => {
|
|
445
|
+
const op = f[0];
|
|
446
|
+
if (op === 'all' || op === 'any' || op === 'none') {
|
|
447
|
+
const parts = f.slice(1).map(compile);
|
|
448
|
+
if (op === 'all')
|
|
449
|
+
return (ctx) => parts.every((p) => p(ctx));
|
|
450
|
+
if (op === 'any')
|
|
451
|
+
return (ctx) => parts.some((p) => p(ctx));
|
|
452
|
+
return (ctx) => !parts.some((p) => p(ctx));
|
|
453
|
+
}
|
|
454
|
+
if (isLegacyLeaf(f))
|
|
455
|
+
return (ctx) => legacyFilter(f, ctx);
|
|
456
|
+
return (ctx) => Boolean(evaluate(f, ctx));
|
|
457
|
+
};
|
|
458
|
+
const test = make();
|
|
443
459
|
compiled.set(f, test);
|
|
444
460
|
return test;
|
|
445
|
-
}
|
|
446
|
-
export
|
|
461
|
+
};
|
|
462
|
+
export const filter = (f, ctx) => {
|
|
447
463
|
if (f === undefined || f === null)
|
|
448
464
|
return true;
|
|
449
465
|
return compile(f)(ctx);
|
|
450
|
-
}
|
|
466
|
+
};
|
|
467
|
+
/** The operators that read the feature */
|
|
468
|
+
const FEATURE_OPERATORS = new Set(['get', 'has', '!has', 'geometry-type', 'properties', 'id']);
|
|
451
469
|
/** Whether a value depends on the feature (else only on the zoom, evaluated once per tile) */
|
|
452
|
-
export
|
|
470
|
+
export const isFeatureDependent = (e) => {
|
|
453
471
|
if (e !== undefined && isFunction(e))
|
|
454
472
|
return e.property !== undefined;
|
|
455
473
|
if (!Array.isArray(e))
|
|
456
474
|
return false;
|
|
457
|
-
if (
|
|
475
|
+
if (FEATURE_OPERATORS.has(e[0]))
|
|
458
476
|
return true;
|
|
459
477
|
return e.some((x) => isFeatureDependent(x));
|
|
460
|
-
}
|
|
478
|
+
};
|
|
461
479
|
/** A `{token}` text field (or an expression) to the text of a feature */
|
|
462
|
-
export
|
|
480
|
+
export const text = (field, ctx) => {
|
|
463
481
|
if (field === undefined || field === null)
|
|
464
482
|
return '';
|
|
465
483
|
if (typeof field === 'string') {
|
|
@@ -474,45 +492,45 @@ export function text(field, ctx) {
|
|
|
474
492
|
return v.filter((x) => typeof x === 'string').join('');
|
|
475
493
|
}
|
|
476
494
|
return v === undefined || v === null ? '' : String(v);
|
|
477
|
-
}
|
|
495
|
+
};
|
|
478
496
|
/** The font of a label from the first of its `text-font`: a family without its weight takes the regular one */
|
|
479
|
-
export
|
|
497
|
+
export const labelFont = (font) => {
|
|
480
498
|
return /Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(font) ? font : `${font} Regular`;
|
|
481
|
-
}
|
|
499
|
+
};
|
|
482
500
|
/**
|
|
483
501
|
* A value of the zoom only (an expression: `interpolate`, `step` of `["zoom"]`) as stops `[[zoom, value], …]` for the
|
|
484
502
|
* engine, which interpolates them linearly: evaluated at its own stops and at the whole zooms between (an exponential
|
|
485
503
|
* curve followed closely), a step kept sharp just before its threshold
|
|
486
504
|
*/
|
|
487
|
-
export
|
|
505
|
+
export const zoomStops = (e) => {
|
|
488
506
|
const zooms = new Set();
|
|
507
|
+
// The inputs of the stops of an `interpolate` or a `step` (from its fourth argument, one in two)
|
|
508
|
+
const stopInputs = (x) => x.filter((_, i) => i >= 3 && i % 2 === 1).map(Number);
|
|
489
509
|
const walk = (x) => {
|
|
490
510
|
if (!Array.isArray(x))
|
|
491
511
|
return;
|
|
492
512
|
const zoomInput = (input) => Array.isArray(input) && input[0] === 'zoom';
|
|
493
513
|
if ((x[0] === 'interpolate' || x[0] === 'interpolate-hcl' || x[0] === 'interpolate-lab') && zoomInput(x[2])) {
|
|
494
|
-
|
|
495
|
-
zooms.add(
|
|
514
|
+
stopInputs(x).forEach((t) => {
|
|
515
|
+
zooms.add(t);
|
|
516
|
+
});
|
|
496
517
|
}
|
|
497
518
|
else if (x[0] === 'step' && zoomInput(x[1])) {
|
|
498
|
-
|
|
499
|
-
const t = Number(x[i]);
|
|
519
|
+
stopInputs(x).forEach((t) => {
|
|
500
520
|
zooms.add(t);
|
|
501
521
|
zooms.add(t - 0.01);
|
|
502
|
-
}
|
|
522
|
+
});
|
|
503
523
|
}
|
|
504
|
-
|
|
505
|
-
walk(y);
|
|
524
|
+
x.forEach(walk);
|
|
506
525
|
};
|
|
507
526
|
walk(e);
|
|
508
527
|
const finite = [...zooms].filter(Number.isFinite);
|
|
509
528
|
if (finite.length === 0)
|
|
510
529
|
finite.push(0);
|
|
511
530
|
const [lo, hi] = [Math.min(...finite), Math.max(...finite)];
|
|
512
|
-
|
|
513
|
-
finite.push(z);
|
|
531
|
+
finite.push(...Array.from({ length: Math.floor(hi) - Math.ceil(lo) + 1 }, (_, i) => Math.ceil(lo) + i));
|
|
514
532
|
return [...new Set(finite)]
|
|
515
533
|
.sort((a, b) => a - b)
|
|
516
534
|
.map((zoom) => [zoom, Number(evaluate(e, { zoom, properties: {}, type: 'Unknown' }))]);
|
|
517
|
-
}
|
|
535
|
+
};
|
|
518
536
|
//# sourceMappingURL=vectorstyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorstyle.js","sourceRoot":"","sources":["../../src/basemap/vectorstyle.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The parts of the MapLibre style specification a vector basemap needs, evaluated on the page: filters (legacy\n * `[\"==\", \"key\", value]` forms and expressions), property values given as constants, legacy functions (`{ stops }`\n * of zoom or of a property: exponential, interval, categorical, identity) or expressions (`get`, `has`, `concat`,\n * `interpolate`, `step`, `match`, `case`, `coalesce`, comparisons, `all`, `any`, `!`, `in`, `zoom`, arithmetic,\n * `format`, conversions and assertions, `upcase`, `downcase`, `literal`…; others give null, with a warning), colors\n * interpolated in RGBA, `{token}` text fields.\n */\nimport { parseCssColor } from '../util/color.ts';\nimport { isRecord } from '../util/guards.ts';\nimport type { TileFeature, Value } from './mvt.ts';\n\nexport type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\n\nexport interface StyleLayer {\n id: string;\n type: string;\n source?: string;\n 'source-layer'?: string;\n minzoom?: number;\n maxzoom?: number;\n filter?: Json;\n layout?: Record<string, Json>;\n paint?: Record<string, Json>;\n}\n\nexport interface Style {\n version: number;\n sources: Record<\n string,\n { type: string; tiles?: string[]; url?: string; maxzoom?: number; minzoom?: number; tileSize?: number }\n >;\n layers: StyleLayer[];\n glyphs?: string;\n /** One sprite's URL (without extension), or several with their ids (`id:name` names their images) */\n sprite?: string | { id: string; url: string }[];\n}\n\n/** A MapLibre style, as far as the basemap reads it: its sources and its layers (an id and a type each) */\nexport const isStyle = (value: unknown): value is Style =>\n isRecord(value) &&\n isRecord(value.sources) &&\n Object.values(value.sources).every((s) => isRecord(s) && typeof s.type === 'string') &&\n Array.isArray(value.layers) &&\n value.layers.every((l) => isRecord(l) && typeof l.id === 'string' && typeof l.type === 'string');\n\n/** A raster source of a style: its tile URL, its deepest level and the CSS pixels of its tiles (MapLibre's\n * `tileSize`: 512 by default) */\nexport interface RasterSource {\n tiles: string;\n maxzoom: number;\n tileSize: number;\n}\n\n/** How a label's text or icon meets the others (`*-allow-overlap` and `*-ignore-placement`, see `Overlap`) */\nexport type CandidateOverlap = boolean | 'allow' | 'ignore';\n\n/** The icon of a label, in style terms evaluated at the tile's zoom */\nexport interface CandidateIcon {\n /** Its image in the style's sprite */\n image: string;\n /** A number, or zoom stops */\n size: Json;\n anchor: string;\n offset: [number, number];\n rotate: number;\n /** `map` or `viewport` (`auto` resolved) */\n alignment: 'map' | 'viewport';\n overlap: CandidateOverlap;\n optional: boolean;\n fit: 'none' | 'width' | 'height' | 'both';\n padding: [number, number, number, number];\n color: string;\n opacity: number;\n}\n\n/** A label to shape and place, in style terms evaluated at the tile's zoom */\nexport interface LabelCandidate {\n /** Index of its style layer: higher ones are placed first */\n layer: number;\n /** Its text, empty for an icon alone */\n text: string;\n lon: number;\n lat: number;\n /** On a line: the direction there (degrees of longitude and latitude) */\n along?: [number, number];\n /** Its text runs along the line (`symbol-placement: line`, `text-rotation-alignment` not `viewport`) */\n textAlong?: boolean;\n textOptional?: boolean;\n icon?: CandidateIcon;\n font: string;\n size: Json;\n color: string;\n haloColor: string;\n haloWidth: number;\n anchor: string;\n offset: [number, number];\n maxWidth: number;\n lineHeight: number;\n overlap: CandidateOverlap;\n}\n\n/** What expressions see of a feature */\nexport interface Context {\n zoom: number;\n properties: Record<string, Value>;\n /** 'Point', 'LineString' or 'Polygon' */\n type: string;\n}\n\nconst TYPES = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nexport const context = (feature: TileFeature, zoom: number): Context => {\n return { zoom, properties: feature.properties, type: TYPES[feature.type] ?? 'Unknown' };\n};\n\n// ── Colors ──\n\n/** A color to RGBA 0-1, undefined if it is not one */\nexport const color = (value: unknown): [number, number, number, number] | undefined => {\n return parseCssColor(value);\n};\n\nexport const css = ([r, g, b, a]: [number, number, number, number]): string => {\n return `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)},${a})`;\n};\n\n// ── Interpolation ──\n\n/** Factor between two stops: linear, or exponential of `base` */\nconst factor = (x: number, x0: number, x1: number, base = 1): number => {\n const d = x1 - x0;\n\n if (d === 0) return 0;\n\n const t = x - x0;\n\n return base === 1 ? t / d : (base ** t - 1) / (base ** d - 1);\n};\n\nconst mix = (a: unknown, b: unknown, t: number): unknown => {\n if (typeof a === 'number' && typeof b === 'number') return a + (b - a) * t;\n\n const ca = color(a);\n const cb = color(b);\n\n if (ca && cb) {\n const lerp = (i: 0 | 1 | 2 | 3) => ca[i] + (cb[i] - ca[i]) * t;\n\n return css([lerp(0), lerp(1), lerp(2), lerp(3)]);\n }\n if (Array.isArray(a) && Array.isArray(b)) return a.map((v, i) => mix(v, b[i], t));\n\n return t < 0.5 ? a : b;\n};\n\n// ── Legacy functions ──\n\ninterface LegacyFunction {\n stops: [Json, Json][];\n base?: number;\n type?: string;\n property?: string;\n default?: Json;\n}\n\nconst isFunction = (v: Json): v is { [key: string]: Json } & LegacyFunction => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) && Array.isArray(v.stops);\n};\n\nconst legacy = (f: LegacyFunction, ctx: Context): unknown => {\n const input = f.property === undefined ? ctx.zoom : ctx.properties[f.property];\n const stops = f.stops;\n const type =\n f.type ?? (f.property === undefined || typeof stops[0]?.[0] === 'number' ? 'exponential' : 'categorical');\n\n if (type === 'identity') return input ?? f.default;\n if (type === 'categorical') return stops.find(([k]) => k === input)?.[1] ?? f.default;\n if (typeof input !== 'number' || !stops.length) return f.default ?? stops[0]?.[1];\n\n // Zoom-and-property stops ({ zoom, value } keys) are taken at their zoom only\n const key = ([k]: [Json, Json]) => {\n if (Array.isArray(k)) return Number.NaN;\n\n return isRecord(k) ? Number(k.zoom) : Number(k);\n };\n const first = stops[0];\n\n if (!first) return f.default;\n if (input <= key(first)) return first[1];\n\n const at = stops.findIndex((s1, i) => i > 0 && Boolean(stops[i - 1]) && Boolean(s1) && input < key(s1));\n const [s0, s1] = [stops[at - 1], stops[at]];\n\n if (at < 0 || !s0 || !s1) return stops.at(-1)?.[1];\n if (type === 'interval') return s0[1];\n\n return mix(s0[1], s1[1], factor(input, key(s0), key(s1), f.base ?? 1));\n};\n\n// ── Expressions ──\n\n/** A list of values to look a value up in (any value: `includes` compares with `===`) */\nconst labels = (values: readonly Json[]): readonly unknown[] => values;\n\ntype Comparison = '<' | '<=' | '>' | '>=';\n\nconst ORDERS: Record<Comparison, (a: number | string, b: number | string) => boolean> = {\n '<': (a, b) => a < b,\n '<=': (a, b) => a <= b,\n '>': (a, b) => a > b,\n '>=': (a, b) => a >= b,\n};\n\n/** A comparison of any two values the way JavaScript's operators make it: two strings (lists and objects as their\n * text) in text order, anything else as numbers */\nconst compare = (op: Comparison, a: unknown, b: unknown): boolean => {\n const text = (v: unknown) => (typeof v === 'object' && v !== null ? String(v) : v);\n const [x, y] = [text(a), text(b)];\n\n return typeof x === 'string' && typeof y === 'string' ? ORDERS[op](x, y) : ORDERS[op](Number(x), Number(y));\n};\n\nconst get = (ctx: Context, key: unknown): unknown => {\n if (key === '$type') return ctx.type;\n\n return typeof key === 'string' ? ctx.properties[key] : undefined;\n};\n\n/** The operators `evaluate` knows */\nconst OPERATORS = new Set([\n 'literal',\n 'zoom',\n 'get',\n 'has',\n '!has',\n 'properties',\n 'id',\n 'geometry-type',\n 'concat',\n 'format',\n 'image',\n 'number-format',\n 'to-number',\n 'to-string',\n 'to-boolean',\n 'to-color',\n 'number',\n 'string',\n 'boolean',\n 'typeof',\n 'length',\n 'at',\n 'upcase',\n 'downcase',\n 'coalesce',\n '!',\n 'all',\n 'any',\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n 'in',\n 'case',\n 'match',\n 'step',\n 'interpolate',\n 'interpolate-hcl',\n 'interpolate-lab',\n 'rgb',\n 'rgba',\n '+',\n '-',\n '*',\n '/',\n '%',\n '^',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'floor',\n 'ceil',\n 'sqrt',\n 'ln',\n 'log10',\n 'log2',\n 'pi',\n 'e',\n]);\n\n/** Whether a value is an expression (an array starting with a known operator), not a literal array */\nexport const isExpression = (e: unknown): e is Json[] => {\n return Array.isArray(e) && typeof e[0] === 'string' && OPERATORS.has(e[0]);\n};\n\n/** Operators already warned about */\nconst warned = new Set<string>();\n\nconst str = (v: unknown) => (v === undefined || v === null ? '' : String(v));\n\nexport const evaluate = (e: Json, ctx: Context): unknown => {\n if (isFunction(e)) return legacy(e, ctx);\n if (!Array.isArray(e)) return e;\n\n const [op, ...args] = e;\n\n if (typeof op !== 'string') return e;\n\n const ev = (i: number) => evaluate(args[i] ?? null, ctx);\n const num = (i: number) => Number(ev(i));\n const nums = () => args.map((_, i) => num(i));\n\n switch (op) {\n case 'literal':\n return args[0];\n case 'zoom':\n return ctx.zoom;\n case 'get':\n return get(ctx, ev(0));\n case 'has':\n return get(ctx, ev(0)) !== undefined;\n case '!has':\n return get(ctx, ev(0)) === undefined;\n case 'properties':\n return ctx.properties;\n case 'id':\n return null;\n case 'geometry-type':\n return ctx.type;\n case 'concat':\n return args.map((_, i) => str(ev(i))).join('');\n case 'format':\n // Its text sections, the options of each (objects) left out\n return args.map((a, i) => (a !== null && typeof a === 'object' && !Array.isArray(a) ? '' : str(ev(i)))).join('');\n case 'image':\n return ev(0);\n case 'number-format': {\n const options = isRecord(args[1]) ? args[1] : {};\n const option = (key: string) => {\n const v = options[key];\n\n return typeof v === 'number' ? v : undefined;\n };\n const n = num(0);\n\n if (!Number.isFinite(n)) return '';\n\n return n.toLocaleString(typeof options.locale === 'string' ? options.locale : undefined, {\n minimumFractionDigits: option('min-fraction-digits'),\n maximumFractionDigits: option('max-fraction-digits'),\n });\n }\n case 'to-number': {\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n const n = typeof v === 'string' && v.trim() === '' ? Number.NaN : Number(v);\n\n if (v !== null && v !== undefined && !Number.isNaN(n)) return n;\n }\n\n return 0;\n }\n case 'to-string':\n return str(ev(0));\n case 'to-boolean': {\n const v = ev(0);\n\n return !(v === '' || v === 0 || v === false || v === null || v === undefined || Number.isNaN(v));\n }\n case 'to-color':\n case 'number':\n case 'string':\n case 'boolean': {\n // Assertions: the first value of the type, else the last one\n const types: Record<string, (v: unknown) => boolean> = {\n 'to-color': (v) => color(v) !== undefined,\n number: (v) => typeof v === 'number',\n string: (v) => typeof v === 'string',\n boolean: (v) => typeof v === 'boolean',\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n\n if (types[op]?.(v)) return v;\n }\n\n return args.length ? ev(args.length - 1) : null;\n }\n case 'typeof': {\n const v = ev(0);\n\n if (v === null || v === undefined) return 'null';\n\n return Array.isArray(v) ? 'array' : typeof v;\n }\n case 'length': {\n const v = ev(0);\n\n return typeof v === 'string' || Array.isArray(v) ? v.length : 0;\n }\n case 'at': {\n const v = ev(1);\n\n return Array.isArray(v) ? (v[num(0)] ?? null) : null;\n }\n case 'upcase':\n return str(ev(0)).toUpperCase();\n case 'downcase':\n return str(ev(0)).toLowerCase();\n case 'coalesce':\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n\n if (v !== undefined && v !== null) return v;\n }\n\n return null;\n case '!':\n return !ev(0);\n case 'all':\n return args.every((_, i) => Boolean(ev(i)));\n case 'any':\n return args.some((_, i) => Boolean(ev(i)));\n case '==':\n return ev(0) === ev(1);\n case '!=':\n return ev(0) !== ev(1);\n case '<':\n case '<=':\n case '>':\n case '>=':\n return compare(op, ev(0), ev(1));\n case 'in': {\n const haystack = ev(1);\n const needle = ev(0);\n\n if (typeof haystack === 'string') return haystack.includes(String(needle));\n\n return Array.isArray(haystack) && haystack.includes(needle);\n }\n case 'case': {\n const hit = args.findIndex((_, i) => i % 2 === 0 && i + 1 < args.length && Boolean(ev(i)));\n\n return hit < 0 ? ev(args.length - 1) : ev(hit + 1);\n }\n case 'match': {\n const input = ev(0);\n const hit = args.findIndex(\n (label, i) =>\n i % 2 === 1 &&\n i + 1 < args.length &&\n (Array.isArray(label) ? labels(label).includes(input) : label === input),\n );\n\n return hit < 0 ? ev(args.length - 1) : ev(hit + 1);\n }\n case 'step': {\n const input = num(0);\n let out = ev(1);\n\n for (let i = 2; i + 1 < args.length; i += 2) {\n if (input >= Number(args[i])) out = ev(i + 1);\n else break;\n }\n\n return out;\n }\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n const kind = args[0];\n const input = num(1);\n const base = Array.isArray(kind) && kind[0] === 'exponential' ? Number(kind[1]) : 1;\n const stops = Array.from({ length: Math.floor((args.length - 2) / 2) }, (_, k): [number, Json] => [\n Number(args[2 + 2 * k]),\n args[3 + 2 * k] ?? null,\n ]);\n const first = stops[0];\n\n if (!first) return null;\n if (input <= first[0]) return evaluate(first[1], ctx);\n\n const at = stops.findIndex((s1, i) => i > 0 && input < s1[0]);\n const [s0, s1] = [stops[at - 1], stops[at]];\n\n if (at < 0 || !s0 || !s1) return evaluate(stops.at(-1)?.[1] ?? null, ctx);\n\n return mix(evaluate(s0[1], ctx), evaluate(s1[1], ctx), factor(input, s0[0], s1[0], base));\n }\n case 'rgb':\n case 'rgba':\n return css([num(0) / 255, num(1) / 255, num(2) / 255, args.length > 3 ? num(3) : 1]);\n case '+':\n return nums().reduce((a, b) => a + b, 0);\n case '*':\n return nums().reduce((a, b) => a * b, 1);\n case '-':\n return args.length === 1 ? -num(0) : num(0) - num(1);\n case '/':\n return num(0) / num(1);\n case '%':\n return num(0) % num(1);\n case '^':\n return num(0) ** num(1);\n case 'min':\n return Math.min(...nums());\n case 'max':\n return Math.max(...nums());\n case 'abs':\n return Math.abs(num(0));\n case 'round':\n // Half away from zero, as MapLibre\n return Math.sign(num(0)) * Math.round(Math.abs(num(0)));\n case 'floor':\n return Math.floor(num(0));\n case 'ceil':\n return Math.ceil(num(0));\n case 'sqrt':\n return Math.sqrt(num(0));\n case 'ln':\n return Math.log(num(0));\n case 'log10':\n return Math.log10(num(0));\n case 'log2':\n return Math.log2(num(0));\n case 'pi':\n return Math.PI;\n case 'e':\n return Math.E;\n default:\n // Unsupported: no value (a filter drops the feature, a property takes its default)\n if (!warned.has(op)) {\n warned.add(op);\n console.warn(`isard: the style expression \"${op}\" is not supported`);\n }\n\n return null;\n }\n};\n\n// ── Filters ──\n\nconst LEGACY_COMPARISONS = new Set(['==', '!=', '<', '<=', '>', '>=']);\n\n/** Whether a filter (not `all`, `any`, `none`) is in the legacy form: `[\"==\", \"key\", value]`, `[\"in\", \"key\", a, b]`,\n * `[\"has\", \"key\"]`; a key and literal values, as MapLibre tells them from expressions */\nconst isLegacyLeaf = (f: Json[]): boolean => {\n const [op, a, ...rest] = f;\n\n if (typeof op !== 'string' || typeof a !== 'string' || rest.some(Array.isArray)) return false;\n if (LEGACY_COMPARISONS.has(op)) return f.length === 3;\n if (op === 'in') return f.length !== 3 || !Array.isArray(f[2]);\n\n return op === '!in' || op === 'has' || op === '!has';\n};\n\nconst legacyFilter = (f: Json[], ctx: Context): boolean => {\n const [op, key, ...rest] = f;\n const v = get(ctx, key);\n\n switch (op) {\n case '==':\n return v === rest[0];\n case '!=':\n return v !== rest[0];\n case '<':\n case '<=':\n case '>':\n case '>=':\n return compare(op, v, rest[0]);\n case 'in':\n return labels(rest).includes(v);\n case '!in':\n return !labels(rest).includes(v);\n case 'has':\n return v !== undefined;\n case '!has':\n return v === undefined;\n default:\n return true;\n }\n};\n\ntype Test = (ctx: Context) => boolean;\n\n/** Compiled filters, by filter object */\nconst compiled = new WeakMap<Json[], Test>();\n\n/** A filter as a function: `all`, `any`, `none` of their parts, each part legacy or an expression (they may mix) */\nconst compile = (f: Json): Test => {\n if (!Array.isArray(f)) return () => Boolean(f);\n\n const hit = compiled.get(f);\n\n if (hit) return hit;\n\n const make = (): Test => {\n const op = f[0];\n\n if (op === 'all' || op === 'any' || op === 'none') {\n const parts = f.slice(1).map(compile);\n\n if (op === 'all') return (ctx) => parts.every((p) => p(ctx));\n if (op === 'any') return (ctx) => parts.some((p) => p(ctx));\n\n return (ctx) => !parts.some((p) => p(ctx));\n }\n if (isLegacyLeaf(f)) return (ctx) => legacyFilter(f, ctx);\n\n return (ctx) => Boolean(evaluate(f, ctx));\n };\n const test = make();\n\n compiled.set(f, test);\n\n return test;\n};\n\nexport const filter = (f: Json | undefined, ctx: Context): boolean => {\n if (f === undefined || f === null) return true;\n\n return compile(f)(ctx);\n};\n\n/** The operators that read the feature */\nconst FEATURE_OPERATORS: ReadonlySet<unknown> = new Set(['get', 'has', '!has', 'geometry-type', 'properties', 'id']);\n\n/** Whether a value depends on the feature (else only on the zoom, evaluated once per tile) */\nexport const isFeatureDependent = (e: Json | undefined): boolean => {\n if (e !== undefined && isFunction(e)) return e.property !== undefined;\n if (!Array.isArray(e)) return false;\n if (FEATURE_OPERATORS.has(e[0])) return true;\n\n return e.some((x) => isFeatureDependent(x));\n};\n\n/** A `{token}` text field (or an expression) to the text of a feature */\nexport const text = (field: Json | undefined, ctx: Context): string => {\n if (field === undefined || field === null) return '';\n if (typeof field === 'string') {\n return field.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const v = ctx.properties[key];\n\n return v === undefined ? '' : String(v);\n });\n }\n\n const v = evaluate(field, ctx);\n\n if (Array.isArray(v)) {\n // A `format` value: its strings\n return v.filter((x) => typeof x === 'string').join('');\n }\n\n return v === undefined || v === null ? '' : String(v);\n};\n\n/** The font of a label from the first of its `text-font`: a family without its weight takes the regular one */\nexport const labelFont = (font: string): string => {\n return /Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(font) ? font : `${font} Regular`;\n};\n\n/**\n * A value of the zoom only (an expression: `interpolate`, `step` of `[\"zoom\"]`) as stops `[[zoom, value], …]` for the\n * engine, which interpolates them linearly: evaluated at its own stops and at the whole zooms between (an exponential\n * curve followed closely), a step kept sharp just before its threshold\n */\nexport const zoomStops = (e: Json): [number, number][] => {\n const zooms = new Set<number>();\n // The inputs of the stops of an `interpolate` or a `step` (from its fourth argument, one in two)\n const stopInputs = (x: Json[]) => x.filter((_, i) => i >= 3 && i % 2 === 1).map(Number);\n const walk = (x: Json) => {\n if (!Array.isArray(x)) return;\n\n const zoomInput = (input: Json | undefined) => Array.isArray(input) && input[0] === 'zoom';\n\n if ((x[0] === 'interpolate' || x[0] === 'interpolate-hcl' || x[0] === 'interpolate-lab') && zoomInput(x[2])) {\n stopInputs(x).forEach((t) => {\n zooms.add(t);\n });\n } else if (x[0] === 'step' && zoomInput(x[1])) {\n stopInputs(x).forEach((t) => {\n zooms.add(t);\n zooms.add(t - 0.01);\n });\n }\n x.forEach(walk);\n };\n\n walk(e);\n\n const finite = [...zooms].filter(Number.isFinite);\n\n if (finite.length === 0) finite.push(0);\n\n const [lo, hi] = [Math.min(...finite), Math.max(...finite)];\n\n finite.push(...Array.from({ length: Math.floor(hi) - Math.ceil(lo) + 1 }, (_, i) => Math.ceil(lo) + i));\n\n return [...new Set(finite)]\n .sort((a, b) => a - b)\n .map((zoom) => [zoom, Number(evaluate(e, { zoom, properties: {}, type: 'Unknown' }))]);\n};\n"]}
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* Any subset of the style can be drawn on its own raster layer (`raster({ layers })`), at its own place in the stack:
|
|
9
9
|
* rivers from the basemap's data over a flood layer, for instance, restyled with `extraLayers`.
|
|
10
10
|
*/
|
|
11
|
-
import type {
|
|
12
|
-
import type {
|
|
13
|
-
import type {
|
|
14
|
-
import type { GeoMap } from '
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
11
|
+
import type { Feature, Size } from '../layers/features.ts';
|
|
12
|
+
import type { Layer, RasterLayer } from '../layers/layers.ts';
|
|
13
|
+
import type { SymbolLayer } from '../layers/symbols.ts';
|
|
14
|
+
import type { GeoMap } from '../map.ts';
|
|
15
|
+
import type { RasterOptions } from '../types.ts';
|
|
16
|
+
import type { Camera } from '../wasm/isard.js';
|
|
17
|
+
import type { Priority } from '../workers/basemap.worker.ts';
|
|
17
18
|
import { type Json, type LabelCandidate, type RasterSource, type Style, type StyleLayer } from './vectorstyle.ts';
|
|
18
|
-
import type { Camera } from './wasm/isard.js';
|
|
19
19
|
/** OpenFreeMap's styles: OpenStreetMap data in the OpenMapTiles schema, worldwide, free and without a key */
|
|
20
20
|
export declare const OPENFREEMAP_STYLES: {
|
|
21
21
|
readonly positron: "https://tiles.openfreemap.org/styles/positron";
|
|
@@ -49,27 +49,27 @@ export interface VectorTilesOptions {
|
|
|
49
49
|
attribution?: string;
|
|
50
50
|
}
|
|
51
51
|
/** The credits of a known style: OpenFreeMap's, PLAN.IGN's */
|
|
52
|
-
export declare
|
|
52
|
+
export declare const styleAttribution: (style: string | Style) => string | undefined;
|
|
53
53
|
/** Text or icon size of a style (a number, legacy stops, or the stops of a zoom expression made by the worker) as a
|
|
54
54
|
* size for the symbol layer */
|
|
55
|
-
export declare
|
|
55
|
+
export declare const size: (value: Json, fallback?: number) => Size;
|
|
56
56
|
/** Default size of a basemap worker pool: cores - 1, 1 to 4 */
|
|
57
|
-
export declare
|
|
57
|
+
export declare const defaultWorkerCount: () => number;
|
|
58
58
|
/** Default URL of the basemap worker: in the page's assets folder (`isard/vite`), else next to the module */
|
|
59
|
-
export declare
|
|
59
|
+
export declare const defaultWorkerUrl: (assetsUrl?: string | URL) => string | URL;
|
|
60
60
|
/** Fetch priority of a raster tile drawn by the workers: 'high' near the center of the view, at the current zoom or
|
|
61
61
|
* coarser; 'low' far from it or finer (prefetch); 'auto' between */
|
|
62
|
-
export declare
|
|
62
|
+
export declare const tilePriority: (z: number, x: number, y: number, camera: Pick<Camera, "center" | "zoom">) => Priority;
|
|
63
63
|
/** The worker of a vector tile among `count`: always the same one */
|
|
64
|
-
export declare
|
|
64
|
+
export declare const workerIndex: (vz: number, vx: number, vy: number, count: number) => number;
|
|
65
65
|
/** The worker-side key of a renderer: unique across the `VectorTiles` sharing a pool */
|
|
66
|
-
export declare
|
|
66
|
+
export declare const rendererKey: (namespace: string, n: number) => string;
|
|
67
67
|
/** What the pool needs of a worker (a `Worker`, or a stand-in in tests) */
|
|
68
68
|
export type PoolWorker = Pick<Worker, 'postMessage' | 'terminate' | 'onmessage' | 'onerror' | 'onmessageerror'>;
|
|
69
69
|
/** The labels of a vector tile: features by style layer (its index in the style), the higher layers first */
|
|
70
70
|
type TileLabels = [layer: number, features: Feature<LabelCandidate>[]][];
|
|
71
71
|
/** A tile's label candidates as features, by style layer */
|
|
72
|
-
export declare
|
|
72
|
+
export declare const tileLabels: (candidates: readonly LabelCandidate[]) => TileLabels;
|
|
73
73
|
export declare class VectorTiles {
|
|
74
74
|
private readonly map;
|
|
75
75
|
private readonly pool;
|
|
@@ -144,12 +144,12 @@ export declare class VectorTiles {
|
|
|
144
144
|
* layer, the `name` of points as labels. `source` is the style's vector source (`url`: TileJSON or `pmtiles://…`, or
|
|
145
145
|
* `tiles`)
|
|
146
146
|
*/
|
|
147
|
-
export declare
|
|
147
|
+
export declare const basicStyle: (source: {
|
|
148
148
|
url?: string;
|
|
149
149
|
tiles?: string[];
|
|
150
150
|
minzoom?: number;
|
|
151
151
|
maxzoom?: number;
|
|
152
|
-
}, layers: readonly string[])
|
|
152
|
+
}, layers: readonly string[]) => Style;
|
|
153
153
|
/** Options of `GeoMap.addPmtiles` */
|
|
154
154
|
export interface PmtilesOptions {
|
|
155
155
|
/** What the archive holds (default from its header: raster images or vector tiles) */
|
|
@@ -165,5 +165,5 @@ export interface PmtilesOptions {
|
|
|
165
165
|
}
|
|
166
166
|
/** A raster loader reading the tiles of a `pmtiles://` archive URL (images of any size, drawn at `size`); undefined
|
|
167
167
|
* for another URL */
|
|
168
|
-
export declare
|
|
168
|
+
export declare const pmtilesRasterLoader: (url: string, size: number) => RasterOptions["loader"];
|
|
169
169
|
export {};
|