isard 0.2.1 → 0.3.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 +58 -0
- package/README.md +2 -2
- package/dist/animation.d.ts +18 -0
- package/dist/animation.js +84 -0
- package/dist/animation.js.map +1 -0
- package/dist/basemap.worker.d.ts +16 -1
- package/dist/basemap.worker.js +2 -2
- package/dist/basemap.worker.js.map +8 -4
- package/dist/crs.d.ts +72 -0
- package/dist/crs.js +243 -0
- package/dist/crs.js.map +1 -0
- package/dist/decoder.worker.js +4 -4
- package/dist/decoder.worker.js.map +4 -4
- package/dist/engine-loader.d.ts +27 -0
- package/dist/engine-loader.js +112 -0
- package/dist/engine-loader.js.map +1 -0
- package/dist/features.d.ts +8 -0
- package/dist/features.js +17 -10
- package/dist/features.js.map +1 -1
- package/dist/geo.d.ts +16 -0
- package/dist/geo.js +32 -0
- package/dist/geo.js.map +1 -0
- package/dist/geoplateforme.d.ts +21 -5
- package/dist/geoplateforme.js +47 -12
- package/dist/geoplateforme.js.map +1 -1
- package/dist/glyphs.d.ts +10 -3
- package/dist/glyphs.js +14 -2
- package/dist/glyphs.js.map +1 -1
- package/dist/gpx.d.ts +11 -0
- package/dist/gpx.js +74 -0
- package/dist/gpx.js.map +1 -0
- package/dist/grid.d.ts +81 -0
- package/dist/grid.js +270 -0
- package/dist/grid.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +0 -4
- package/dist/interaction.js +8 -4
- package/dist/interaction.js.map +1 -1
- package/dist/isard_bg.wasm +0 -0
- package/dist/isard_core_bg.wasm +0 -0
- package/dist/kml.d.ts +12 -0
- package/dist/kml.js +159 -0
- package/dist/kml.js.map +1 -0
- package/dist/layers.d.ts +1 -1
- package/dist/layers.js +8 -13
- package/dist/layers.js.map +1 -1
- package/dist/lru.d.ts +22 -0
- package/dist/lru.js +52 -0
- package/dist/lru.js.map +1 -0
- package/dist/map.d.ts +16 -4
- package/dist/map.js +72 -302
- package/dist/map.js.map +1 -1
- package/dist/resample.d.ts +41 -0
- package/dist/resample.js +164 -0
- package/dist/resample.js.map +1 -0
- package/dist/settings.d.ts +39 -0
- package/dist/settings.js +104 -0
- package/dist/settings.js.map +1 -0
- package/dist/symbols.d.ts +12 -1
- package/dist/symbols.js +124 -26
- package/dist/symbols.js.map +1 -1
- package/dist/terrain.d.ts +19 -7
- package/dist/terrain.js +40 -28
- package/dist/terrain.js.map +1 -1
- package/dist/topojson.d.ts +29 -0
- package/dist/topojson.js +66 -0
- package/dist/topojson.js.map +1 -0
- package/dist/types.d.ts +12 -4
- package/dist/types.js.map +1 -1
- package/dist/vectortiles.d.ts +10 -3
- package/dist/vectortiles.js +64 -41
- package/dist/vectortiles.js.map +1 -1
- package/dist/wasm/isard.d.ts +9 -3
- package/dist/wasm/isard.js +8 -2
- package/dist/wasm/isard_core.d.ts +1 -1
- package/dist/wasm/isard_core.js +8 -2
- package/dist/wmts.d.ts +14 -0
- package/dist/wmts.js +76 -0
- package/dist/wmts.js.map +1 -0
- package/dist/xml.d.ts +26 -0
- package/dist/xml.js +109 -0
- package/dist/xml.js.map +1 -0
- package/package.json +1 -1
- package/dist/equirectangular.d.ts +0 -35
- package/dist/equirectangular.js +0 -143
- package/dist/equirectangular.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,64 @@
|
|
|
3
3
|
Every notable change of `isard` (published as `@ign-junn/isard` up to 0.1.1). The format follows [Keep a Changelog](https://keepachangelog.com), the
|
|
4
4
|
versions [Semantic Versioning](https://semver.org) (before 1.0.0, a minor version may change an API).
|
|
5
5
|
|
|
6
|
+
## [0.3.0] - 2026-10-18
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- Fill layers share their vertices (the caps index the points of the rings, the walls stand on them) and build the
|
|
11
|
+
prism of the relief only on their first frame in relief: 100,000 pentagons upload 17 MB flat and 49 MB in relief,
|
|
12
|
+
instead of 123 MB either way, and are triangulated in 37 ms instead of 59.
|
|
13
|
+
- Extrusion layers draw only the blocks in view: a batch is sorted by square of a grid over its blocks, as the
|
|
14
|
+
lines and fills are (one batch for a whole city drew every building every frame).
|
|
15
|
+
- The style of the features takes the texels its layer reads: 48 bytes a feature for lines, 96 for circles, 80 for
|
|
16
|
+
extrusions, 16 for fills (128 for all before).
|
|
17
|
+
- The symbol layers keep their tables from one set of labels to the next while they fit (two textures were created
|
|
18
|
+
and deleted at each update, several times a second while the map moves).
|
|
19
|
+
- 3D Tiles: a mesh used by several nodes of a tile is read once, its texture coordinates and triangles shared by its
|
|
20
|
+
instances; an image used by several primitives is handed over and decoded once, and uploaded once (on the main
|
|
21
|
+
thread, or when the decoding workers give the same bitmap); the selection of the tiles reuses its buffers from frame
|
|
22
|
+
to frame.
|
|
23
|
+
- Fill and extrusion layers: a polygon whose rings start before the previous polygon's end takes only those after it
|
|
24
|
+
(no ring shared by two polygons): malformed offsets cost no more than the rings there are.
|
|
25
|
+
- Ground layers: `ISARD_CIRCUMFERENCE`, the body's circumference in metres (`ISARD_EARTH` still works).
|
|
26
|
+
- The basemap's labels are shaped once per vector tile while it is kept: as the view moves, only the labels of the
|
|
27
|
+
tiles coming into view are shaped (an update of 36 tiles of 150 labels after a pan of one column: 55 ms → 11 ms on
|
|
28
|
+
the main thread), the others reused as they were.
|
|
29
|
+
- The Terrarium and Terrain-RGB relief is decoded and the equirectangular rasters are reprojected by the vector
|
|
30
|
+
basemap's workers (OffscreenCanvas), off the main thread; in the page with `workers: false`.
|
|
31
|
+
- The glyph atlas sent again (a new engine, more pages) is sent down to the last glyph of each page only.
|
|
32
|
+
- Equirectangular rasters are reprojected as any other grid (each tile planned in the page through a mesh of 17 × 17
|
|
33
|
+
points, sampled in a worker), their colors interpolated between source rows as along them.
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- `basemapTileSize`: the texture size of the vector basemap's tiles (default 512; 256 for a quarter of the drawing,
|
|
38
|
+
uploads and GPU memory, lines a little softer).
|
|
39
|
+
- Data in other CRSs, reprojected into the map (no new view projection): built-in EPSG:4326, EPSG:3857, Lambert-93
|
|
40
|
+
(EPSG:2154), the CC zones (EPSG:3942 to 3950) and the UTM zones of WGS 84 and ETRS89, within 0.1 mm of PROJ; any
|
|
41
|
+
other through an object with `forward` and `inverse` such as `proj4('EPSG:…')`, directly or named by `registerCrs`;
|
|
42
|
+
`getCrs`, `lambertConformalConic`, `transverseMercator`.
|
|
43
|
+
- Rasters in another tile grid: `addRaster({ url, grid: { crs, matrices, bounds } })` for the tile matrices of a WMTS
|
|
44
|
+
in any CRS, or a grid without matrices for a WMS asked for each tile's `{bbox}` in its CRS; reprojected by the map's
|
|
45
|
+
workers through a mesh of control points, without seams (PLAN IGN from Lambert-93 matches its Web Mercator tiles to
|
|
46
|
+
within 0.06 pixel). `wmtsGrid` and `parseWmtsGrid` read the grid of a layer from WMTS capabilities.
|
|
47
|
+
- Géoplateforme: `geoplateformeWmts(layer, { matrixSet: '2154_10cm_6_20' })` for its Lambert-93 layers (PLAN IGN,
|
|
48
|
+
orthophotos, cadastre…), `geoplateformeWms(layers, { crs: 'EPSG:2154' })`, `geoplateformeWfs(…, { srsName })`.
|
|
49
|
+
- GeoJSON in another CRS: the feature layers reproject a collection whose `crs` member names one (a WFS's output in
|
|
50
|
+
EPSG:2154); `reproject(data, crs)` for the others.
|
|
51
|
+
- `parseKml`, `parseGpx`, `parseTopoJson`: KML (placemarks, MultiGeometry, gx:Track, extended data, style colors), GPX
|
|
52
|
+
(waypoints, routes, tracks with altitudes and times) and TopoJSON as GeoJSON, with their own XML reader (no
|
|
53
|
+
`DOMParser`: in workers too), each a module of its own.
|
|
54
|
+
- The Lambert-93 example: PLAN IGN reprojected from Lambert-93, the arrondissements of Paris from a WFS in EPSG:2154, a
|
|
55
|
+
GPX file.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- Picking in relief: lines, circles and networks hidden by a hill (or by extruded blocks drawn before them) are no
|
|
60
|
+
longer picked: the ground's depth is drawn into the picking pass and the layers are tested against it as on screen.
|
|
61
|
+
- Each frame starts from the full GL state (depth and stencil writes, scissor, tests, blending), whatever a layer or a
|
|
62
|
+
picking pass left.
|
|
63
|
+
|
|
6
64
|
## [0.2.1] - 2026-10-18
|
|
7
65
|
|
|
8
66
|
### Changed
|
package/README.md
CHANGED
|
@@ -94,11 +94,11 @@ Live in the [documentation](https://graffkevin.github.io/isard/examples/), sourc
|
|
|
94
94
|
| Layer | | |
|
|
95
95
|
|---|---|---|
|
|
96
96
|
| [Networks](https://graffkevin.github.io/isard/layers/networks) | `addNetwork` | millions of edges colored by a value per node, worked out per pixel along the edges |
|
|
97
|
-
| [Lines, circles, fills](https://graffkevin.github.io/isard/layers/features) | `addLines`, `addCircles`, `addFills` | GeoJSON styled per feature: zoom stops, functions, values through a ramp, filters |
|
|
97
|
+
| [Lines, circles, fills](https://graffkevin.github.io/isard/layers/features) | `addLines`, `addCircles`, `addFills` | GeoJSON styled per feature: zoom stops, functions, values through a ramp, filters; in any CRS, KML, GPX and TopoJSON parsed |
|
|
98
98
|
| [Labels](https://graffkevin.github.io/isard/layers/labels) | `addSymbols` | SDF fonts (Noto Sans by default, any glyphs), halos, along lines, collisions shared by all layers |
|
|
99
99
|
| [Buildings](https://graffkevin.github.io/isard/layers/buildings) | `addExtrusions` | tiles or one set, colored by values or by a network's times |
|
|
100
100
|
| [Ground shaders](https://graffkevin.github.io/isard/layers/ground) | `addGround` | your fragment shader over the ground: water depth, heat maps |
|
|
101
|
-
| [Rasters](https://graffkevin.github.io/isard/layers/rasters) | `addRaster` | XYZ, WMTS, WMS,
|
|
101
|
+
| [Rasters](https://graffkevin.github.io/isard/layers/rasters) | `addRaster` | XYZ, WMTS, WMS; in Web Mercator, or reprojected from another grid (longitudes and latitudes, Lambert-93, UTM, any CRS through proj4); or tiles drawn by your code |
|
|
102
102
|
| [3D Tiles](https://graffkevin.github.io/isard/layers/tiles3d) | `addTiles3d` | b3dm, glb, external tilesets, compressed or not |
|
|
103
103
|
|
|
104
104
|
Plus markers, popups, controls, picking within a radius, `easeTo`, `flyTo`, a sky and fog for tilted views. All in
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AnimationOptions, FlyToOptions } from './types.ts';
|
|
2
|
+
import type { Camera, Engine } from './wasm/isard.js';
|
|
3
|
+
/** A step of an animation, at `now` (milliseconds, the frame's time): false once done */
|
|
4
|
+
export type Step = (now: number) => boolean;
|
|
5
|
+
/** What a step needs of the engine, read at each frame */
|
|
6
|
+
type Target = () => Pick<Engine, 'setCamera' | 'clearPreload'>;
|
|
7
|
+
/** MapLibre's default easing: cubic Bézier (0.25, 0.1, 0.25, 1) */
|
|
8
|
+
export declare function defaultEasing(t: number): number;
|
|
9
|
+
/** The step of an animated move from `from` to `to`: over `duration` milliseconds (or the options), ease-out by
|
|
10
|
+
* default, the bearing turning the shortest way round */
|
|
11
|
+
export declare function easeTo(engine: Target, from: Camera, to: Camera, options?: number | AnimationOptions): Step;
|
|
12
|
+
/**
|
|
13
|
+
* The step of a flight from `from` to `to` that zooms out on its way and back in (van Wijk and Nuij's optimal path, as
|
|
14
|
+
* MapLibre's `flyTo`): long moves stay readable. Pitch and bearing follow the progress. `viewport`: the larger side of
|
|
15
|
+
* the canvas, CSS pixels.
|
|
16
|
+
*/
|
|
17
|
+
export declare function flyTo(engine: Target, from: Camera, to: Camera, viewport: number, options?: FlyToOptions): Step;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Camera animations: each is a step run every frame by the map (`GeoMap.animate`) until it returns false, setting the
|
|
3
|
+
* camera of the engine in use at that frame (it may be replaced during a flight).
|
|
4
|
+
*/
|
|
5
|
+
import { fromMercator, toMercator } from "./geo.js";
|
|
6
|
+
/** MapLibre's default easing: cubic Bézier (0.25, 0.1, 0.25, 1) */
|
|
7
|
+
export function defaultEasing(t) {
|
|
8
|
+
if (t <= 0 || t >= 1)
|
|
9
|
+
return Math.max(0, Math.min(1, t));
|
|
10
|
+
// Solve x(u) = t for the curve parameter, Newton then bisection
|
|
11
|
+
const [x1, y1, x2, y2] = [0.25, 0.1, 0.25, 1];
|
|
12
|
+
const bezier = (u, a, b) => 3 * a * u * (1 - u) ** 2 + 3 * b * u * u * (1 - u) + u ** 3;
|
|
13
|
+
let u = t;
|
|
14
|
+
for (let i = 0; i < 8; i += 1) {
|
|
15
|
+
const x = bezier(u, x1, x2) - t;
|
|
16
|
+
const dx = 3 * x1 * (1 - u) ** 2 + 6 * (x2 - x1) * u * (1 - u) + 3 * (1 - x2) * u * u;
|
|
17
|
+
if (Math.abs(x) < 1e-6 || dx === 0)
|
|
18
|
+
break;
|
|
19
|
+
u = Math.max(0, Math.min(1, u - x / dx));
|
|
20
|
+
}
|
|
21
|
+
return bezier(u, y1, y2);
|
|
22
|
+
}
|
|
23
|
+
/** The step of an animated move from `from` to `to`: over `duration` milliseconds (or the options), ease-out by
|
|
24
|
+
* default, the bearing turning the shortest way round */
|
|
25
|
+
export function easeTo(engine, from, to, options = 600) {
|
|
26
|
+
const { duration = 600, easing = (t) => 1 - (1 - t) ** 3 } = typeof options === 'number' ? { duration: options } : options;
|
|
27
|
+
// Shortest way round
|
|
28
|
+
const turn = ((to.bearing - from.bearing + 540) % 360) - 180;
|
|
29
|
+
const start = performance.now();
|
|
30
|
+
return (now) => {
|
|
31
|
+
if (now - start >= duration)
|
|
32
|
+
engine().clearPreload();
|
|
33
|
+
const t = duration > 0 ? Math.min(1, (now - start) / duration) : 1;
|
|
34
|
+
const k = easing(t);
|
|
35
|
+
const mix = (a, b) => a + (b - a) * k;
|
|
36
|
+
engine().setCamera(mix(from.center[0], to.center[0]), mix(from.center[1], to.center[1]), mix(from.zoom, to.zoom), mix(from.pitch, to.pitch), from.bearing + turn * k);
|
|
37
|
+
return t < 1;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The step of a flight from `from` to `to` that zooms out on its way and back in (van Wijk and Nuij's optimal path, as
|
|
42
|
+
* MapLibre's `flyTo`): long moves stay readable. Pitch and bearing follow the progress. `viewport`: the larger side of
|
|
43
|
+
* the canvas, CSS pixels.
|
|
44
|
+
*/
|
|
45
|
+
export function flyTo(engine, from, to, viewport, options = {}) {
|
|
46
|
+
const { curve: rho = 1.42, speed = 1.2, easing = defaultEasing } = options;
|
|
47
|
+
const [x0, y0] = toMercator(from.center);
|
|
48
|
+
const [x1, y1] = toMercator(to.center);
|
|
49
|
+
// Across the antimeridian, the short way
|
|
50
|
+
const dx = x1 - x0 - Math.round(x1 - x0);
|
|
51
|
+
const dy = y1 - y0;
|
|
52
|
+
// In pixels at the start zoom (512 px world at zoom 0)
|
|
53
|
+
const world = 512 * 2 ** from.zoom;
|
|
54
|
+
const u1 = Math.hypot(dx, dy) * world;
|
|
55
|
+
const w0 = Math.max(viewport, 1);
|
|
56
|
+
const w1 = w0 / 2 ** (to.zoom - from.zoom);
|
|
57
|
+
const rho2 = rho * rho;
|
|
58
|
+
const r = (i) => {
|
|
59
|
+
const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);
|
|
60
|
+
return Math.log(Math.sqrt(b * b + 1) - b);
|
|
61
|
+
};
|
|
62
|
+
// No move on the ground (or nearly): a plain zoom
|
|
63
|
+
const still = u1 < 1e-6 || !Number.isFinite(r(0)) || !Number.isFinite(r(1));
|
|
64
|
+
const r0 = still ? 0 : r(0);
|
|
65
|
+
const length = still ? Math.abs(Math.log(w1 / w0)) / rho : (r(1) - r0) / rho;
|
|
66
|
+
const width = (s) => still ? Math.exp((w1 < w0 ? -1 : 1) * rho * s) : Math.cosh(r0) / Math.cosh(r0 + rho * s);
|
|
67
|
+
const along = (s) => still ? 0 : (w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2)) / u1;
|
|
68
|
+
const duration = options.duration ?? (1000 * length) / speed;
|
|
69
|
+
const turn = ((to.bearing - from.bearing + 540) % 360) - 180;
|
|
70
|
+
const start = performance.now();
|
|
71
|
+
return (now) => {
|
|
72
|
+
if (now - start >= duration)
|
|
73
|
+
engine().clearPreload();
|
|
74
|
+
const t = duration > 0 ? Math.min(1, (now - start) / duration) : 1;
|
|
75
|
+
const k = easing(t);
|
|
76
|
+
const s = k * length;
|
|
77
|
+
const u = t >= 1 ? 1 : along(s);
|
|
78
|
+
const zoom = t >= 1 ? to.zoom : from.zoom + Math.log2(1 / width(s));
|
|
79
|
+
const [lon, lat] = fromMercator([x0 + dx * u, y0 + dy * u]);
|
|
80
|
+
engine().setCamera(lon, lat, zoom, from.pitch + (to.pitch - from.pitch) * k, from.bearing + turn * k);
|
|
81
|
+
return t < 1;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Camera animations: each is a step run every frame by the map (`GeoMap.animate`) until it returns false, setting the\n * camera of the engine in use at that frame (it may be replaced during a flight).\n */\nimport { fromMercator, toMercator } from './geo.ts';\nimport type { AnimationOptions, FlyToOptions } from './types.ts';\nimport type { Camera, Engine } from './wasm/isard.js';\n\n/** A step of an animation, at `now` (milliseconds, the frame's time): false once done */\nexport type Step = (now: number) => boolean;\n\n/** What a step needs of the engine, read at each frame */\ntype Target = () => Pick<Engine, 'setCamera' | 'clearPreload'>;\n\n/** MapLibre's default easing: cubic Bézier (0.25, 0.1, 0.25, 1) */\nexport function defaultEasing(t: number): number {\n if (t <= 0 || t >= 1) return Math.max(0, Math.min(1, t));\n // Solve x(u) = t for the curve parameter, Newton then bisection\n const [x1, y1, x2, y2] = [0.25, 0.1, 0.25, 1];\n const bezier = (u: number, a: number, b: number) => 3 * a * u * (1 - u) ** 2 + 3 * b * u * u * (1 - u) + u ** 3;\n let u = t;\n for (let i = 0; i < 8; i += 1) {\n const x = bezier(u, x1, x2) - t;\n const dx = 3 * x1 * (1 - u) ** 2 + 6 * (x2 - x1) * u * (1 - u) + 3 * (1 - x2) * u * u;\n if (Math.abs(x) < 1e-6 || dx === 0) break;\n u = Math.max(0, Math.min(1, u - x / dx));\n }\n return bezier(u, y1, y2);\n}\n\n/** The step of an animated move from `from` to `to`: over `duration` milliseconds (or the options), ease-out by\n * default, the bearing turning the shortest way round */\nexport function easeTo(engine: Target, from: Camera, to: Camera, options: number | AnimationOptions = 600): Step {\n const { duration = 600, easing = (t: number) => 1 - (1 - t) ** 3 } =\n typeof options === 'number' ? { duration: options } : options;\n // Shortest way round\n const turn = ((to.bearing - from.bearing + 540) % 360) - 180;\n const start = performance.now();\n return (now) => {\n if (now - start >= duration) engine().clearPreload();\n const t = duration > 0 ? Math.min(1, (now - start) / duration) : 1;\n const k = easing(t);\n const mix = (a: number, b: number) => a + (b - a) * k;\n engine().setCamera(\n mix(from.center[0], to.center[0]),\n mix(from.center[1], to.center[1]),\n mix(from.zoom, to.zoom),\n mix(from.pitch, to.pitch),\n from.bearing + turn * k,\n );\n return t < 1;\n };\n}\n\n/**\n * The step of a flight from `from` to `to` that zooms out on its way and back in (van Wijk and Nuij's optimal path, as\n * MapLibre's `flyTo`): long moves stay readable. Pitch and bearing follow the progress. `viewport`: the larger side of\n * the canvas, CSS pixels.\n */\nexport function flyTo(engine: Target, from: Camera, to: Camera, viewport: number, options: FlyToOptions = {}): Step {\n const { curve: rho = 1.42, speed = 1.2, easing = defaultEasing } = options;\n const [x0, y0] = toMercator(from.center);\n const [x1, y1] = toMercator(to.center);\n // Across the antimeridian, the short way\n const dx = x1 - x0 - Math.round(x1 - x0);\n const dy = y1 - y0;\n // In pixels at the start zoom (512 px world at zoom 0)\n const world = 512 * 2 ** from.zoom;\n const u1 = Math.hypot(dx, dy) * world;\n const w0 = Math.max(viewport, 1);\n const w1 = w0 / 2 ** (to.zoom - from.zoom);\n const rho2 = rho * rho;\n const r = (i: 0 | 1) => {\n const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n return Math.log(Math.sqrt(b * b + 1) - b);\n };\n // No move on the ground (or nearly): a plain zoom\n const still = u1 < 1e-6 || !Number.isFinite(r(0)) || !Number.isFinite(r(1));\n const r0 = still ? 0 : r(0);\n const length = still ? Math.abs(Math.log(w1 / w0)) / rho : (r(1) - r0) / rho;\n const width = (s: number) =>\n still ? Math.exp((w1 < w0 ? -1 : 1) * rho * s) : Math.cosh(r0) / Math.cosh(r0 + rho * s);\n const along = (s: number) =>\n still ? 0 : (w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2)) / u1;\n const duration = options.duration ?? (1000 * length) / speed;\n const turn = ((to.bearing - from.bearing + 540) % 360) - 180;\n const start = performance.now();\n return (now) => {\n if (now - start >= duration) engine().clearPreload();\n const t = duration > 0 ? Math.min(1, (now - start) / duration) : 1;\n const k = easing(t);\n const s = k * length;\n const u = t >= 1 ? 1 : along(s);\n const zoom = t >= 1 ? to.zoom : from.zoom + Math.log2(1 / width(s));\n const [lon, lat] = fromMercator([x0 + dx * u, y0 + dy * u]);\n engine().setCamera(lon, lat, zoom, from.pitch + (to.pitch - from.pitch) * k, from.bearing + turn * k);\n return t < 1;\n };\n}\n"]}
|
package/dist/basemap.worker.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { type Job } from './resample.ts';
|
|
2
|
+
import { type PngEncoding } from './terrain.ts';
|
|
1
3
|
import { type LabelCandidate, type RasterSource, type StyleLayer } from './vectorstyle.ts';
|
|
2
4
|
export type { LabelCandidate, RasterSource };
|
|
3
5
|
/** Fetch priority of a request (`fetch`'s `priority`, a hint to the browser) */
|
|
4
6
|
export type Priority = 'high' | 'low' | 'auto';
|
|
5
|
-
/** A tile's image or labels, asked of a worker
|
|
7
|
+
/** A tile's image or labels, asked of a worker; or a tile of another layer decoded: the altitudes of a PNG relief
|
|
8
|
+
* tile, a Mercator tile reprojected from the source images of its plan (keeping `cached` of them) */
|
|
6
9
|
export type BasemapWork = {
|
|
7
10
|
type: 'render';
|
|
8
11
|
key: string;
|
|
@@ -18,6 +21,15 @@ export type BasemapWork = {
|
|
|
18
21
|
x: number;
|
|
19
22
|
y: number;
|
|
20
23
|
priority?: Priority;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'heights';
|
|
26
|
+
url: string;
|
|
27
|
+
encoding: PngEncoding;
|
|
28
|
+
floor?: number;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'reproject';
|
|
31
|
+
job: Job;
|
|
32
|
+
cached: number;
|
|
21
33
|
};
|
|
22
34
|
export type BasemapRequest = {
|
|
23
35
|
type: 'init';
|
|
@@ -55,6 +67,9 @@ export type BasemapResponse = {
|
|
|
55
67
|
} | {
|
|
56
68
|
id: number;
|
|
57
69
|
labels: LabelCandidate[];
|
|
70
|
+
} | {
|
|
71
|
+
id: number;
|
|
72
|
+
heights: Float32Array;
|
|
58
73
|
};
|
|
59
74
|
export interface Sprite {
|
|
60
75
|
image: ImageBitmap;
|
package/dist/basemap.worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Q{buf;end;pos;constructor(e,n=0,r=e.length){this.buf=e;this.end=r;this.pos=n}varint(){let e=0;for(let n=0;n<70;n+=7){let r=this.buf[this.pos++]??0;if(e+=(r&127)*2**n,r<128)break}return e}int64(){let e=0,n=0;for(let r=0;r<10;r+=1){let i=this.buf[this.pos++]??0,t=i&127;if(r<4)e|=t<<7*r;else if(r===4)e|=(t&15)<<28,n|=t>>4;else n|=t<<7*r-32;if(i<128)break}return(n|0)*4294967296+(e>>>0)}sint(){let e=this.varint();return e%2===1?-(e+1)/2:e/2}sub(){let e=this.varint(),n=Math.min(this.pos+e,this.end),r=new Q(this.buf,this.pos,n);return this.pos=n,r}string(){let e=this.varint(),n=Math.min(this.pos+e,this.end),r=Ae.decode(this.buf.subarray(this.pos,n));return this.pos=n,r}float(){let e=this.pos+4<=this.end?this.view().getFloat32(this.pos,!0):0;return this.pos+=4,e}double(){let e=this.pos+8<=this.end?this.view().getFloat64(this.pos,!0):0;return this.pos+=8,e}view(){return new DataView(this.buf.buffer,this.buf.byteOffset,this.buf.byteLength)}skip(e){if(e===0)this.varint();else if(e===1)this.pos+=8;else if(e===2)this.pos+=this.varint();else if(e===5)this.pos+=4}get more(){return this.pos<this.end}}var Ae=new TextDecoder;function Ce(e){let n="";while(e.more){let r=e.varint();switch(r>>3){case 1:n=e.string();break;case 2:n=e.float();break;case 3:n=e.double();break;case 4:n=e.int64();break;case 5:n=e.varint();break;case 6:n=e.sint();break;case 7:n=e.varint()!==0;break;default:e.skip(r&7)}}return n}function Ne(e){let n=[],r,[i,t]=[0,0];while(e.more){let s=e.varint(),u=s&7,o=s>>3;if(u===7){if(r&&r.length>=2)r.push(r[0]??0,r[1]??0);continue}for(let a=0;a<o&&e.more;a+=1){if(i+=e.sint(),t+=e.sint(),u===1)r=[],n.push(r);r?.push(i,t)}}return n}function ie(e,n){let r=new Map,i=new Q(e);while(i.more){let t=i.varint();if(t>>3!==3){i.skip(t&7);continue}let s=i.sub(),u="",o=4096,a=[],c=[],x=[];while(s.more){let g=s.varint();switch(g>>3){case 1:u=s.string();break;case 2:x.push(s.sub());break;case 3:a.push(s.string());break;case 4:c.push(Ce(s.sub()));break;case 5:o=s.varint();break;default:s.skip(g&7)}}if(n&&!n.has(u))continue;let f=[];for(let g of x){let h=1,v={},L=[];while(g.more){let d=g.varint();switch(d>>3){case 2:{let S=g.sub();while(S.more){let N=a[S.varint()],R=c[S.varint()];if(N!==void 0&&R!==void 0)v[N]=R}break}case 3:h=Math.min(3,Math.max(1,g.varint()));break;case 4:L=Ne(g.sub());break;default:g.skip(d&7)}}f.push({type:h,properties:v,geometry:L})}r.set(u,{extent:o,features:f})}return r}var Re="aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32",E;function Le(e){if(!E){E=new Map;let n=Re.split(" ");for(let r=0;r+1<n.length;r+=2)E.set(n[r],n[r+1])}return E.get(e)}var W=(e)=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):0;function oe(e){if(!/^[0-9a-f]+$/.test(e)||![3,4,6,8].includes(e.length))return;let n=e.length<=4?[...e].map((i)=>i+i).join(""):e,r=(i)=>Number.parseInt(n.slice(i,i+2),16)/255;return[r(0),r(2),r(4),n.length===8?r(6):1]}function Je(e){if(e===void 0)return 1;return W(e.endsWith("%")?Number.parseFloat(e)/100:Number.parseFloat(e))}function Pe(e,n,r){let i=r<0.5?r*(1+n):r+n-r*n,t=2*r-i,s=(u)=>{let o=(u%1+1)%1;if(o<0.16666666666666666)return t+(i-t)*6*o;if(o<0.5)return i;if(o<0.6666666666666666)return t+(i-t)*(0.6666666666666666-o)*6;return t};return[s(e+0.3333333333333333),s(e),s(e-0.3333333333333333)]}function se(e){if(typeof e!=="string")return;let n=e.trim().toLowerCase();if(n.startsWith("#"))return oe(n.slice(1));if(n==="transparent")return[0,0,0,0];let r=Le(n);if(r)return oe(r);let i=/^(rgba?|hsla?)\(([^)]*)\)$/.exec(n);if(!i?.[1]||i[2]===void 0)return;let t=i[2].split(/[\s,/]+/).filter(Boolean);if(t.length<3||t.slice(0,3).some((x)=>Number.isNaN(Number.parseFloat(x))))return;let s=Je(t[3]);if(i[1].startsWith("rgb")){let x=(f)=>W(f.endsWith("%")?Number.parseFloat(f)/100:Number.parseFloat(f)/255);return[x(t[0]),x(t[1]),x(t[2]),s]}let u=Number.parseFloat(t[0])/360,[o,a,c]=Pe(u,W(Number.parseFloat(t[1])/100),W(Number.parseFloat(t[2])/100));return[o,a,c,s]}var Fe=["Unknown","Point","LineString","Polygon"];function X(e,n){return{zoom:n,properties:e.properties,type:Fe[e.type]??"Unknown"}}function B(e){return se(e)}function j([e,n,r,i]){return`rgba(${Math.round(e*255)},${Math.round(n*255)},${Math.round(r*255)},${i})`}function le(e,n,r,i=1){let t=r-n;if(t===0)return 0;let s=e-n;return i===1?s/t:(i**s-1)/(i**t-1)}function Z(e,n,r){if(typeof e==="number"&&typeof n==="number")return e+(n-e)*r;let i=B(e),t=B(n);if(i&&t)return j([0,1,2,3].map((s)=>(i[s]??0)+((t[s]??0)-(i[s]??0))*r));if(Array.isArray(e)&&Array.isArray(n))return e.map((s,u)=>Z(s,n[u],r));return r<0.5?e:n}function ce(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)&&Array.isArray(e.stops)}function ze(e,n){let r=e.property===void 0?n.zoom:n.properties[e.property],i=e.stops,t=e.type??(e.property===void 0||typeof i[0]?.[0]==="number"?"exponential":"categorical");if(t==="identity")return r??e.default;if(t==="categorical")return i.find(([o])=>o===r)?.[1]??e.default;if(typeof r!=="number"||!i.length)return e.default??i[0]?.[1];let s=(o)=>typeof o[0]==="object"&&o[0]!==null?Number(o[0].zoom):Number(o[0]),u=i[0];if(!u)return e.default;if(r<=s(u))return u[1];for(let o=1;o<i.length;o+=1){let[a,c]=[i[o-1],i[o]];if(!a||!c)continue;if(r<s(c)){if(t==="interval")return a[1];return Z(a[1],c[1],le(r,s(a),s(c),e.base??1))}}return i.at(-1)?.[1]}function V(e,n){if(n==="$type")return e.type;return typeof n==="string"?e.properties[n]:void 0}var Te=new Set(["literal","zoom","get","has","!has","properties","id","geometry-type","concat","format","image","number-format","to-number","to-string","to-boolean","to-color","number","string","boolean","typeof","length","at","upcase","downcase","coalesce","!","all","any","==","!=","<","<=",">",">=","in","case","match","step","interpolate","interpolate-hcl","interpolate-lab","rgb","rgba","+","-","*","/","%","^","min","max","abs","round","floor","ceil","sqrt","ln","log10","log2","pi","e"]);function ee(e){return Array.isArray(e)&&typeof e[0]==="string"&&Te.has(e[0])}var ae=new Set,O=(e)=>e===void 0||e===null?"":String(e);function J(e,n){if(ce(e))return ze(e,n);if(!Array.isArray(e))return e;let[r,...i]=e;if(typeof r!=="string")return e;let t=(o)=>J(i[o]??null,n),s=(o)=>Number(t(o)),u=()=>i.map((o,a)=>s(a));switch(r){case"literal":return i[0];case"zoom":return n.zoom;case"get":return V(n,t(0));case"has":return V(n,t(0))!==void 0;case"!has":return V(n,t(0))===void 0;case"properties":return n.properties;case"id":return null;case"geometry-type":return n.type;case"concat":return i.map((o,a)=>O(t(a))).join("");case"format":return i.map((o,a)=>o!==null&&typeof o==="object"&&!Array.isArray(o)?"":O(t(a))).join("");case"image":return t(0);case"number-format":{let o=i[1]??{},a=s(0);if(!Number.isFinite(a))return"";return a.toLocaleString(o.locale,{minimumFractionDigits:o["min-fraction-digits"],maximumFractionDigits:o["max-fraction-digits"]})}case"to-number":{for(let o=0;o<i.length;o+=1){let a=t(o),c=typeof a==="string"&&a.trim()===""?Number.NaN:Number(a);if(a!==null&&a!==void 0&&!Number.isNaN(c))return c}return 0}case"to-string":return O(t(0));case"to-boolean":{let o=t(0);return!(o===""||o===0||o===!1||o===null||o===void 0||Number.isNaN(o))}case"to-color":case"number":case"string":case"boolean":{let o={"to-color":(a)=>B(a)!==void 0,number:(a)=>typeof a==="number",string:(a)=>typeof a==="string",boolean:(a)=>typeof a==="boolean"};for(let a=0;a<i.length;a+=1){let c=t(a);if(o[r]?.(c))return c}return i.length?t(i.length-1):null}case"typeof":{let o=t(0);if(o===null||o===void 0)return"null";return Array.isArray(o)?"array":typeof o}case"length":{let o=t(0);return typeof o==="string"||Array.isArray(o)?o.length:0}case"at":{let o=t(1);return Array.isArray(o)?o[s(0)]??null:null}case"upcase":return O(t(0)).toUpperCase();case"downcase":return O(t(0)).toLowerCase();case"coalesce":for(let o=0;o<i.length;o+=1){let a=t(o);if(a!==void 0&&a!==null)return a}return null;case"!":return!t(0);case"all":return i.every((o,a)=>Boolean(t(a)));case"any":return i.some((o,a)=>Boolean(t(a)));case"==":return t(0)===t(1);case"!=":return t(0)!==t(1);case"<":return t(0)<t(1);case"<=":return t(0)<=t(1);case">":return t(0)>t(1);case">=":return t(0)>=t(1);case"in":{let o=t(1),a=t(0);if(typeof o==="string")return o.includes(String(a));return Array.isArray(o)&&o.includes(a)}case"case":{for(let o=0;o+1<i.length;o+=2)if(t(o))return t(o+1);return t(i.length-1)}case"match":{let o=t(0);for(let a=1;a+1<i.length;a+=2){let c=i[a];if(Array.isArray(c)?c.includes(o):c===o)return t(a+1)}return t(i.length-1)}case"step":{let o=s(0),a=t(1);for(let c=2;c+1<i.length;c+=2)if(o>=Number(i[c]))a=t(c+1);else break;return a}case"interpolate":case"interpolate-hcl":case"interpolate-lab":{let o=i[0],a=s(1),c=Array.isArray(o)&&o[0]==="exponential"?Number(o[1]):1,x=[];for(let g=2;g+1<i.length;g+=2)x.push([Number(i[g]),i[g+1]??null]);let f=x[0];if(!f)return null;if(a<=f[0])return J(f[1],n);for(let g=1;g<x.length;g+=1){let[h,v]=[x[g-1],x[g]];if(h&&v&&a<v[0])return Z(J(h[1],n),J(v[1],n),le(a,h[0],v[0],c))}return J(x.at(-1)?.[1]??null,n)}case"rgb":case"rgba":return j([s(0)/255,s(1)/255,s(2)/255,i.length>3?s(3):1]);case"+":return u().reduce((o,a)=>o+a,0);case"*":return u().reduce((o,a)=>o*a,1);case"-":return i.length===1?-s(0):s(0)-s(1);case"/":return s(0)/s(1);case"%":return s(0)%s(1);case"^":return s(0)**s(1);case"min":return Math.min(...u());case"max":return Math.max(...u());case"abs":return Math.abs(s(0));case"round":return Math.sign(s(0))*Math.round(Math.abs(s(0)));case"floor":return Math.floor(s(0));case"ceil":return Math.ceil(s(0));case"sqrt":return Math.sqrt(s(0));case"ln":return Math.log(s(0));case"log10":return Math.log10(s(0));case"log2":return Math.log2(s(0));case"pi":return Math.PI;case"e":return Math.E;default:if(!ae.has(r))ae.add(r),console.warn(`isard: the style expression "${r}" is not supported`);return null}}var Ie=new Set(["==","!=","<","<=",">",">="]);function Be(e){let[n,r,...i]=e;if(typeof n!=="string"||typeof r!=="string"||i.some(Array.isArray))return!1;if(Ie.has(n))return e.length===3;if(n==="in")return e.length!==3||!Array.isArray(e[2]);return n==="!in"||n==="has"||n==="!has"}function Oe(e,n){let[r,i,...t]=e,s=V(n,i);switch(r){case"==":return s===t[0];case"!=":return s!==t[0];case"<":return s<t[0];case"<=":return s<=t[0];case">":return s>t[0];case">=":return s>=t[0];case"in":return t.includes(s);case"!in":return!t.includes(s);case"has":return s!==void 0;case"!has":return s===void 0;default:return!0}}var ue=new WeakMap;function fe(e){if(!Array.isArray(e))return()=>Boolean(e);let n=ue.get(e);if(n)return n;let r,i=e[0];if(i==="all"||i==="any"||i==="none"){let t=e.slice(1).map(fe);if(i==="all")r=(s)=>t.every((u)=>u(s));else if(i==="any")r=(s)=>t.some((u)=>u(s));else r=(s)=>!t.some((u)=>u(s))}else if(Be(e))r=(t)=>Oe(e,t);else r=(t)=>Boolean(J(e,t));return ue.set(e,r),r}function te(e,n){if(e===void 0||e===null)return!0;return fe(e)(n)}function U(e){if(e!==void 0&&ce(e))return e.property!==void 0;if(!Array.isArray(e))return!1;if(["get","has","!has","geometry-type","properties","id"].includes(e[0]))return!0;return e.some((n)=>U(n))}function me(e,n){if(e===void 0||e===null)return"";if(typeof e==="string")return e.replace(/\{([^}]+)\}/g,(i,t)=>{let s=n.properties[t];return s===void 0?"":String(s)});let r=J(e,n);if(Array.isArray(r))return r.filter((i)=>typeof i==="string").join("");return r===void 0||r===null?"":String(r)}function de(e){return/Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(e)?e:`${e} Regular`}function pe(e){let n=new Set,r=(u)=>{if(!Array.isArray(u))return;let o=(a)=>Array.isArray(a)&&a[0]==="zoom";if((u[0]==="interpolate"||u[0]==="interpolate-hcl"||u[0]==="interpolate-lab")&&o(u[2]))for(let a=3;a<u.length;a+=2)n.add(Number(u[a]));else if(u[0]==="step"&&o(u[1]))for(let a=3;a<u.length;a+=2){let c=Number(u[a]);n.add(c),n.add(c-0.01)}for(let a of u)r(a)};r(e);let i=[...n].filter(Number.isFinite);if(i.length===0)i.push(0);let[t,s]=[Math.min(...i),Math.max(...i)];for(let u=Math.ceil(t);u<=Math.floor(s);u+=1)i.push(u);return[...new Set(i)].sort((u,o)=>u-o).map((u)=>[u,Number(J(e,{zoom:u,properties:{},type:"Unknown"}))])}var _=new Map,P=new Map,be=96,ge=be;function qe(e){return Math.max(16,Math.ceil(be/Math.max(1,e)))}var ne=new Set,q=new Set,F=new Map,De=64;function Ee(e,n="auto"){let r=F.get(e);if(r)return F.delete(e),F.set(e,r),r;let i=(async()=>{let s=await fetch(e,{priority:n});if(s.status===404||s.status===204)return;if(!s.ok)throw Error(`${e}: ${s.status}`);return createImageBitmap(await s.blob())})();i.catch(()=>F.delete(e)),F.set(e,i);while(F.size>De){let[t,s]=F.entries().next().value??[];if(t===void 0||s===void 0)break;F.delete(t),s.then((u)=>setTimeout(()=>u?.close(),0),()=>{return})}return i}function he(e,n="auto"){let r=P.get(e);if(r)return P.delete(e),P.set(e,r),r;let i=(async()=>{for(let t=0;;t+=1){let u=await fetch(e,{priority:n});if(u.status===404||u.status===204)return;if(u.ok)return ie(new Uint8Array(await u.arrayBuffer()));if(t>=2)throw Error(`${e}: ${u.status}`);await new Promise((o)=>setTimeout(o,400*(t+1)))}})();i.catch(()=>P.delete(e)),P.set(e,i);while(P.size>ge){let t=P.keys().next().value;if(t===void 0)break;P.delete(t)}return i}function We(e,n,r,i){let t=Math.max(0,Math.min(n-1,e.maxzoom)),s=n-t,u=2**Math.max(0,s),[o,a]=s>=0?[Math.floor(r/u),Math.floor(i/u)]:[r,i],c=e.tiles.replace("{z}",String(t)).replace("{x}",String(o)).replace("{y}",String(a)),x=1/u;return{url:c,vz:t,vx:o,vy:a,part:x,ox:r%u*x,oy:i%u*x}}var A=(e,n,r,i,t)=>{let s=e[n]?.[r];if(s===void 0)return t;let u=Array.isArray(s)&&!ee(s)?s:J(s,i);return u===void 0||u===null?t:u};function z(e,n){let r=B(e)??[0,0,0,1];return j([r[0],r[1],r[2],r[3]*n])}function ye(e,n){if(e.layout?.visibility==="none")return!1;return n>=(e.minzoom??0)&&n<(e.maxzoom??24)}function $e(e,n){if(e.patterns.has(n))return e.patterns.get(n);let r=e.sprite?.icons[n],i;if(e.sprite&&r&&r.width>0&&r.height>0)i=new OffscreenCanvas(r.width,r.height),i.getContext("2d")?.drawImage(e.sprite.image,r.x,r.y,r.width,r.height,0,0,r.width,r.height);return e.patterns.set(n,i),i}var re=new Map;function Ve(e){let n=re.get(e)?.pop()??new OffscreenCanvas(e,e),r=n.getContext("2d",{willReadFrequently:!0});if(!r)throw Error("no 2D context");return r.setTransform(1,0,0,1,0,0),r.globalAlpha=1,r.setLineDash([]),r.clearRect(0,0,e,e),{canvas:n,g:r}}function je(e){let n=re.get(e.width)??[];if(re.set(e.width,n),n.length<4)n.push(e)}function Ue(e,n,r){if(r)return Promise.resolve(e.transferToImageBitmap());return createImageBitmap(n.getImageData(0,0,e.width,e.height),{premultiplyAlpha:"none"})}async function _e(e,n,r,i,t,s,u){let o=We(e,n,r,i),a=await he(o.url,u);if(q.has(s))return;let{canvas:c,g:x}=Ve(t);try{return await He(e,o,a,c,x,n,r,i,t,s,u)}finally{je(c)}}async function He(e,n,r,i,t,s,u,o,a,c,x){let f=e.sprite,g=Math.max(0,s-1),h=a/256,v=!1,L=!1;for(let d of e.layers){if(!ye(d,g))continue;let S={zoom:g,properties:{},type:"Unknown"};if(d.type==="background"){let b=A(d,"paint","background-color",S,"#000"),l=Number(A(d,"paint","background-opacity",S,1));if(t.fillStyle=z(b,l),t.fillRect(0,0,a,a),(B(b)??[0,0,0,1])[3]*l>=1)L=!0;v=!0;continue}if(d.type==="raster"){let b=d.source===void 0?void 0:e.rasters[d.source];if(!b)continue;let l=Math.max(0,Math.min(s-(b.tileSize>=512?1:0),b.maxzoom)),m=2**(s-l),p=b.tiles.replace("{z}",String(l)).replace("{x}",String(Math.floor(u/m))).replace("{y}",String(Math.floor(o/m))),w=await Ee(p,x).catch(()=>{return});if(q.has(c))return;if(!w)continue;let[k,M]=[w.width/m,w.height/m];t.globalAlpha=Number(A(d,"paint","raster-opacity",S,1)),t.drawImage(w,u%m*k,o%m*M,k,M,0,0,a,a),t.globalAlpha=1,v=!0;continue}let N=r?.get(d["source-layer"]??"");if(!N)continue;let R=a/(N.extent*n.part),[D,T]=[n.ox*N.extent,n.oy*N.extent],I=(b,l)=>{t.beginPath();for(let m of b.geometry){for(let p=0;p+1<m.length;p+=2){let[w,k]=[((m[p]??0)-D)*R,((m[p+1]??0)-T)*R];if(p===0)t.moveTo(w,k);else t.lineTo(w,k)}if(l)t.closePath()}},C=new Map,y=(b,l,m,p)=>{let w=C.get(l);if(w===void 0)w=U(d[b]?.[l]),C.set(l,w);return A(d,b,l,w?m:S,p)};for(let b of N.features){let l=X(b,g);if(!te(d.filter,l))continue;if(d.type==="fill-extrusion"&&b.type===3)I(b,!0),t.fillStyle=z(y("paint","fill-extrusion-color",l,"#000"),Number(y("paint","fill-extrusion-opacity",l,1))),t.fill("evenodd"),v=!0;else if(d.type==="fill"&&b.type===3){let m=Number(y("paint","fill-opacity",l,1)),p=y("paint","fill-pattern",l,void 0);I(b,!0);let w=typeof p==="string"?f?.icons[p]:void 0,k=w&&$e(e,p);if(w&&k){let M=t.createPattern(k,"repeat");if(M)M.setTransform(new DOMMatrix().scale(h/(w.pixelRatio??1))),t.globalAlpha=m,t.fillStyle=M,t.fill("evenodd"),t.globalAlpha=1}else{t.fillStyle=z(y("paint","fill-color",l,"#000"),m),t.fill("evenodd");let M=y("paint","fill-outline-color",l,void 0);if(M!==void 0)t.strokeStyle=z(M,m),t.lineWidth=h,t.setLineDash([]),t.stroke()}v=!0}else if(d.type==="line"&&b.type!==1){let m=Number(y("paint","line-width",l,1));if(m<=0)continue;let p=Number(y("paint","line-gap-width",l,0));t.strokeStyle=z(y("paint","line-color",l,"#000"),Number(y("paint","line-opacity",l,1))),t.lineWidth=(p>0?p+2*m:m)*h,t.lineCap=String(y("layout","line-cap",l,"butt")),t.lineJoin=String(y("layout","line-join",l,"miter"));let w=y("paint","line-dasharray",l,void 0);t.setLineDash(Array.isArray(w)?w.map((k)=>Number(k)*m*h):[]),I(b,b.type===3),t.stroke(),v=!0}else if(d.type==="circle"&&b.type===1){let m=Number(y("paint","circle-radius",l,5))*h;t.fillStyle=z(y("paint","circle-color",l,"#000"),Number(y("paint","circle-opacity",l,1)));let p=Number(y("paint","circle-stroke-width",l,0))*h;t.strokeStyle=z(y("paint","circle-stroke-color",l,"#000"),Number(y("paint","circle-stroke-opacity",l,1))),t.lineWidth=p;for(let w of b.geometry)for(let k=0;k+1<w.length;k+=2)if(t.beginPath(),t.arc(((w[k]??0)-D)*R,((w[k+1]??0)-T)*R,m,0,2*Math.PI),t.fill(),p>0)t.stroke();v=!0}}}if(!v&&!r)return null;return Ue(i,t,L)}function Ge(e){let{layout:n={},paint:r={}}=e;return n["icon-image"]!==void 0&&r["text-halo-width"]===void 0&&r["text-halo-color"]===void 0&&n["text-offset"]===void 0&&(n["text-anchor"]??"center")==="center"}function H(e,n,r,i,t,s){let u=2**e,o=(n+t/i)/u,a=(r+s/i)/u;return[o*360-180,Math.atan(Math.sinh(Math.PI*(1-2*a)))*180/Math.PI]}async function Ye(e,n,r,i,t,s){let u=e.tiles.replace("{z}",String(n)).replace("{x}",String(r)).replace("{y}",String(i)),o=await he(u,s);if(!o||q.has(t))return[];let a=[],c=new Map,x=(f)=>{let g=c.get(f);if(g===void 0){let h=f.layout?.["text-size"]??16;g=ee(h)?pe(h):h,c.set(f,g)}return g};return e.layers.forEach((f,g)=>{if(f.type!=="symbol"||!ye(f,n)||f.layout?.["text-field"]===void 0)return;if(Ge(f))return;let h=o.get(f["source-layer"]??"");if(!h)return;let v=f.layout?.["symbol-placement"]==="line"?"line":"point";for(let L of h.features){let d=X(L,n);if(!te(f.filter,d))continue;let S=me(f.layout?.["text-field"],d).trim();if(!S)continue;let N=A(f,"layout","text-transform",d,"none");if(N==="uppercase")S=S.toUpperCase();else if(N==="lowercase")S=S.toLowerCase();let R=A(f,"layout","text-font",d,["Noto Sans Regular"]),D=de(Array.isArray(R)&&typeof R[0]==="string"?R[0]:"Noto Sans Regular"),T=A(f,"layout","text-offset",d,[0,0]),I={layer:g,text:S,font:D,size:U(f.layout?.["text-size"])?Number(A(f,"layout","text-size",d,16)):x(f),color:String(A(f,"paint","text-color",d,"#000")),haloColor:String(A(f,"paint","text-halo-color",d,"rgba(0,0,0,0)")),haloWidth:Number(A(f,"paint","text-halo-width",d,0)),anchor:String(A(f,"layout","text-anchor",d,"center")),offset:Array.isArray(T)?[Number(T[0]??0),Number(T[1]??0)]:[0,0],maxWidth:Number(A(f,"layout","text-max-width",d,10)),lineHeight:Number(A(f,"layout","text-line-height",d,1.2)),overlap:Boolean(A(f,"layout","text-allow-overlap",d,!1))};if(L.type===1)for(let C of L.geometry)for(let y=0;y+1<C.length;y+=2){let[b,l]=[C[y]??0,C[y+1]??0];if(b<0||l<0||b>=h.extent||l>=h.extent)continue;let[m,p]=H(n,r,i,h.extent,b,l);a.push({...I,lon:m,lat:p})}else{let C,y=0;for(let l of L.geometry){let m=0;for(let p=2;p+1<l.length;p+=2)m+=Math.hypot((l[p]??0)-(l[p-2]??0),(l[p+1]??0)-(l[p-1]??0));if(m>y)y=m,C=l}if(!C||y<h.extent/32)continue;let b=y/2;for(let l=2;l+1<C.length;l+=2){let[m,p,w,k]=[C[l-2]??0,C[l-1]??0,C[l]??0,C[l+1]??0],M=Math.hypot(w-m,k-p);if(M>=b&&M>0){let[Y,K]=[m+(w-m)*b/M,p+(k-p)*b/M];if(Y<0||K<0||Y>=h.extent||K>=h.extent)break;let[we,xe]=H(n,r,i,h.extent,Y,K),[ke,ve]=H(n,r,i,h.extent,w,k),[Se,Me]=H(n,r,i,h.extent,m,p);a.push({...I,lon:we,lat:xe,...v==="line"?{along:[ke-Se,ve-Me]}:{}});break}b-=M}}}}),a}var G=(e,n=[])=>self.postMessage(e,n);self.onmessage=async({data:e})=>{if(e.type==="init"){if(e.workers!==void 0)ge=qe(e.workers);_.set(e.key,{tiles:e.tiles,maxzoom:e.maxzoom,layers:e.layers,rasters:e.rasters??{},sprite:e.sprite,patterns:new Map});return}if(e.type==="drop"){_.get(e.key)?.sprite?.image.close(),_.delete(e.key);return}if(e.type==="abort"){if(ne.has(e.id))q.add(e.id);return}ne.add(e.id);let n=_.get(e.key);try{if(!n)throw Error(`no renderer ${e.key}`);if(e.type==="render"){let r=await _e(n,e.z,e.x,e.y,e.size,e.id,e.priority);if(r)G({id:e.id,image:r},[r]);else G({id:e.id,missing:!0})}else G({id:e.id,labels:await Ye(n,e.z,e.x,e.y,e.id,e.priority)})}catch(r){G({id:e.id,error:String(r)})}finally{ne.delete(e.id),q.delete(e.id)}};export{qe as cacheShare,Ue as tileImage};
|
|
1
|
+
function pe(e){return e*360-180}function de(e){return Math.atan(Math.sinh(Math.PI*(1-2*e)))*180/Math.PI}class W{capacity;evict;entries=new Map;constructor(e,t){this.capacity=e;this.evict=t}get size(){return this.entries.size}get(e){let t=this.entries.get(e);if(t!==void 0)this.entries.delete(e),this.entries.set(e,t);return t}has(e){return this.entries.has(e)}set(e,t){this.entries.delete(e),this.entries.set(e,t);for(let[n,o]of this.entries){if(this.entries.size<=this.capacity)break;this.entries.delete(n),this.evict?.(o,n)}}delete(e){return this.entries.delete(e)}values(){return this.entries.values()}clear(){this.entries.clear()}}class oe{buf;end;pos;constructor(e,t=0,n=e.length){this.buf=e;this.end=n;this.pos=t}varint(){let e=0;for(let t=0;t<70;t+=7){let n=this.buf[this.pos++]??0;if(e+=(n&127)*2**t,n<128)break}return e}int64(){let e=0,t=0;for(let n=0;n<10;n+=1){let o=this.buf[this.pos++]??0,r=o&127;if(n<4)e|=r<<7*n;else if(n===4)e|=(r&15)<<28,t|=r>>4;else t|=r<<7*n-32;if(o<128)break}return(t|0)*4294967296+(e>>>0)}sint(){let e=this.varint();return e%2===1?-(e+1)/2:e/2}sub(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=new oe(this.buf,this.pos,t);return this.pos=t,n}string(){let e=this.varint(),t=Math.min(this.pos+e,this.end),n=Je.decode(this.buf.subarray(this.pos,t));return this.pos=t,n}float(){let e=this.pos+4<=this.end?this.view().getFloat32(this.pos,!0):0;return this.pos+=4,e}double(){let e=this.pos+8<=this.end?this.view().getFloat64(this.pos,!0):0;return this.pos+=8,e}view(){return new DataView(this.buf.buffer,this.buf.byteOffset,this.buf.byteLength)}skip(e){if(e===0)this.varint();else if(e===1)this.pos+=8;else if(e===2)this.pos+=this.varint();else if(e===5)this.pos+=4}get more(){return this.pos<this.end}}var Je=new TextDecoder;function Fe(e){let t="";while(e.more){let n=e.varint();switch(n>>3){case 1:t=e.string();break;case 2:t=e.float();break;case 3:t=e.double();break;case 4:t=e.int64();break;case 5:t=e.varint();break;case 6:t=e.sint();break;case 7:t=e.varint()!==0;break;default:e.skip(n&7)}}return t}function Ee(e){let t=[],n,[o,r]=[0,0];while(e.more){let i=e.varint(),u=i&7,s=i>>3;if(u===7){if(n&&n.length>=2)n.push(n[0]??0,n[1]??0);continue}for(let a=0;a<s&&e.more;a+=1){if(o+=e.sint(),r+=e.sint(),u===1)n=[],t.push(n);n?.push(o,r)}}return t}function be(e,t){let n=new Map,o=new oe(e);while(o.more){let r=o.varint();if(r>>3!==3){o.skip(r&7);continue}let i=o.sub(),u="",s=4096,a=[],l=[],m=[];while(i.more){let p=i.varint();switch(p>>3){case 1:u=i.string();break;case 2:m.push(i.sub());break;case 3:a.push(i.string());break;case 4:l.push(Fe(i.sub()));break;case 5:s=i.varint();break;default:i.skip(p&7)}}if(t&&!t.has(u))continue;let f=[];for(let p of m){let y=1,v={},I=[];while(p.more){let d=p.varint();switch(d>>3){case 2:{let x=p.sub();while(x.more){let A=a[x.varint()],P=l[x.varint()];if(A!==void 0&&P!==void 0)v[A]=P}break}case 3:y=Math.min(3,Math.max(1,p.varint()));break;case 4:I=Ee(p.sub());break;default:p.skip(d&7)}}f.push({type:y,properties:v,geometry:I})}n.set(u,{extent:s,features:f})}return n}var Te=96;function ze(e,t,n,o,r,i){let u=new Uint8ClampedArray(i*i*4),s=i/r,a=r+1;for(let l=0;l<i;l+=1){let m=(l+0.5)/s,f=Math.min(r-1,Math.floor(m)),p=m-f;for(let y=0;y<i;y+=1){let v=(y+0.5)/s,I=Math.min(r-1,Math.floor(v)),d=v-I,x=2*(f*a+I),A=x+2*a,P=(1-d)*(1-p),z=d*(1-p),L=(1-d)*p,J=d*p,C=P*o[x]+z*o[x+2]+L*o[A]+J*o[A+2],w=P*o[x+1]+z*o[x+3]+L*o[A+1]+J*o[A+3],b=C-0.5,c=w-0.5;if(!(b>-1&&c>-1&&b<t&&c<n))continue;let g=Math.floor(b),h=Math.floor(c),k=b-g,S=c-h,M=0,D=0,O=0,E=0;for(let T=0;T<4;T+=1){let _=g+(T&1),j=h+(T>>1);if(_<0||j<0||_>=t||j>=n)continue;let V=4*(j*t+_),K=(T&1?k:1-k)*(T>>1?S:1-S)*e[V+3];M+=K*e[V],D+=K*e[V+1],O+=K*e[V+2],E+=K}if(E<=0)continue;let q=4*(l*i+y);u[q]=M/E,u[q+1]=D/E,u[q+2]=O/E,u[q+3]=E}}return u}function ge(e=Te){let t=new Map,n=new Set,o=(l)=>{n.delete(l),l.then((m)=>m?.close(),()=>{return})},r=(l)=>{if(t.has(l))n.add(l);else o(l)},i=new W(e,r),u=(l)=>{let m=(t.get(l)??1)-1;if(m>0)t.set(l,m);else if(t.delete(l),n.has(l))o(l)},s=(l)=>{let m=i.get(l);if(!m)m=(async()=>{let f=await fetch(l);if(f.status===404||f.status===204||f.status===410)return null;if(!f.ok)throw Error(`isard: ${f.status} for a raster to reproject`);return createImageBitmap(await f.blob())})(),m.catch(()=>i.delete(l)),i.set(l,m);return t.set(m,(t.get(m)??0)+1),m};return{draw:async(l,m)=>{let f=l.sources.map((p)=>[p,s(p.url)]);try{let p=await Promise.all(f.map(async([x,A])=>[x,await A]));if(m.throwIfAborted(),!p.some(([,x])=>x))return null;let v=new OffscreenCanvas(l.width,l.height).getContext("2d",{willReadFrequently:!0});if(!v)throw Error("isard: no 2D canvas to reproject the tiles");for(let[x,A]of p)if(A)v.drawImage(A,x.x,x.y,x.w,x.h);let I=v.getImageData(0,0,l.width,l.height).data,d=ze(I,l.width,l.height,l.mesh,l.n,l.size);return createImageBitmap(new ImageData(d,l.size,l.size),{premultiplyAlpha:"none"})}finally{for(let[,p]of f)u(p)}},cache:i,close:()=>{for(let l of i.values())r(l);i.clear()}}}function Be(e,t,n=Number.NEGATIVE_INFINITY){let o=e.length>>2,r=new Float32Array(o);if(t==="terrarium")for(let i=0,u=0;i<o;i+=1,u+=4){let s=e[u]*256+e[u+1]+e[u+2]/256-32768;r[i]=s>n?s:n}else for(let i=0,u=0;i<o;i+=1,u+=4){let s=-1e4+(e[u]*65536+e[u+1]*256+e[u+2])*0.1;r[i]=s>n?s:n}return r}async function he(e,t,n,o,r){let i=await fetch(e,{signal:o});if(i.status===404||i.status===204||i.status===410)return null;if(!i.ok)throw Error(`${i.url}: ${i.status}`);let u=await createImageBitmap(await i.blob(),{premultiplyAlpha:"none",colorSpaceConversion:"none"});try{r.canvas??=new OffscreenCanvas(256,256);let s=r.canvas.getContext("2d",{willReadFrequently:!0});if(!s)throw Error("no 2D context");return s.imageSmoothingEnabled=!1,s.clearRect(0,0,256,256),s.drawImage(u,0,0,256,256),Be(s.getImageData(0,0,256,256).data,t,n)}finally{u.close()}}var De="aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32",X;function Oe(e){if(!X){X=new Map;let t=De.split(" ");for(let n=0;n+1<t.length;n+=2)X.set(t[n],t[n+1])}return X.get(e)}var Y=(e)=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):0;function ye(e){if(!/^[0-9a-f]+$/.test(e)||![3,4,6,8].includes(e.length))return;let t=e.length<=4?[...e].map((o)=>o+o).join(""):e,n=(o)=>Number.parseInt(t.slice(o,o+2),16)/255;return[n(0),n(2),n(4),t.length===8?n(6):1]}function qe(e){if(e===void 0)return 1;return Y(e.endsWith("%")?Number.parseFloat(e)/100:Number.parseFloat(e))}function Ve(e,t,n){let o=n<0.5?n*(1+t):n+t-n*t,r=2*n-o,i=(u)=>{let s=(u%1+1)%1;if(s<0.16666666666666666)return r+(o-r)*6*s;if(s<0.5)return o;if(s<0.6666666666666666)return r+(o-r)*(0.6666666666666666-s)*6;return r};return[i(e+0.3333333333333333),i(e),i(e-0.3333333333333333)]}function we(e){if(typeof e!=="string")return;let t=e.trim().toLowerCase();if(t.startsWith("#"))return ye(t.slice(1));if(t==="transparent")return[0,0,0,0];let n=Oe(t);if(n)return ye(n);let o=/^(rgba?|hsla?)\(([^)]*)\)$/.exec(t);if(!o?.[1]||o[2]===void 0)return;let r=o[2].split(/[\s,/]+/).filter(Boolean);if(r.length<3||r.slice(0,3).some((m)=>Number.isNaN(Number.parseFloat(m))))return;let i=qe(r[3]);if(o[1].startsWith("rgb")){let m=(f)=>Y(f.endsWith("%")?Number.parseFloat(f)/100:Number.parseFloat(f)/255);return[m(r[0]),m(r[1]),m(r[2]),i]}let u=Number.parseFloat(r[0])/360,[s,a,l]=Ve(u,Y(Number.parseFloat(r[1])/100),Y(Number.parseFloat(r[2])/100));return[s,a,l,i]}var $e=["Unknown","Point","LineString","Polygon"];function ie(e,t){return{zoom:t,properties:e.properties,type:$e[e.type]??"Unknown"}}function U(e){return we(e)}function Q([e,t,n,o]){return`rgba(${Math.round(e*255)},${Math.round(t*255)},${Math.round(n*255)},${o})`}function ve(e,t,n,o=1){let r=n-t;if(r===0)return 0;let i=e-t;return o===1?i/r:(o**i-1)/(o**r-1)}function se(e,t,n){if(typeof e==="number"&&typeof t==="number")return e+(t-e)*n;let o=U(e),r=U(t);if(o&&r)return Q([0,1,2,3].map((i)=>(o[i]??0)+((r[i]??0)-(o[i]??0))*n));if(Array.isArray(e)&&Array.isArray(t))return e.map((i,u)=>se(i,t[u],n));return n<0.5?e:t}function Se(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)&&Array.isArray(e.stops)}function We(e,t){let n=e.property===void 0?t.zoom:t.properties[e.property],o=e.stops,r=e.type??(e.property===void 0||typeof o[0]?.[0]==="number"?"exponential":"categorical");if(r==="identity")return n??e.default;if(r==="categorical")return o.find(([s])=>s===n)?.[1]??e.default;if(typeof n!=="number"||!o.length)return e.default??o[0]?.[1];let i=(s)=>typeof s[0]==="object"&&s[0]!==null?Number(s[0].zoom):Number(s[0]),u=o[0];if(!u)return e.default;if(n<=i(u))return u[1];for(let s=1;s<o.length;s+=1){let[a,l]=[o[s-1],o[s]];if(!a||!l)continue;if(n<i(l)){if(r==="interval")return a[1];return se(a[1],l[1],ve(n,i(a),i(l),e.base??1))}}return o.at(-1)?.[1]}function G(e,t){if(t==="$type")return e.type;return typeof t==="string"?e.properties[t]:void 0}var Ue=new Set(["literal","zoom","get","has","!has","properties","id","geometry-type","concat","format","image","number-format","to-number","to-string","to-boolean","to-color","number","string","boolean","typeof","length","at","upcase","downcase","coalesce","!","all","any","==","!=","<","<=",">",">=","in","case","match","step","interpolate","interpolate-hcl","interpolate-lab","rgb","rgba","+","-","*","/","%","^","min","max","abs","round","floor","ceil","sqrt","ln","log10","log2","pi","e"]);function ae(e){return Array.isArray(e)&&typeof e[0]==="string"&&Ue.has(e[0])}var xe=new Set,H=(e)=>e===void 0||e===null?"":String(e);function R(e,t){if(Se(e))return We(e,t);if(!Array.isArray(e))return e;let[n,...o]=e;if(typeof n!=="string")return e;let r=(s)=>R(o[s]??null,t),i=(s)=>Number(r(s)),u=()=>o.map((s,a)=>i(a));switch(n){case"literal":return o[0];case"zoom":return t.zoom;case"get":return G(t,r(0));case"has":return G(t,r(0))!==void 0;case"!has":return G(t,r(0))===void 0;case"properties":return t.properties;case"id":return null;case"geometry-type":return t.type;case"concat":return o.map((s,a)=>H(r(a))).join("");case"format":return o.map((s,a)=>s!==null&&typeof s==="object"&&!Array.isArray(s)?"":H(r(a))).join("");case"image":return r(0);case"number-format":{let s=o[1]??{},a=i(0);if(!Number.isFinite(a))return"";return a.toLocaleString(s.locale,{minimumFractionDigits:s["min-fraction-digits"],maximumFractionDigits:s["max-fraction-digits"]})}case"to-number":{for(let s=0;s<o.length;s+=1){let a=r(s),l=typeof a==="string"&&a.trim()===""?Number.NaN:Number(a);if(a!==null&&a!==void 0&&!Number.isNaN(l))return l}return 0}case"to-string":return H(r(0));case"to-boolean":{let s=r(0);return!(s===""||s===0||s===!1||s===null||s===void 0||Number.isNaN(s))}case"to-color":case"number":case"string":case"boolean":{let s={"to-color":(a)=>U(a)!==void 0,number:(a)=>typeof a==="number",string:(a)=>typeof a==="string",boolean:(a)=>typeof a==="boolean"};for(let a=0;a<o.length;a+=1){let l=r(a);if(s[n]?.(l))return l}return o.length?r(o.length-1):null}case"typeof":{let s=r(0);if(s===null||s===void 0)return"null";return Array.isArray(s)?"array":typeof s}case"length":{let s=r(0);return typeof s==="string"||Array.isArray(s)?s.length:0}case"at":{let s=r(1);return Array.isArray(s)?s[i(0)]??null:null}case"upcase":return H(r(0)).toUpperCase();case"downcase":return H(r(0)).toLowerCase();case"coalesce":for(let s=0;s<o.length;s+=1){let a=r(s);if(a!==void 0&&a!==null)return a}return null;case"!":return!r(0);case"all":return o.every((s,a)=>Boolean(r(a)));case"any":return o.some((s,a)=>Boolean(r(a)));case"==":return r(0)===r(1);case"!=":return r(0)!==r(1);case"<":return r(0)<r(1);case"<=":return r(0)<=r(1);case">":return r(0)>r(1);case">=":return r(0)>=r(1);case"in":{let s=r(1),a=r(0);if(typeof s==="string")return s.includes(String(a));return Array.isArray(s)&&s.includes(a)}case"case":{for(let s=0;s+1<o.length;s+=2)if(r(s))return r(s+1);return r(o.length-1)}case"match":{let s=r(0);for(let a=1;a+1<o.length;a+=2){let l=o[a];if(Array.isArray(l)?l.includes(s):l===s)return r(a+1)}return r(o.length-1)}case"step":{let s=i(0),a=r(1);for(let l=2;l+1<o.length;l+=2)if(s>=Number(o[l]))a=r(l+1);else break;return a}case"interpolate":case"interpolate-hcl":case"interpolate-lab":{let s=o[0],a=i(1),l=Array.isArray(s)&&s[0]==="exponential"?Number(s[1]):1,m=[];for(let p=2;p+1<o.length;p+=2)m.push([Number(o[p]),o[p+1]??null]);let f=m[0];if(!f)return null;if(a<=f[0])return R(f[1],t);for(let p=1;p<m.length;p+=1){let[y,v]=[m[p-1],m[p]];if(y&&v&&a<v[0])return se(R(y[1],t),R(v[1],t),ve(a,y[0],v[0],l))}return R(m.at(-1)?.[1]??null,t)}case"rgb":case"rgba":return Q([i(0)/255,i(1)/255,i(2)/255,o.length>3?i(3):1]);case"+":return u().reduce((s,a)=>s+a,0);case"*":return u().reduce((s,a)=>s*a,1);case"-":return o.length===1?-i(0):i(0)-i(1);case"/":return i(0)/i(1);case"%":return i(0)%i(1);case"^":return i(0)**i(1);case"min":return Math.min(...u());case"max":return Math.max(...u());case"abs":return Math.abs(i(0));case"round":return Math.sign(i(0))*Math.round(Math.abs(i(0)));case"floor":return Math.floor(i(0));case"ceil":return Math.ceil(i(0));case"sqrt":return Math.sqrt(i(0));case"ln":return Math.log(i(0));case"log10":return Math.log10(i(0));case"log2":return Math.log2(i(0));case"pi":return Math.PI;case"e":return Math.E;default:if(!xe.has(n))xe.add(n),console.warn(`isard: the style expression "${n}" is not supported`);return null}}var _e=new Set(["==","!=","<","<=",">",">="]);function je(e){let[t,n,...o]=e;if(typeof t!=="string"||typeof n!=="string"||o.some(Array.isArray))return!1;if(_e.has(t))return e.length===3;if(t==="in")return e.length!==3||!Array.isArray(e[2]);return t==="!in"||t==="has"||t==="!has"}function He(e,t){let[n,o,...r]=e,i=G(t,o);switch(n){case"==":return i===r[0];case"!=":return i!==r[0];case"<":return i<r[0];case"<=":return i<=r[0];case">":return i>r[0];case">=":return i>=r[0];case"in":return r.includes(i);case"!in":return!r.includes(i);case"has":return i!==void 0;case"!has":return i===void 0;default:return!0}}var ke=new WeakMap;function Ae(e){if(!Array.isArray(e))return()=>Boolean(e);let t=ke.get(e);if(t)return t;let n,o=e[0];if(o==="all"||o==="any"||o==="none"){let r=e.slice(1).map(Ae);if(o==="all")n=(i)=>r.every((u)=>u(i));else if(o==="any")n=(i)=>r.some((u)=>u(i));else n=(i)=>!r.some((u)=>u(i))}else if(je(e))n=(r)=>He(e,r);else n=(r)=>Boolean(R(e,r));return ke.set(e,n),n}function ue(e,t){if(e===void 0||e===null)return!0;return Ae(e)(t)}function ee(e){if(e!==void 0&&Se(e))return e.property!==void 0;if(!Array.isArray(e))return!1;if(["get","has","!has","geometry-type","properties","id"].includes(e[0]))return!0;return e.some((t)=>ee(t))}function Me(e,t){if(e===void 0||e===null)return"";if(typeof e==="string")return e.replace(/\{([^}]+)\}/g,(o,r)=>{let i=t.properties[r];return i===void 0?"":String(i)});let n=R(e,t);if(Array.isArray(n))return n.filter((o)=>typeof o==="string").join("");return n===void 0||n===null?"":String(n)}function Ce(e){return/Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(e)?e:`${e} Regular`}function Ie(e){let t=new Set,n=(u)=>{if(!Array.isArray(u))return;let s=(a)=>Array.isArray(a)&&a[0]==="zoom";if((u[0]==="interpolate"||u[0]==="interpolate-hcl"||u[0]==="interpolate-lab")&&s(u[2]))for(let a=3;a<u.length;a+=2)t.add(Number(u[a]));else if(u[0]==="step"&&s(u[1]))for(let a=3;a<u.length;a+=2){let l=Number(u[a]);t.add(l),t.add(l-0.01)}for(let a of u)n(a)};n(e);let o=[...t].filter(Number.isFinite);if(o.length===0)o.push(0);let[r,i]=[Math.min(...o),Math.max(...o)];for(let u=Math.ceil(r);u<=Math.floor(i);u+=1)o.push(u);return[...new Set(o)].sort((u,s)=>u-s).map((u)=>[u,Number(R(e,{zoom:u,properties:{},type:"Unknown"}))])}var te=new Map,Pe=96,re=new W(Pe);function Ze(e){return Math.max(16,Math.ceil(Pe/Math.max(1,e)))}var le=new Set,Z=new Set,fe=new Map,Ke={},Ne=ge(),ce=new W(64,(e)=>e.then((t)=>setTimeout(()=>t?.close(),0),()=>{return}));function Xe(e,t="auto"){let n=ce.get(e);if(n)return n;let o=(async()=>{let i=await fetch(e,{priority:t});if(i.status===404||i.status===204)return;if(!i.ok)throw Error(`${e}: ${i.status}`);return createImageBitmap(await i.blob())})();return o.catch(()=>ce.delete(e)),ce.set(e,o),o}function Re(e,t="auto"){let n=re.get(e);if(n)return n;let o=(async()=>{for(let r=0;;r+=1){let u=await fetch(e,{priority:t});if(u.status===404||u.status===204)return;if(u.ok)return be(new Uint8Array(await u.arrayBuffer()));if(r>=2)throw Error(`${e}: ${u.status}`);await new Promise((s)=>setTimeout(s,400*(r+1)))}})();return o.catch(()=>re.delete(e)),re.set(e,o),o}function Ye(e,t,n,o){let r=Math.max(0,Math.min(t-1,e.maxzoom)),i=t-r,u=2**Math.max(0,i),[s,a]=i>=0?[Math.floor(n/u),Math.floor(o/u)]:[n,o],l=e.tiles.replace("{z}",String(r)).replace("{x}",String(s)).replace("{y}",String(a)),m=1/u;return{url:l,vz:r,vx:s,vy:a,part:m,ox:n%u*m,oy:o%u*m}}var N=(e,t,n,o,r)=>{let i=e[t]?.[n];if(i===void 0)return r;let u=Array.isArray(i)&&!ae(i)?i:R(i,o);return u===void 0||u===null?r:u};function B(e,t){let n=U(e)??[0,0,0,1];return Q([n[0],n[1],n[2],n[3]*t])}function Le(e,t){if(e.layout?.visibility==="none")return!1;return t>=(e.minzoom??0)&&t<(e.maxzoom??24)}function Ge(e,t){if(e.patterns.has(t))return e.patterns.get(t);let n=e.sprite?.icons[t],o;if(e.sprite&&n&&n.width>0&&n.height>0)o=new OffscreenCanvas(n.width,n.height),o.getContext("2d")?.drawImage(e.sprite.image,n.x,n.y,n.width,n.height,0,0,n.width,n.height);return e.patterns.set(t,o),o}var me=new Map;function Qe(e){let t=me.get(e)?.pop()??new OffscreenCanvas(e,e),n=t.getContext("2d",{willReadFrequently:!0});if(!n)throw Error("no 2D context");return n.setTransform(1,0,0,1,0,0),n.globalAlpha=1,n.setLineDash([]),n.clearRect(0,0,e,e),{canvas:t,g:n}}function et(e){let t=me.get(e.width)??[];if(me.set(e.width,t),t.length<4)t.push(e)}function tt(e,t,n){if(n)return Promise.resolve(e.transferToImageBitmap());return createImageBitmap(t.getImageData(0,0,e.width,e.height),{premultiplyAlpha:"none"})}async function nt(e,t,n,o,r,i,u){let s=Ye(e,t,n,o),a=await Re(s.url,u);if(Z.has(i))return;let{canvas:l,g:m}=Qe(r);try{return await rt(e,s,a,l,m,t,n,o,r,i,u)}finally{et(l)}}async function rt(e,t,n,o,r,i,u,s,a,l,m){let f=e.sprite,p=Math.max(0,i-1),y=a/256,v=!1,I=!1;for(let d of e.layers){if(!Le(d,p))continue;let x={zoom:p,properties:{},type:"Unknown"};if(d.type==="background"){let b=N(d,"paint","background-color",x,"#000"),c=Number(N(d,"paint","background-opacity",x,1));if(r.fillStyle=B(b,c),r.fillRect(0,0,a,a),(U(b)??[0,0,0,1])[3]*c>=1)I=!0;v=!0;continue}if(d.type==="raster"){let b=d.source===void 0?void 0:e.rasters[d.source];if(!b)continue;let c=Math.max(0,Math.min(i-(b.tileSize>=512?1:0),b.maxzoom)),g=2**(i-c),h=b.tiles.replace("{z}",String(c)).replace("{x}",String(Math.floor(u/g))).replace("{y}",String(Math.floor(s/g))),k=await Xe(h,m).catch(()=>{return});if(Z.has(l))return;if(!k)continue;let[S,M]=[k.width/g,k.height/g];r.globalAlpha=Number(N(d,"paint","raster-opacity",x,1)),r.drawImage(k,u%g*S,s%g*M,S,M,0,0,a,a),r.globalAlpha=1,v=!0;continue}let A=n?.get(d["source-layer"]??"");if(!A)continue;let P=a/(A.extent*t.part),[z,L]=[t.ox*A.extent,t.oy*A.extent],J=(b,c)=>{r.beginPath();for(let g of b.geometry){for(let h=0;h+1<g.length;h+=2){let[k,S]=[((g[h]??0)-z)*P,((g[h+1]??0)-L)*P];if(h===0)r.moveTo(k,S);else r.lineTo(k,S)}if(c)r.closePath()}},C=new Map,w=(b,c,g,h)=>{let k=C.get(c);if(k===void 0)k=ee(d[b]?.[c]),C.set(c,k);return N(d,b,c,k?g:x,h)};for(let b of A.features){let c=ie(b,p);if(!ue(d.filter,c))continue;if(d.type==="fill-extrusion"&&b.type===3)J(b,!0),r.fillStyle=B(w("paint","fill-extrusion-color",c,"#000"),Number(w("paint","fill-extrusion-opacity",c,1))),r.fill("evenodd"),v=!0;else if(d.type==="fill"&&b.type===3){let g=Number(w("paint","fill-opacity",c,1)),h=w("paint","fill-pattern",c,void 0);J(b,!0);let k=typeof h==="string"?f?.icons[h]:void 0,S=k&&Ge(e,h);if(k&&S){let M=r.createPattern(S,"repeat");if(M)M.setTransform(new DOMMatrix().scale(y/(k.pixelRatio??1))),r.globalAlpha=g,r.fillStyle=M,r.fill("evenodd"),r.globalAlpha=1}else{r.fillStyle=B(w("paint","fill-color",c,"#000"),g),r.fill("evenodd");let M=w("paint","fill-outline-color",c,void 0);if(M!==void 0)r.strokeStyle=B(M,g),r.lineWidth=y,r.setLineDash([]),r.stroke()}v=!0}else if(d.type==="line"&&b.type!==1){let g=Number(w("paint","line-width",c,1));if(g<=0)continue;let h=Number(w("paint","line-gap-width",c,0));r.strokeStyle=B(w("paint","line-color",c,"#000"),Number(w("paint","line-opacity",c,1))),r.lineWidth=(h>0?h+2*g:g)*y,r.lineCap=String(w("layout","line-cap",c,"butt")),r.lineJoin=String(w("layout","line-join",c,"miter"));let k=w("paint","line-dasharray",c,void 0);r.setLineDash(Array.isArray(k)?k.map((S)=>Number(S)*g*y):[]),J(b,b.type===3),r.stroke(),v=!0}else if(d.type==="circle"&&b.type===1){let g=Number(w("paint","circle-radius",c,5))*y;r.fillStyle=B(w("paint","circle-color",c,"#000"),Number(w("paint","circle-opacity",c,1)));let h=Number(w("paint","circle-stroke-width",c,0))*y;r.strokeStyle=B(w("paint","circle-stroke-color",c,"#000"),Number(w("paint","circle-stroke-opacity",c,1))),r.lineWidth=h;for(let k of b.geometry)for(let S=0;S+1<k.length;S+=2)if(r.beginPath(),r.arc(((k[S]??0)-z)*P,((k[S+1]??0)-L)*P,g,0,2*Math.PI),r.fill(),h>0)r.stroke();v=!0}}}if(!v&&!n)return null;return tt(o,r,I)}function ot(e){let{layout:t={},paint:n={}}=e;return t["icon-image"]!==void 0&&n["text-halo-width"]===void 0&&n["text-halo-color"]===void 0&&t["text-offset"]===void 0&&(t["text-anchor"]??"center")==="center"}function ne(e,t,n,o,r,i){let u=2**e;return[pe((t+r/o)/u),de((n+i/o)/u)]}async function it(e,t,n,o,r,i){let u=e.tiles.replace("{z}",String(t)).replace("{x}",String(n)).replace("{y}",String(o)),s=await Re(u,i);if(!s||Z.has(r))return[];let a=[],l=new Map,m=(f)=>{let p=l.get(f);if(p===void 0){let y=f.layout?.["text-size"]??16;p=ae(y)?Ie(y):y,l.set(f,p)}return p};return e.layers.forEach((f,p)=>{if(f.type!=="symbol"||!Le(f,t)||f.layout?.["text-field"]===void 0)return;if(ot(f))return;let y=s.get(f["source-layer"]??"");if(!y)return;let v=f.layout?.["symbol-placement"]==="line"?"line":"point";for(let I of y.features){let d=ie(I,t);if(!ue(f.filter,d))continue;let x=Me(f.layout?.["text-field"],d).trim();if(!x)continue;let A=N(f,"layout","text-transform",d,"none");if(A==="uppercase")x=x.toUpperCase();else if(A==="lowercase")x=x.toLowerCase();let P=N(f,"layout","text-font",d,["Noto Sans Regular"]),z=Ce(Array.isArray(P)&&typeof P[0]==="string"?P[0]:"Noto Sans Regular"),L=N(f,"layout","text-offset",d,[0,0]),J={layer:p,text:x,font:z,size:ee(f.layout?.["text-size"])?Number(N(f,"layout","text-size",d,16)):m(f),color:String(N(f,"paint","text-color",d,"#000")),haloColor:String(N(f,"paint","text-halo-color",d,"rgba(0,0,0,0)")),haloWidth:Number(N(f,"paint","text-halo-width",d,0)),anchor:String(N(f,"layout","text-anchor",d,"center")),offset:Array.isArray(L)?[Number(L[0]??0),Number(L[1]??0)]:[0,0],maxWidth:Number(N(f,"layout","text-max-width",d,10)),lineHeight:Number(N(f,"layout","text-line-height",d,1.2)),overlap:Boolean(N(f,"layout","text-allow-overlap",d,!1))};if(I.type===1)for(let C of I.geometry)for(let w=0;w+1<C.length;w+=2){let[b,c]=[C[w]??0,C[w+1]??0];if(b<0||c<0||b>=y.extent||c>=y.extent)continue;let[g,h]=ne(t,n,o,y.extent,b,c);a.push({...J,lon:g,lat:h})}else{let C,w=0;for(let c of I.geometry){let g=0;for(let h=2;h+1<c.length;h+=2)g+=Math.hypot((c[h]??0)-(c[h-2]??0),(c[h+1]??0)-(c[h-1]??0));if(g>w)w=g,C=c}if(!C||w<y.extent/32)continue;let b=w/2;for(let c=2;c+1<C.length;c+=2){let[g,h,k,S]=[C[c-2]??0,C[c-1]??0,C[c]??0,C[c+1]??0],M=Math.hypot(k-g,S-h);if(M>=b&&M>0){let[D,O]=[g+(k-g)*b/M,h+(S-h)*b/M];if(D<0||O<0||D>=y.extent||O>=y.extent)break;let[E,q]=ne(t,n,o,y.extent,D,O),[T,_]=ne(t,n,o,y.extent,k,S),[j,V]=ne(t,n,o,y.extent,g,h);a.push({...J,lon:E,lat:q,...v==="line"?{along:[T-j,_-V]}:{}});break}b-=M}}}}),a}var F=(e,t=[])=>self.postMessage(e,t);self.onmessage=async({data:e})=>{if(e.type==="init"){if(e.workers!==void 0)re.capacity=Ze(e.workers);te.set(e.key,{tiles:e.tiles,maxzoom:e.maxzoom,layers:e.layers,rasters:e.rasters??{},sprite:e.sprite,patterns:new Map});return}if(e.type==="drop"){te.get(e.key)?.sprite?.image.close(),te.delete(e.key);return}if(e.type==="abort"){if(le.has(e.id))Z.add(e.id);fe.get(e.id)?.abort();return}if(e.type==="heights"||e.type==="reproject"){await st(e);return}le.add(e.id);let t=te.get(e.key);try{if(!t)throw Error(`no renderer ${e.key}`);if(e.type==="render"){let n=await nt(t,e.z,e.x,e.y,e.size,e.id,e.priority);if(n)F({id:e.id,image:n},[n]);else F({id:e.id,missing:!0})}else F({id:e.id,labels:await it(t,e.z,e.x,e.y,e.id,e.priority)})}catch(n){F({id:e.id,error:String(n)})}finally{le.delete(e.id),Z.delete(e.id)}};async function st(e){let t=new AbortController;fe.set(e.id,t);try{if(e.type==="heights"){let n=await he(e.url,e.encoding,e.floor,t.signal,Ke);if(n)F({id:e.id,heights:n},[n.buffer]);else F({id:e.id,missing:!0})}else{Ne.cache.capacity=e.cached;let n=await Ne.draw(e.job,t.signal);if(n)F({id:e.id,image:n},[n]);else F({id:e.id,missing:!0})}}catch(n){F({id:e.id,error:String(n)})}finally{fe.delete(e.id)}}export{Ze as cacheShare,tt as tileImage};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=289BA430EA43882A64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=basemap.worker.js.map
|