isard 2.1.0 → 2.1.2
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 +29 -0
- package/dist/basemap/mvt.d.ts +11 -4
- package/dist/basemap/mvt.js +75 -15
- package/dist/basemap/mvt.js.map +1 -1
- package/dist/basemap/vectortiles.js +1 -1
- package/dist/basemap/vectortiles.js.map +1 -1
- package/dist/basemap.worker.js +2 -2
- package/dist/basemap.worker.js.map +9 -9
- package/dist/isard_webgl2_bg.wasm +0 -0
- package/dist/isard_webgpu_bg.wasm +0 -0
- package/dist/map/quality.d.ts +3 -2
- package/dist/map/quality.js +3 -3
- package/dist/map/quality.js.map +1 -1
- package/dist/types.d.ts +6 -6
- package/dist/types.js.map +1 -1
- package/dist/util/lru.d.ts +9 -0
- package/dist/util/lru.js +30 -6
- package/dist/util/lru.js.map +1 -1
- package/dist/wasm/isard_webgl2.d.ts +1 -1
- package/dist/wasm/isard_webgl2.js +6 -6
- package/dist/wasm/isard_webgpu.d.ts +1 -1
- package/dist/wasm/isard_webgpu.js +6 -6
- package/dist/workers/basemap/geometry.d.ts +4 -4
- package/dist/workers/basemap/protocol.d.ts +1 -1
- package/dist/workers/basemap/tiles.d.ts +3 -2
- package/dist/workers/basemap/trees.d.ts +2 -2
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"sources": ["../src/util/fetch.ts", "../src/util/lru.ts", "../src/util/requests.ts", "../src/basemap/resample.ts", "../src/util/math.ts", "../src/util/geo.ts", "../src/basemap/terrain.ts", "../src/util/color.ts", "../src/util/guards.ts", "../src/basemap/vectorstyle.ts", "../src/wasm/isard_grid.js", "../src/grid-module.ts", "../src/basemap/placed.ts", "../src/basemap/mvt.ts", "../src/basemap/pmtiles.ts", "../src/workers/basemap/tiles.ts", "../src/workers/basemap/labels.ts", "../src/basemap/woods.ts", "../src/workers/basemap/trees.ts", "../src/workers/basemap/furniture.ts", "../src/util/roofs.ts", "../src/util/style-floats.ts", "../src/wasm/isard_tess.js", "../src/workers/basemap/geometry.ts", "../src/workers/basemap/lamps.ts", "../src/workers/basemap/raster.ts", "../src/workers/basemap/street.ts", "../src/workers/basemap.worker.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/** Requests that fail as one: an error saying which URL answered which status */\n\n/** A request's failure: `isard: <url>: HTTP <status>` */\nexport const httpError = (url: string | URL, status: number): Error =>\n new Error(`isard: ${String(url)}: HTTP ${status}`);\n\n/** A response that is ok, else an `httpError` */\nexport const fetchOk = async (url: string | URL, init?: RequestInit): Promise<Response> => {\n const response = await fetch(url, init);\n\n if (!response.ok) throw httpError(url, response.status);\n\n return response;\n};\n",
|
|
6
|
-
"/**\n * A cache keeping its most recently used entries (the decoded tiles and images of the workers, the source tiles of a\n * reprojection, the labels of the vector tiles): a `Map` in order of use, the least recent dropped past `capacity`.\n */\nexport class Lru<K, V> {\n private readonly entries = new Map<K, V>();\n\n /** `evict`: told of each entry dropped for room (not of those deleted) */\n constructor(\n public capacity: number,\n private readonly evict?: (value: V, key: K) => void,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /** The value of a key, now the most recently used; undefined if absent */\n get(key: K): V | undefined {\n const value = this.entries.get(key);\n\n if (value !== undefined) {\n this.entries.delete(key);\n this.entries.set(key, value);\n }\n\n return value;\n }\n\n /** Whether a key is kept, without using it */\n has(key: K): boolean {\n return this.entries.has(key);\n }\n\n /** Adds or replaces a value, the most recently used; drops the least recent ones past the capacity */\n set(key: K, value: V): void {\n this.
|
|
6
|
+
"/**\n * A cache keeping its most recently used entries (the decoded tiles and images of the workers, the source tiles of a\n * reprojection, the labels of the vector tiles): a `Map` in order of use, the least recent dropped past `capacity`.\n * Each entry weighs 1 unless weighed otherwise (`weigh`: the decoded tiles by their bytes), the capacity then a total\n * weight; the most recent entry is kept whatever it weighs.\n */\nexport class Lru<K, V> {\n private readonly entries = new Map<K, V>();\n /** The weights other than 1 */\n private readonly weights = new Map<K, number>();\n private total = 0;\n\n /** `evict`: told of each entry dropped for room (not of those deleted) */\n constructor(\n public capacity: number,\n private readonly evict?: (value: V, key: K) => void,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /** The value of a key, now the most recently used; undefined if absent */\n get(key: K): V | undefined {\n const value = this.entries.get(key);\n\n if (value !== undefined) {\n this.entries.delete(key);\n this.entries.set(key, value);\n }\n\n return value;\n }\n\n /** Whether a key is kept, without using it */\n has(key: K): boolean {\n return this.entries.has(key);\n }\n\n /** Adds or replaces a value, the most recently used; drops the least recent ones past the capacity */\n set(key: K, value: V): void {\n this.delete(key);\n this.entries.set(key, value);\n this.total += 1;\n this.trim();\n }\n\n /** Weighs a kept entry (its place in the order of use kept); drops the least recent ones past the capacity */\n weigh(key: K, weight: number): void {\n if (!this.entries.has(key)) return;\n this.total += weight - (this.weights.get(key) ?? 1);\n this.weights.set(key, weight);\n this.trim();\n }\n\n delete(key: K): boolean {\n if (!this.entries.has(key)) return false;\n this.total -= this.weights.get(key) ?? 1;\n this.weights.delete(key);\n\n return this.entries.delete(key);\n }\n\n /** Drops the least recent entries past the capacity, the most recent kept */\n private trim(): void {\n for (const [oldest, old] of this.entries) {\n if (this.total <= this.capacity || this.entries.size <= 1) break;\n this.delete(oldest);\n this.evict?.(old, oldest);\n }\n }\n\n /** The values, least recently used first */\n values(): IterableIterator<V> {\n return this.entries.values();\n }\n\n clear(): void {\n this.entries.clear();\n this.weights.clear();\n this.total = 0;\n }\n}\n",
|
|
7
7
|
"/**\n * Headers added to the requests of the page by URL prefix: an access token for private sources (a Géoplateforme\n * private stream, a server behind single sign-on), on every request isard makes, from the page, its workers (vector\n * tiles, 3D Tiles and point clouds) and its engine (raster tiles, tilesets): `setRequestHeaders(prefix, headers)`,\n * again with a new token when it is renewed. The rules of a URL are merged, the longest prefix last (it wins).\n */\n\n/** Rules: a URL prefix and its headers, the shortest prefix first */\nexport type HeaderRules = [prefix: string, headers: Record<string, string>][];\n\nlet rules: HeaderRules = [];\nconst listeners = new Set<(rules: HeaderRules) => void>();\n\n/**\n * Adds `headers` to every request isard makes to a URL starting with `prefix` (in the page and its workers), or with\n * no headers, stops: `setRequestHeaders('https://data.geopf.fr/private/', { Authorization: 'Bearer …' })`. The\n * server must allow these headers (CORS). For the whole page: every map, the ones to come too\n */\nexport const setRequestHeaders = (prefix: string, headers?: Record<string, string>): void => {\n const kept = rules.filter(([p]) => p !== prefix);\n\n if (headers && Object.keys(headers).length > 0) kept.push([prefix, { ...headers }]);\n kept.sort(([p], [q]) => p.length - q.length);\n setHeaderRules(kept);\n listeners.forEach((listener) => {\n listener(rules);\n });\n};\n\n/** @internal The rules now */\nexport const headerRules = (): HeaderRules => {\n return rules;\n};\n\n/** @internal The rules, from the page (a worker's copy) */\nexport const setHeaderRules = (next: HeaderRules): void => {\n rules = next;\n};\n\n/** @internal Follows the rules (the workers and engines of a map); returns the function that stops */\nexport const onHeaderRules = (listener: (rules: HeaderRules) => void): (() => void) => {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n};\n\n/** @internal `init` with the headers of the rules matching `url` (unchanged when none does) */\nexport const withHeaders = (url: string | URL, init: RequestInit = {}): RequestInit => {\n const href = String(url);\n const matching = rules.filter(([prefix]) => href.startsWith(prefix));\n\n if (matching.length === 0) return init;\n\n const headers = new Headers(init.headers);\n\n matching.forEach(([, set]) => {\n Object.entries(set).forEach(([name, value]) => {\n headers.set(name, value);\n });\n });\n\n return { ...init, headers };\n};\n",
|
|
8
8
|
"/**\n * Raster reprojection, the drawing half: a Web Mercator tile drawn from the source images it spans (tiles of another\n * grid, or one image of a WMS), in a worker of the map (OffscreenCanvas) or in the page when the map has no workers.\n * The page plans each tile (`grid.ts`): which images, where they go in a mosaic, and a mesh of control points giving,\n * for the corners of 16 × 16 cells of the tile, the mosaic pixel under them. Here the images are fetched (kept for the\n * neighbouring tiles), drawn into the mosaic, and every pixel of the tile sampled from it, its source position\n * interpolated within its cell (bilinear), its color between the four nearest source pixels (bilinear, alpha\n * premultiplied). This code knows no projection.\n */\n\nimport { httpError } from '../util/fetch.ts';\nimport { Lru } from '../util/lru.ts';\nimport { withHeaders } from '../util/requests.ts';\n\n/** Source images kept decoded (by the page, or shared by the workers of a pool): the neighbours of a tile share them */\nexport const SOURCE_CACHE = 96;\n\n/** A source image and the rectangle of the mosaic it covers (pixels) */\nexport interface Placed {\n url: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** How to draw a Mercator tile of `size` pixels: the mosaic of the source images, and the mesh of `n` × `n` cells\n * ((n + 1)² points, rows from the north, x then y): the mosaic position of each corner, NaN where the source CRS has\n * none */\nexport interface Job {\n size: number;\n width: number;\n height: number;\n sources: Placed[];\n n: number;\n mesh: Float32Array;\n}\n\n/**\n * Samples the pixels of a `size` × `size` tile (RGBA, straight alpha) from a mosaic of `width` × `height` (RGBA,\n * straight alpha) through the mesh of a job. Pixels whose position falls outside the mosaic, or on a NaN, stay\n * transparent; the mosaic's edge fades over half a pixel\n */\nexport const resample = (\n source: Uint8ClampedArray,\n width: number,\n height: number,\n mesh: Float32Array,\n n: number,\n size: number,\n): Uint8ClampedArray<ArrayBuffer> => {\n const out = new Uint8ClampedArray(size * size * 4);\n const cell = size / n;\n const stride = n + 1;\n\n for (let row = 0; row < size; row += 1) {\n const fy = (row + 0.5) / cell;\n const j = Math.min(n - 1, Math.floor(fy));\n const ty = fy - j;\n\n for (let col = 0; col < size; col += 1) {\n const fx = (col + 0.5) / cell;\n const i = Math.min(n - 1, Math.floor(fx));\n const tx = fx - i;\n const a = 2 * (j * stride + i);\n const b = a + 2 * stride;\n // The corners of the cell, then the position in it\n const w00 = (1 - tx) * (1 - ty);\n const w10 = tx * (1 - ty);\n const w01 = (1 - tx) * ty;\n const w11 = tx * ty;\n const u =\n w00 * (mesh[a] as number) +\n w10 * (mesh[a + 2] as number) +\n w01 * (mesh[b] as number) +\n w11 * (mesh[b + 2] as number);\n const v =\n w00 * (mesh[a + 1] as number) +\n w10 * (mesh[a + 3] as number) +\n w01 * (mesh[b + 1] as number) +\n w11 * (mesh[b + 3] as number);\n // Pixel centers at half pixels: the four around (u, v)\n const sx = u - 0.5;\n const sy = v - 0.5;\n\n if (!(sx > -1 && sy > -1 && sx < width && sy < height)) continue;\n\n const x0 = Math.floor(sx);\n const y0 = Math.floor(sy);\n const kx = sx - x0;\n const ky = sy - y0;\n let r = 0;\n let g = 0;\n let bl = 0;\n let alpha = 0;\n\n for (let k = 0; k < 4; k += 1) {\n const x = x0 + (k & 1);\n const y = y0 + (k >> 1);\n\n if (x < 0 || y < 0 || x >= width || y >= height) continue;\n\n const p = 4 * (y * width + x);\n const wa = (k & 1 ? kx : 1 - kx) * (k >> 1 ? ky : 1 - ky) * (source[p + 3] as number);\n\n r += wa * (source[p] as number);\n g += wa * (source[p + 1] as number);\n bl += wa * (source[p + 2] as number);\n alpha += wa;\n }\n if (alpha <= 0) continue;\n\n const q = 4 * (row * size + col);\n\n out[q] = r / alpha;\n out[q + 1] = g / alpha;\n out[q + 2] = bl / alpha;\n out[q + 3] = alpha;\n }\n }\n\n return out;\n};\n\n/** Draws a planned tile: its image, null where the source has nothing; rejects on errors */\nexport type DrawJob = (job: Job, signal: AbortSignal) => Promise<ImageBitmap | null>;\n\n/**\n * Draws planned tiles, keeping `cached` source images decoded. A missing source image (404, 204, 410) leaves its part\n * empty; a tile with no source at all is missing; other errors reject (retried by the engine). In the page, or in a\n * worker of the map (`close` frees the images kept)\n */\nexport const resampler = (cached = SOURCE_CACHE): { draw: DrawJob; close: () => void; cache: { capacity: number } } => {\n type Image = Promise<ImageBitmap | null>;\n\n /** Tiles being drawn from each source image: an evicted one is closed once none is */\n const users = new Map<Image, number>();\n const evicted = new Set<Image>();\n const close = (image: Image) => {\n evicted.delete(image);\n image.then(\n (bitmap) => bitmap?.close(),\n () => undefined,\n );\n };\n /** Freed now, or once the tiles drawing from it are done */\n const drop = (image: Image) => {\n if (users.has(image)) evicted.add(image);\n else close(image);\n };\n // Source images by URL: a request is shared by the tiles that need it, its signal is not theirs\n const cache = new Lru<string, Image>(cached, drop);\n const release = (image: Image) => {\n const count = (users.get(image) ?? 1) - 1;\n\n if (count > 0) users.set(image, count);\n else {\n users.delete(image);\n if (evicted.has(image)) close(image);\n }\n };\n const fetchImage = (url: string): Image => {\n const load = (): Image => {\n const loading = (async () => {\n const response = await fetch(url, withHeaders(url));\n\n if (response.status === 404 || response.status === 204 || response.status === 410) return null;\n if (!response.ok) throw httpError(url, response.status);\n\n return createImageBitmap(await response.blob());\n })();\n\n // A failure is not kept: the engine's retry fetches again\n loading.catch(() => cache.delete(url));\n cache.set(url, loading);\n\n return loading;\n };\n const image = cache.get(url) ?? load();\n\n users.set(image, (users.get(image) ?? 0) + 1);\n\n return image;\n };\n const draw: DrawJob = async (job, signal) => {\n const pending = job.sources.map((s) => [s, fetchImage(s.url)] as const);\n\n try {\n const images = await Promise.all(pending.map(async ([s, image]) => [s, await image] as const));\n\n signal.throwIfAborted();\n if (!images.some(([, image]) => image)) return null;\n\n const canvas = new OffscreenCanvas(job.width, job.height);\n const context = canvas.getContext('2d', { willReadFrequently: true });\n\n if (!context) throw new Error('isard: no 2D canvas to reproject the tiles');\n images.forEach(([s, image]) => {\n if (image) context.drawImage(image, s.x, s.y, s.w, s.h);\n });\n\n const mosaic = context.getImageData(0, 0, job.width, job.height).data;\n const pixels = resample(mosaic, job.width, job.height, job.mesh, job.n, job.size);\n\n return createImageBitmap(new ImageData(pixels, job.size, job.size), { premultiplyAlpha: 'none' });\n } finally {\n pending.forEach(([, image]) => {\n release(image);\n });\n }\n };\n\n return {\n draw,\n cache,\n close: () => {\n [...cache.values()].forEach(drop);\n cache.clear();\n },\n };\n};\n",
|
|
9
9
|
"/** Small numeric helpers shared by the page and the workers */\n\n/** `value` kept within `min` and `max` */\nexport const clamp = (value: number, min: number, max: number): number => Math.max(min, Math.min(max, value));\n",
|
|
@@ -15,23 +15,23 @@
|
|
|
15
15
|
"/* @ts-self-types=\"./isard_grid.d.ts\" */\n\n/**\n * The grids of a file\n */\nexport class GridSet {\n static __wrap(ptr) {\n const obj = Object.create(GridSet.prototype);\n obj.__wbg_ptr = ptr;\n GridSetFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n GridSetFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_gridset_free(ptr, 0);\n }\n /**\n * How many grids\n * @returns {number}\n */\n count() {\n const ret = wasm.gridset_count(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Grid `i`'s description: name, standard name, units, level, time, width, height, bounds (JSON)\n * @param {number} i\n * @returns {string}\n */\n meta(i) {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.gridset_meta(this.__wbg_ptr, i);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Grid `i`'s values, row after row from the north\n * @param {number} i\n * @returns {Float32Array}\n */\n values(i) {\n const ret = wasm.gridset_values(this.__wbg_ptr, i);\n return ret;\n }\n}\nif (Symbol.dispose) GridSet.prototype[Symbol.dispose] = GridSet.prototype.free;\n\n/**\n * The flows of a city's streets for a wind of 1 m/s from the west and one from the south (see `street`): the east and\n * north velocities of each, `width` × `height` cells each\n */\nexport class StreetFlow {\n static __wrap(ptr) {\n const obj = Object.create(StreetFlow.prototype);\n obj.__wbg_ptr = ptr;\n StreetFlowFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n StreetFlowFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_streetflow_free(ptr, 0);\n }\n /**\n * The flow of a wind towards the east: its east velocities, then its north ones\n * @returns {Float32Array}\n */\n eastU() {\n const ret = wasm.streetflow_eastU(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {Float32Array}\n */\n eastV() {\n const ret = wasm.streetflow_eastV(this.__wbg_ptr);\n return ret;\n }\n /**\n * The flow of a wind towards the north: its east velocities, then its north ones\n * @returns {Float32Array}\n */\n northU() {\n const ret = wasm.streetflow_northU(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {Float32Array}\n */\n northV() {\n const ret = wasm.streetflow_northV(this.__wbg_ptr);\n return ret;\n }\n}\nif (Symbol.dispose) StreetFlow.prototype[Symbol.dispose] = StreetFlow.prototype.free;\n\n/**\n * The grids of a GRIB2 or classic NetCDF file\n *\n * # Errors\n *\n * Throws (to JavaScript) when the file is of neither kind, malformed, or packed in a way not read\n * @param {Uint8Array} bytes\n * @returns {GridSet}\n */\nexport function readGrids(bytes) {\n const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.readGrids(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return GridSet.__wrap(ret[0]);\n}\n\n/**\n * The flows of the streets of a grid of `width` × `height` cells round the buildings of `points` (their rings in\n * cells, from the north-west corner, interleaved; `ring_start` the first point of each ring and the end,\n * `polygon_start` the first ring of each polygon and the end), after `iterations` sweeps\n * @param {Float64Array} points\n * @param {Uint32Array} ring_start\n * @param {Uint32Array} polygon_start\n * @param {number} width\n * @param {number} height\n * @param {number} iterations\n * @returns {StreetFlow}\n */\nexport function streetFlow(points, ring_start, polygon_start, width, height, iterations) {\n const ptr0 = passArrayF64ToWasm0(points, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray32ToWasm0(ring_start, wasm.__wbindgen_malloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passArray32ToWasm0(polygon_start, wasm.__wbindgen_malloc);\n const len2 = WASM_VECTOR_LEN;\n const ret = wasm.streetFlow(ptr0, len0, ptr1, len1, ptr2, len2, width, height, iterations);\n return StreetFlow.__wrap(ret);\n}\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg___wbindgen_throw_41e9ee4f547fc59a: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_new_from_slice_ca6ad97db1f4779a: function(arg0, arg1) {\n const ret = new Float32Array(getArrayF32FromWasm0(arg0, arg1));\n return ret;\n },\n __wbindgen_generic_0000000000000001: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n };\n return {\n __proto__: null,\n \"./isard_grid_bg.js\": import0,\n };\n}\n\nconst GridSetFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_gridset_free(ptr, 1));\nconst StreetFlowFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_streetflow_free(ptr, 1));\n\nfunction getArrayF32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nlet cachedFloat32ArrayMemory0 = null;\nfunction getFloat32ArrayMemory0() {\n if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32ArrayMemory0;\n}\n\nlet cachedFloat64ArrayMemory0 = null;\nfunction getFloat64ArrayMemory0() {\n if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) {\n cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer);\n }\n return cachedFloat64ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction passArray32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getUint32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayF64ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 8, 8) >>> 0;\n getFloat64ArrayMemory0().set(arg, ptr / 8);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasmInstance = instance;\n wasm = instance.exports;\n wasmModule = module;\n cachedFloat32ArrayMemory0 = null;\n cachedFloat64ArrayMemory0 = null;\n cachedUint32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (!module.ok) {\n throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);\n }\n\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('isard_grid_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n",
|
|
16
16
|
"/**\n * The grid module (`isard_grid_bg.wasm`) as the workers (and the page without them) run it: a GRIB2 or NetCDF file's\n * bytes to its grids' descriptions and values. Nothing of the page: the basemap workers import it.\n */\n\nimport initGrid, { readGrids, streetFlow } from './wasm/isard_grid.js';\n\n/** A grid's description as the grid module gives it (JSON): a grid without its values */\nexport interface GridDescription {\n name: string;\n standardName: string | null;\n units: string | null;\n level: { kind: string; value: number | null } | null;\n time: number | null;\n width: number;\n height: number;\n bounds: (number | null)[];\n}\n\n/** The grid module, loaded once (from `module`), again after a failure */\nconst grid: { ready?: Promise<unknown> | undefined } = {};\n\n/** The grid module loaded from `module`, once (again after a failure) */\nconst gridModule = async (module: string | URL): Promise<void> => {\n const ready = grid.ready ?? initGrid({ module_or_path: module });\n\n grid.ready = ready;\n await ready.catch((error: unknown) => {\n grid.ready = undefined;\n throw error;\n });\n};\n\n/** The flows of a city's streets for a wind of 1 m/s towards the east and one towards the north, their east and north\n * velocities in each of `width` × `height` cells */\nexport interface StreetFlows {\n eastU: Float32Array;\n eastV: Float32Array;\n northU: Float32Array;\n northV: Float32Array;\n}\n\n/**\n * The streets' flows round buildings (their rings in cells from the north-west corner: `points` interleaved, the\n * first point of each ring, the first ring of each polygon, each with its end), by the grid module (`module`), after\n * `iterations` sweeps\n */\nexport const streetFlows = async (\n buildings: { points: Float64Array; ringStart: Uint32Array; polygonStart: Uint32Array },\n width: number,\n height: number,\n iterations: number,\n module: string | URL,\n): Promise<StreetFlows> => {\n await gridModule(module);\n\n const flow = streetFlow(buildings.points, buildings.ringStart, buildings.polygonStart, width, height, iterations);\n\n try {\n return { eastU: flow.eastU(), eastV: flow.eastV(), northU: flow.northU(), northV: flow.northV() };\n } finally {\n flow.free();\n }\n};\n\n/** Whether a value is a grid's description as the grid module writes it */\nconst isDescription = (value: unknown): value is GridDescription =>\n typeof value === 'object' &&\n value !== null &&\n 'name' in value &&\n 'width' in value &&\n 'height' in value &&\n 'bounds' in value &&\n Array.isArray(value.bounds);\n\n/**\n * The grids of a GRIB2 or classic NetCDF file's bytes, read by the grid module (`module`: its URL, loaded on first\n * use): their descriptions and values, apart (the values to transfer from a worker)\n */\nexport const decodeGrids = async (\n bytes: Uint8Array,\n module: string | URL,\n): Promise<{ grids: GridDescription[]; values: Float32Array[] }> => {\n await gridModule(module);\n\n const set = readGrids(bytes);\n\n try {\n const grids: GridDescription[] = [];\n const values: Float32Array[] = [];\n\n for (let i = 0; i < set.count(); i++) {\n const description: unknown = JSON.parse(set.meta(i));\n\n if (!isDescription(description)) throw new Error('isard: a grid without its description');\n grids.push(description);\n values.push(set.values(i));\n }\n\n return { grids, values };\n } finally {\n set.free();\n }\n};\n",
|
|
17
17
|
"/**\n * Things placed by a vector basemap's workers in its tiles (trees, street lamps, street furniture), as they send them\n * to the page: so many numbers each.\n */\n\n/** Numbers of a thing placed: longitude, latitude, scale, heading (degrees), rank (in [0, 1): far from the view, the\n * page keeps the lowest) and kind (its model among those of its kinds) */\nexport const PLACED_NUMBERS = 6;\n\n/** Where its rank is among its numbers */\nexport const PLACED_RANK = 4;\n\n/** Where its kind is among its numbers */\nexport const PLACED_KIND = 5;\n\n/** A heading for a number, the same each time, near numbers turned far apart (7919, a prime) */\nexport const turned = (n: number): number => (n * 7919) % 360;\n\n/** The kinds of furniture placed by the workers, in the order of their numbers (`PLACED_KIND`) */\nexport const FURNITURE = ['shelter', 'bin', 'postbox', 'fountain', 'rack', 'bench'] as const;\n",
|
|
18
|
-
"/**\n * Mapbox Vector Tiles (MVT 2.1) decoding: layers of features with their properties and geometry, in tile units\n * (`extent`, usually 4096 across). Points are lists of points, lines lists of lines, polygons lists of rings (the\n * outer ones clockwise in tile coordinates, y down, holes the other way round, as the specification says).\n */\n\nexport type Value = string | number | boolean;\n\nexport interface TileFeature {\n /** 1 point, 2 line, 3 polygon */\n type: 1 | 2 | 3;\n properties: Record<string, Value>;\n /** Point lists:
|
|
18
|
+
"/**\n * Mapbox Vector Tiles (MVT 2.1) decoding: layers of features with their properties and geometry, in tile units\n * (`extent`, usually 4096 across). Points are lists of points, lines lists of lines, polygons lists of rings (the\n * outer ones clockwise in tile coordinates, y down, holes the other way round, as the specification says).\n */\n\nexport type Value = string | number | boolean;\n\n/** A point list: x0, y0, x1, y1… in tile units */\nexport type Ring = ArrayLike<number>;\n\nexport interface TileFeature {\n /** 1 point, 2 line, 3 polygon */\n readonly type: 1 | 2 | 3;\n readonly properties: Record<string, Value>;\n /** Point lists (a decoded tile's: views made as they are read, of one buffer for its whole layer) */\n readonly geometry: readonly Ring[];\n}\n\n/** A layer's coordinates, one feature's after the other, and where each point list starts and ends */\ninterface Shapes {\n values: Int32Array;\n ranges: Uint32Array;\n}\n\n/**\n * A decoded feature: its point lists as two indices into its layer's `Shapes`, their views made each time they are\n * read. A city's tile holds some hundred thousand points in thirty thousand lists: as arrays (or views kept), some 6 to\n * 9 MB of a worker's heap a tile, which its full collections go through again and again; in one buffer, under 1 MB\n */\nclass Feature implements TileFeature {\n constructor(\n readonly type: 1 | 2 | 3,\n readonly properties: Record<string, Value>,\n private readonly shapes: Shapes,\n private readonly first: number,\n private readonly end: number,\n ) {}\n\n get geometry(): Int32Array[] {\n const { values, ranges } = this.shapes;\n const rings: Int32Array[] = [];\n\n for (let r = this.first; r < this.end; r += 2) rings.push(values.subarray(ranges[r], ranges[r + 1]));\n\n return rings;\n }\n}\n\nexport interface TileLayer {\n extent: number;\n features: TileFeature[];\n /** The heap it takes, about (`decodedBytes`) */\n bytes: number;\n}\n\n/** Protobuf reader of a buffer range */\nclass Pbf {\n pos: number;\n constructor(\n private readonly buf: Uint8Array,\n start = 0,\n readonly end = buf.length,\n ) {\n this.pos = start;\n }\n /** An unsigned varint, approximated beyond 2^53; all its bytes are read (up to 10), so the next field is right */\n varint(): number {\n let value = 0;\n\n for (let shift = 0; shift < 70; shift += 7) {\n const b = this.buf[this.pos++] ?? 0;\n\n value += (b & 0x7f) * 2 ** shift;\n if (b < 0x80) break;\n }\n\n return value;\n }\n /** A signed 64-bit varint (two's complement: a negative value takes 10 bytes) */\n int64(): number {\n let lo = 0;\n let hi = 0;\n\n for (let i = 0; i < 10; i += 1) {\n const b = this.buf[this.pos++] ?? 0;\n const bits = b & 0x7f;\n\n // Bits 0-27 in the low word, bits 28-31 split, the rest in the high word\n if (i < 4) lo |= bits << (7 * i);\n else if (i === 4) {\n lo |= (bits & 0x0f) << 28;\n hi |= bits >> 4;\n } else hi |= bits << (7 * i - 32);\n if (b < 0x80) break;\n }\n\n // The high word signed: values from 2^63 up are negative\n return (hi | 0) * 2 ** 32 + (lo >>> 0);\n }\n sint(): number {\n const v = this.varint();\n\n return v % 2 === 1 ? -(v + 1) / 2 : v / 2;\n }\n /** A length-delimited field as a sub-reader */\n sub(): Pbf {\n const n = this.varint();\n // A length past the end (a truncated tile) stops at the end\n const end = Math.min(this.pos + n, this.end);\n const r = new Pbf(this.buf, this.pos, end);\n\n this.pos = end;\n\n return r;\n }\n string(): string {\n const n = this.varint();\n const end = Math.min(this.pos + n, this.end);\n const s = decoder.decode(this.buf.subarray(this.pos, end));\n\n this.pos = end;\n\n return s;\n }\n float(): number {\n const v = this.pos + 4 <= this.end ? this.view().getFloat32(this.pos, true) : 0;\n\n this.pos += 4;\n\n return v;\n }\n double(): number {\n const v = this.pos + 8 <= this.end ? this.view().getFloat64(this.pos, true) : 0;\n\n this.pos += 8;\n\n return v;\n }\n private view(): DataView {\n return new DataView(this.buf.buffer, this.buf.byteOffset, this.buf.byteLength);\n }\n skip(wire: number): void {\n if (wire === 0) this.varint();\n else if (wire === 1) this.pos += 8;\n else if (wire === 2) this.pos += this.varint();\n else if (wire === 5) this.pos += 4;\n }\n get more(): boolean {\n return this.pos < this.end;\n }\n}\n\nconst decoder = new TextDecoder();\n\nconst value = (p: Pbf): Value => {\n let v: Value = '';\n\n while (p.more) {\n const tag = p.varint();\n\n switch (tag >> 3) {\n case 1:\n v = p.string();\n break;\n case 2:\n v = p.float();\n break;\n case 3:\n v = p.double();\n break;\n case 4:\n v = p.int64();\n break;\n case 5:\n v = p.varint();\n break;\n case 6:\n v = p.sint();\n break;\n case 7:\n v = p.varint() !== 0;\n break;\n default:\n p.skip(tag & 7);\n }\n }\n\n return v;\n};\n\n/** The coordinates of a layer's features, one after the other, and where each point list starts and ends */\nclass Coordinates {\n values = new Int32Array(1024);\n length = 0;\n /** Per point list: its first value and its end */\n readonly ranges: number[] = [];\n\n push(x: number, y: number): void {\n if (this.length + 2 > this.values.length) {\n const grown = new Int32Array(this.values.length * 2);\n\n grown.set(this.values);\n this.values = grown;\n }\n this.values[this.length++] = x;\n this.values[this.length++] = y;\n }\n\n /** The values and ranges cut to their lengths (once all are pushed) */\n shapes(): Shapes {\n return { values: this.values.slice(0, this.length), ranges: Uint32Array.from(this.ranges) };\n }\n}\n\n/** Pushes the point lists of a geometry's commands (MoveTo, LineTo, ClosePath) */\nconst geometry = (p: Pbf, out: Coordinates): void => {\n let [x, y] = [0, 0];\n // The first value of the current point list (none before a MoveTo)\n let start = -1;\n const close = () => {\n if (start >= 0) out.ranges.push(start, out.length);\n };\n\n while (p.more) {\n const command = p.varint();\n const id = command & 7;\n const count = command >> 3;\n\n if (id === 7) {\n // ClosePath: back to the first point\n if (start >= 0 && out.length > start) out.push(out.values[start] ?? 0, out.values[start + 1] ?? 0);\n continue;\n }\n // A count past the end (a truncated geometry) stops there\n for (let i = 0; i < count && p.more; i += 1) {\n x += p.sint();\n y += p.sint();\n if (id === 1) {\n close();\n start = out.length;\n }\n if (start >= 0) out.push(x, y);\n }\n }\n close();\n};\n\n/** The heap a decoded tile takes, about (bytes): its features with their properties, their coordinates (measured on a\n * city's tile in Bun's JavaScriptCore, Safari's engine) */\nexport const decodedBytes = (tile: Map<string, TileLayer>): number =>\n [...tile.values()].reduce((sum, layer) => sum + layer.bytes, 0);\n/** A feature and its properties, about (bytes) */\nconst FEATURE_BYTES = 270;\n\n/** Decodes a tile; only the layers in `wanted` (all if undefined) */\nexport const decode = (bytes: Uint8Array, wanted?: Set<string>): Map<string, TileLayer> => {\n const layers = new Map<string, TileLayer>();\n const tile = new Pbf(bytes);\n\n while (tile.more) {\n const tag = tile.varint();\n\n if (tag >> 3 !== 3) {\n tile.skip(tag & 7);\n continue;\n }\n\n const l = tile.sub();\n let name = '';\n let extent = 4096;\n const keys: string[] = [];\n const values: Value[] = [];\n const raw: Pbf[] = [];\n\n while (l.more) {\n const t = l.varint();\n\n switch (t >> 3) {\n case 1:\n name = l.string();\n break;\n case 2:\n raw.push(l.sub());\n break;\n case 3:\n keys.push(l.string());\n break;\n case 4:\n values.push(value(l.sub()));\n break;\n case 5:\n extent = l.varint();\n break;\n default:\n l.skip(t & 7);\n }\n }\n if (wanted && !wanted.has(name)) continue;\n\n const decoded: [type: 1 | 2 | 3, properties: Record<string, Value>, first: number, end: number][] = [];\n const coordinates = new Coordinates();\n\n for (const f of raw) {\n let type: 1 | 2 | 3 = 1;\n const properties: Record<string, Value> = {};\n const first = coordinates.ranges.length;\n\n while (f.more) {\n const t = f.varint();\n\n switch (t >> 3) {\n case 2: {\n const tags = f.sub();\n\n while (tags.more) {\n const k = keys[tags.varint()];\n const v = values[tags.varint()];\n\n if (k !== undefined && v !== undefined) properties[k] = v;\n }\n break;\n }\n case 3:\n type = Math.min(3, Math.max(1, f.varint())) as 1 | 2 | 3;\n break;\n case 4:\n geometry(f.sub(), coordinates);\n break;\n default:\n f.skip(t & 7);\n }\n }\n decoded.push([type, properties, first, coordinates.ranges.length]);\n }\n\n const shapes = coordinates.shapes();\n const features = decoded.map(([type, properties, first, end]) => new Feature(type, properties, shapes, first, end));\n const bytes = features.length * FEATURE_BYTES + shapes.values.byteLength + shapes.ranges.byteLength;\n\n layers.set(name, { extent, features, bytes });\n }\n\n return layers;\n};\n",
|
|
19
19
|
"/**\n * PMTiles v3 archives: one file of tiles read by HTTP range requests (or from a `Blob`), as Protomaps publishes them.\n * The header and root directory in one request, the leaf directories as needed (kept in a small cache), each tile in\n * its own range; gzip through `DecompressionStream`. The same reader in the page (raster tiles) and in the basemap\n * workers (vector tiles of a style source `pmtiles://…`, as MapLibre's protocol names them).\n */\n\nimport { httpError } from '../util/fetch.ts';\nimport { isRecord } from '../util/guards.ts';\nimport { Lru } from '../util/lru.ts';\nimport { withHeaders } from '../util/requests.ts';\n\n/** What a PMTiles archive's tiles are */\nexport type PmtilesTileType = 'unknown' | 'mvt' | 'png' | 'jpeg' | 'webp' | 'avif';\n\n/** The header of a PMTiles archive (v3) */\nexport interface PmtilesHeader {\n rootDirectoryOffset: number;\n rootDirectoryLength: number;\n metadataOffset: number;\n metadataLength: number;\n leafDirectoryOffset: number;\n leafDirectoryLength: number;\n tileDataOffset: number;\n tileDataLength: number;\n /** 1 none, 2 gzip, 3 brotli, 4 zstd (only none and gzip are read) */\n internalCompression: number;\n tileCompression: number;\n tileType: PmtilesTileType;\n minZoom: number;\n maxZoom: number;\n /** `[west, south, east, north]`, degrees */\n bounds: [number, number, number, number];\n center: [lon: number, lat: number, zoom: number];\n}\n\n/** An entry of a directory: a run of tiles (`runLength` > 0) or a leaf directory (0) */\nexport interface PmtilesEntry {\n tileId: number;\n offset: number;\n length: number;\n runLength: number;\n}\n\nconst HEADER = 127;\n/** The header and the root directory lie within the first 16 KB of the file */\nconst FIRST = 16384;\nconst TYPES: PmtilesTileType[] = ['unknown', 'mvt', 'png', 'jpeg', 'webp', 'avif'];\n\n/** Tiles before level z: (4^z - 1) / 3 */\nconst levelStart = (z: number) => (4 ** z - 1) / 3;\n\n/** The tile id of z/x/y: the tiles of the lower levels, then the position along the level's Hilbert curve */\nexport const zxyToTileId = (z: number, x: number, y: number): number => {\n if (z > 26) throw new Error(`isard: PMTiles level ${z} past 26`);\n\n const n = 2 ** z;\n\n if (x < 0 || y < 0 || x >= n || y >= n) throw new Error(`isard: PMTiles tile ${z}/${x}/${y} out of its level`);\n\n let [px, py] = [x, y];\n let d = 0;\n\n for (let s = n / 2; s >= 1; s /= 2) {\n const rx = (px & s) > 0 ? 1 : 0;\n const ry = (py & s) > 0 ? 1 : 0;\n\n d += s * s * ((3 * rx) ^ ry);\n if (ry === 0) {\n if (rx === 1) [px, py] = [s - 1 - px, s - 1 - py];\n [px, py] = [py, px];\n }\n }\n\n return levelStart(z) + d;\n};\n\n/** The z/x/y of a tile id (the inverse of `zxyToTileId`) */\nexport const tileIdToZxy = (id: number): [z: number, x: number, y: number] => {\n let z = 0;\n\n while (levelStart(z + 1) <= id) z += 1;\n\n const n = 2 ** z;\n let t = id - levelStart(z);\n let [x, y] = [0, 0];\n\n for (let s = 1; s < n; s *= 2) {\n // Arithmetic, not bitwise: positions pass 32 bits past level 16\n const rx = Math.floor(t / 2) % 2;\n const ry = (t % 2) ^ rx;\n\n if (ry === 0) {\n if (rx === 1) [x, y] = [s - 1 - x, s - 1 - y];\n [x, y] = [y, x];\n }\n x += s * rx;\n y += s * ry;\n t = Math.floor(t / 4);\n }\n\n return [z, x, y];\n};\n\n/** A reader of unsigned varints past 32 bits (tile ids reach 2^52) */\nclass Varints {\n pos = 0;\n constructor(private readonly bytes: Uint8Array) {}\n next(): number {\n let value = 0;\n let scale = 1;\n\n for (;;) {\n const b = this.bytes[this.pos++];\n\n if (b === undefined) throw new Error('isard: PMTiles directory truncated');\n value += (b & 0x7f) * scale;\n if (b < 0x80) return value;\n scale *= 128;\n if (scale > 2 ** 63) throw new Error('isard: PMTiles varint too long');\n }\n }\n}\n\n/** The entries of a directory (decompressed) */\nexport const parseDirectory = (bytes: Uint8Array): PmtilesEntry[] => {\n const v = new Varints(bytes);\n const count = v.next();\n\n if (count > bytes.length) throw new Error('isard: PMTiles directory larger than its bytes');\n\n const entries: PmtilesEntry[] = [];\n let id = 0;\n\n for (let i = 0; i < count; i += 1) {\n id += v.next();\n entries.push({ tileId: id, offset: 0, length: 0, runLength: 1 });\n }\n for (const e of entries) e.runLength = v.next();\n for (const e of entries) e.length = v.next();\n entries.forEach((e, i) => {\n const value = v.next();\n const previous = entries[i - 1];\n\n // 0 after the first: right after the previous entry's bytes\n e.offset = value === 0 && previous ? previous.offset + previous.length : value - 1;\n });\n\n return entries;\n};\n\n/** The entry holding a tile id: its run of tiles, or the leaf directory it falls in; undefined if none */\nexport const findEntry = (entries: readonly PmtilesEntry[], id: number): PmtilesEntry | undefined => {\n let [lo, hi] = [0, entries.length - 1];\n\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const e = entries[mid];\n\n if (!e) break;\n if (e.tileId === id) return e;\n if (e.tileId < id) lo = mid + 1;\n else hi = mid - 1;\n }\n\n const e = entries[hi];\n\n if (!e) return undefined;\n if (e.runLength === 0 || id - e.tileId < e.runLength) return e;\n\n return undefined;\n};\n\n/** The header of an archive from its first bytes */\nexport const parseHeader = (bytes: Uint8Array): PmtilesHeader => {\n if (bytes.length < HEADER || String.fromCharCode(...bytes.subarray(0, 7)) !== 'PMTiles') {\n throw new Error('isard: not a PMTiles archive');\n }\n if (bytes[7] !== 3) throw new Error(`isard: PMTiles version ${bytes[7]} (only 3 is read)`);\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const u64 = (at: number) => Number(view.getBigUint64(at, true));\n const deg = (at: number) => view.getInt32(at, true) / 1e7;\n\n return {\n rootDirectoryOffset: u64(8),\n rootDirectoryLength: u64(16),\n metadataOffset: u64(24),\n metadataLength: u64(32),\n leafDirectoryOffset: u64(40),\n leafDirectoryLength: u64(48),\n tileDataOffset: u64(56),\n tileDataLength: u64(64),\n internalCompression: view.getUint8(97),\n tileCompression: view.getUint8(98),\n tileType: TYPES[view.getUint8(99)] ?? 'unknown',\n minZoom: view.getUint8(100),\n maxZoom: view.getUint8(101),\n bounds: [deg(102), deg(106), deg(110), deg(114)],\n center: [deg(119), deg(123), view.getUint8(118)],\n };\n};\n\n/** Bytes as they are stored, decompressed (1: none, 2: gzip; 0, unknown, is read as none) */\nexport const decompress = async (\n bytes: Uint8Array<ArrayBuffer>,\n compression: number,\n): Promise<Uint8Array<ArrayBuffer>> => {\n if (compression === 0 || compression === 1) return bytes;\n if (compression !== 2) {\n throw new Error(`isard: PMTiles compression ${compression === 3 ? 'brotli' : 'zstd'} is not read (gzip only)`);\n }\n\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip'));\n\n return new Uint8Array(await new Response(stream).arrayBuffer());\n};\n\n/** Past this, a whole file sent for a range request (a server ignoring ranges) is an error rather than kept */\nconst WHOLE_FILE_MAX = 64 * 1024 * 1024;\n\n/** A PMTiles archive at a URL (range requests) or in a `Blob` (a dropped file) */\nexport class PMTiles {\n private head: Promise<{ header: PmtilesHeader; root: PmtilesEntry[] }> | undefined;\n /** The leaf directories read, by offset */\n private readonly leaves = new Lru<number, Promise<PmtilesEntry[]>>(64);\n /** The whole file, when the server answered a range request with it (small files, `blob:` URLs) */\n private whole: Promise<Uint8Array<ArrayBuffer>> | undefined;\n\n constructor(readonly source: string | Blob) {}\n\n /** `length` bytes from `offset` */\n private async range(offset: number, length: number, signal?: AbortSignal): Promise<Uint8Array<ArrayBuffer>> {\n if (typeof this.source !== 'string') {\n return new Uint8Array(await this.source.slice(offset, offset + length).arrayBuffer());\n }\n if (this.whole) return (await this.whole).subarray(offset, offset + length);\n\n const response = await fetch(\n this.source,\n withHeaders(this.source, {\n headers: { Range: `bytes=${offset}-${offset + Math.max(length, 1) - 1}` },\n ...(signal ? { signal } : {}),\n }),\n );\n\n if (!response.ok) throw httpError(this.source, response.status);\n if (response.status === 206) return new Uint8Array(await response.arrayBuffer());\n\n // The whole file: kept, when small enough, for the next ranges\n const size = Number(response.headers.get('Content-Length'));\n\n if (size > WHOLE_FILE_MAX) {\n await response.body?.cancel();\n throw new Error(`isard: ${this.source}: the server ignores range requests (HTTP 206 expected)`);\n }\n\n const whole = response.arrayBuffer().then((b) => new Uint8Array(b));\n\n this.whole = whole;\n whole.catch(() => {\n this.whole = undefined;\n });\n\n return (await whole).subarray(offset, offset + length);\n }\n\n private load() {\n this.head ??= (async () => {\n const first = await this.range(0, FIRST);\n const header = parseHeader(first);\n const { rootDirectoryOffset: o, rootDirectoryLength: n } = header;\n const raw = o + n <= first.length ? first.subarray(o, o + n) : await this.range(o, n);\n const root = parseDirectory(await decompress(raw, header.internalCompression));\n\n return { header, root };\n })();\n // A failure is not kept: asked again next time\n this.head.catch(() => {\n this.head = undefined;\n });\n\n return this.head;\n }\n\n /** The archive's header */\n async header(): Promise<PmtilesHeader> {\n return (await this.load()).header;\n }\n\n /** The archive's JSON metadata (`vector_layers`, `attribution`, `name`…); `{}` if it has none */\n async metadata(): Promise<Record<string, unknown>> {\n const { header } = await this.load();\n\n if (header.metadataLength === 0) return {};\n\n const raw = await this.range(header.metadataOffset, header.metadataLength);\n const text = new TextDecoder().decode(await decompress(raw, header.internalCompression));\n const value: unknown = JSON.parse(text);\n\n return isRecord(value) ? value : {};\n }\n\n private leaf(header: PmtilesHeader, entry: PmtilesEntry): Promise<PmtilesEntry[]> {\n const offset = header.leafDirectoryOffset + entry.offset;\n const cached = this.leaves.get(offset);\n\n if (cached) return cached;\n\n const leaf = this.range(offset, entry.length).then(async (raw) =>\n parseDirectory(await decompress(raw, header.internalCompression)),\n );\n\n leaf.catch(() => this.leaves.delete(offset));\n this.leaves.set(offset, leaf);\n\n return leaf;\n }\n\n /** The bytes of tile z/x/y, decompressed (a vector tile ungzipped); undefined where the archive has none */\n async tile(z: number, x: number, y: number, signal?: AbortSignal): Promise<Uint8Array<ArrayBuffer> | undefined> {\n const { header, root } = await this.load();\n\n if (z < header.minZoom || z > header.maxZoom) return undefined;\n\n const id = zxyToTileId(z, x, y);\n let entries = root;\n\n // The root, then at most three levels of leaves\n for (let depth = 0; depth < 4; depth += 1) {\n const entry = findEntry(entries, id);\n\n if (!entry) return undefined;\n if (entry.runLength > 0) {\n const raw = await this.range(header.tileDataOffset + entry.offset, entry.length, signal);\n\n return decompress(raw, header.tileCompression);\n }\n entries = await this.leaf(header, entry);\n }\n throw new Error('isard: PMTiles directories nested too deep');\n }\n}\n\n/** The archives opened, by URL: one reader (and its directory cache) per archive in a page or worker */\nconst archives = new Lru<string, PMTiles>(16);\n\n/** The reader of an archive URL (without `pmtiles://`), shared */\nexport const pmtiles = (url: string): PMTiles => {\n const cached = archives.get(url);\n\n if (cached) return cached;\n\n const archive = new PMTiles(url);\n\n archives.set(url, archive);\n\n return archive;\n};\n\n/** The URL of the page (or of the worker); undefined out of a browser */\nconst pageUrl = (): string | undefined => {\n const location: unknown = Reflect.get(globalThis, 'location');\n\n return isRecord(location) && typeof location.href === 'string' ? location.href : undefined;\n};\n\n/** The archive URL of a `pmtiles://` URL, absolute (relative to the page), or undefined for another URL */\nexport const pmtilesUrl = (url: string, base?: string): string | undefined => {\n if (!url.startsWith('pmtiles://')) return undefined;\n\n const inner = url.slice('pmtiles://'.length);\n const from = base ?? pageUrl();\n\n try {\n return from ? new URL(inner, from).href : inner;\n } catch {\n return inner;\n }\n};\n\n/** A tile URL `pmtiles://<archive>/{z}/{x}/{y}` (with its numbers in) read from its archive: its bytes, undefined\n * where there is none; undefined too (`false`) for a URL that is not one */\nexport const pmtilesTile = (\n url: string,\n signal?: AbortSignal,\n): Promise<Uint8Array<ArrayBuffer> | undefined> | false => {\n const match = /^pmtiles:\\/\\/(.+)\\/(\\d+)\\/(\\d+)\\/(\\d+)$/.exec(url);\n\n if (!match) return false;\n\n const [, archive = '', z, x, y] = match;\n\n return pmtiles(archive).tile(Number(z), Number(x), Number(y), signal);\n};\n",
|
|
20
|
-
"/** The state a basemap worker shares among its jobs: the renderers (a style's layers over a source), the decoded vector\n * tiles and raster images it keeps, the requests in progress, and the style's values as its jobs read them */\n\nimport { decode, type TileLayer } from '../../basemap/mvt.ts';\nimport { pmtilesTile } from '../../basemap/pmtiles.ts';\nimport {\n type Context,\n color,\n css,\n evaluate,\n isExpression,\n type RasterSource,\n type StyleLayer,\n} from '../../basemap/vectorstyle.ts';\nimport { httpError } from '../../util/fetch.ts';\nimport { latitude, longitude, tileUrl } from '../../util/geo.ts';\nimport { Lru } from '../../util/lru.ts';\nimport { clamp } from '../../util/math.ts';\nimport { withHeaders } from '../../util/requests.ts';\nimport type { Priority } from './protocol.ts';\n\nexport interface Renderer {\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n rasters: Record<string, RasterSource>;\n sprites: Sprite[];\n /** Fill patterns by icon name, cut from the sprites once */\n patterns: Map<string, OffscreenCanvas | undefined>;\n}\n\n/** A sprite of the style: its images by name (`id:name` but in the default sprite) and its sheet */\nexport interface Sprite {\n image: ImageBitmap;\n icons: Record<string, { x: number; y: number; width: number; height: number; pixelRatio?: number }>;\n}\n\n/** An image of the sprites and its sheet */\nexport const spriteIcon = (r: Renderer, name: string) => {\n const sprite = r.sprites.find((sp) => Boolean(sp.icons[name]));\n const icon = sprite?.icons[name];\n\n return sprite && icon ? { icon, image: sprite.image } : undefined;\n};\n\nexport const renderers = new Map<string, Renderer>();\n/**
|
|
21
|
-
"/** The label candidates of a tile: the texts and icons of the style's symbol layers, for the page to shape and place */\n\nimport type { TileFeature } from '../../basemap/mvt.ts';\nimport {\n type CandidateIcon,\n type CandidateOverlap,\n type Context,\n context,\n filter,\n isExpression,\n isFeatureDependent,\n type Json,\n type LabelCandidate,\n labelFont,\n type StyleLayer,\n text,\n zoomStops,\n} from '../../basemap/vectorstyle.ts';\nimport { tileUrl } from '../../util/geo.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, shown, tile, value } from './tiles.ts';\n\n/** The line kept on each side of a text along it (CSS pixels): half the longest text that follows a line's bends */\nconst PATH_PIXELS = 300;\n\n/** How a layer's text or icon (`prefix`) meets the others: allowed to overlap, ignored by the placement */\nconst overlapOf = (layer: StyleLayer, prefix: 'text' | 'icon', ctx: Context): CandidateOverlap => {\n const allow = Boolean(value(layer, 'layout', `${prefix}-allow-overlap`, ctx, false));\n const ignore = Boolean(value(layer, 'layout', `${prefix}-ignore-placement`, ctx, false));\n\n if (allow && ignore) return true;\n if (allow) return 'allow';\n\n return ignore ? 'ignore' : false;\n};\n\n/** A pair of numbers of a style value, `fallback` if it is not one */\nconst pair = (v: unknown, fallback: [number, number]): [number, number] => {\n return Array.isArray(v) ? [Number(v[0] ?? fallback[0]), Number(v[1] ?? fallback[1])] : fallback;\n};\n\n/** Top, right, bottom, left of one to four numbers, as CSS's sides */\nconst sides = (v: unknown): [number, number, number, number] => {\n const n = (Array.isArray(v) ? v : [v]).map((x) => Number(x) || 0);\n const [top = 0, right = top, bottom = top, left = right] = n;\n\n return [top, right, bottom, left];\n};\n\n/** A label's text in the case of its `text-transform` */\nconst cased = (t: string, transform: unknown): string => {\n if (transform === 'uppercase') return t.toUpperCase();\n if (transform === 'lowercase') return t.toLowerCase();\n\n return t;\n};\n\n/** Points every `spacing` along a line (tile units, x and y interleaved), the first half a spacing in (the middle of a\n * shorter line): each point, the segment it lies on and how far along the line it is (x, y, x0, y0, x1, y1, the\n * distance) */\nexport const lineAnchors = (line: readonly number[], spacing: number): number[][] => {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n\n const out: number[][] = [];\n\n if (!(length > 0) || !(spacing > 0)) return out;\n\n let next = Math.min(spacing / 2, length / 2);\n let walked = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n while (d > 0 && next <= walked + d) {\n const t = (next - walked) / d;\n\n out.push([ax + (bx - ax) * t, ay + (by - ay) * t, ax, ay, bx, by, next]);\n next += spacing;\n }\n walked += d;\n }\n\n return out;\n};\n\n/** The point `offset` (tile units) beside a line's anchor (`lineAnchors`), the `k`th anchor's on one side of the line,\n * the next one's on the other: x, y and its heading facing the line (degrees; y towards the south in the tile) */\nexport const besideLine = (\n anchor: readonly number[],\n k: number,\n offset: number,\n): [x: number, y: number, heading: number] => {\n const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] = anchor;\n const length = Math.hypot(bx - ax, by - ay) || 1;\n const sign = k % 2 === 0 ? 1 : -1;\n const [nx, ny] = [(-(by - ay) / length) * sign, ((bx - ax) / length) * sign];\n\n return [px + nx * offset, py + ny * offset, (Math.atan2(-nx, ny) * 180) / Math.PI];\n};\n\n/** The part of a line (tile units, interleaved) from `from` to `to` along it (distances from its start) */\nexport const lineBetween = (line: readonly number[], from: number, to: number): number[] => {\n const out: number[] = [];\n let walked = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n const [s0, s1] = [walked, walked + d];\n\n walked = s1;\n if (d <= 0 || s1 < from || s0 > to) continue;\n\n const at = (s: number) => [ax + ((bx - ax) * (s - s0)) / d, ay + ((by - ay) * (s - s0)) / d];\n\n if (out.length === 0) out.push(...at(Math.max(from, s0)));\n out.push(...at(Math.min(to, s1)));\n }\n\n return out;\n};\n\n/** The icon of a label: its layer's icon properties for the feature */\nconst iconOf = (\n layer: StyleLayer,\n image: string,\n ctx: Context,\n placement: 'point' | 'line',\n sizeOf: (layer: StyleLayer) => Json,\n): CandidateIcon => {\n const alignment = value(layer, 'layout', 'icon-rotation-alignment', ctx, 'auto');\n const fit = String(value(layer, 'layout', 'icon-text-fit', ctx, 'none'));\n const padding = value(layer, 'layout', 'icon-text-fit-padding', ctx, [0, 0, 0, 0]);\n\n return {\n image,\n size: isFeatureDependent(layer.layout?.['icon-size'])\n ? Number(value(layer, 'layout', 'icon-size', ctx, 1))\n : sizeOf(layer),\n anchor: String(value(layer, 'layout', 'icon-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'icon-offset', ctx, [0, 0]), [0, 0]),\n rotate: Number(value(layer, 'layout', 'icon-rotate', ctx, 0)) || 0,\n alignment: alignment === 'map' || (alignment === 'auto' && placement === 'line') ? 'map' : 'viewport',\n overlap: overlapOf(layer, 'icon', ctx),\n optional: Boolean(value(layer, 'layout', 'icon-optional', ctx, false)),\n fit: fit === 'width' || fit === 'height' || fit === 'both' ? fit : 'none',\n padding: sides(padding),\n color: String(value(layer, 'paint', 'icon-color', ctx, '#000')),\n opacity: Number(value(layer, 'paint', 'icon-opacity', ctx, 1)),\n };\n};\n\n/** Squares across a tile of the grid the buildings are found by */\nconst ROOF_GRID = 16;\n\n/**\n * The height of the building under a point of a tile (its units), the highest if several: the buildings of the\n * style's `fill-extrusion` layers shown at `zoom`, at their `fill-extrusion-height`; undefined outside them. A label\n * there stands on its roof, not hidden by its walls. The buildings found through a grid of the tile's squares\n */\nexport const roofsOf = (\n r: Renderer,\n layers: Map<string, { extent: number; features: TileFeature[] }>,\n zoom: number,\n): ((px: number, py: number) => number | undefined) => {\n const buildings: { rings: number[][]; height: number; box: [number, number, number, number] }[] = [];\n const cells = new Map<number, number[]>();\n let extent = 4096;\n\n r.layers.forEach((layer) => {\n if (layer.type !== 'fill-extrusion' || !shown(layer, zoom)) return;\n\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n extent = data.extent;\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (f.type !== 3 || !filter(layer.filter, ctx)) continue;\n\n const height = Number(value(layer, 'paint', 'fill-extrusion-height', ctx, 0));\n\n if (!(height > 0)) continue;\n\n const box: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n\n for (const ring of f.geometry)\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const [x, y] = [ring[i] ?? 0, ring[i + 1] ?? 0];\n\n box[0] = Math.min(box[0], x);\n box[1] = Math.min(box[1], y);\n box[2] = Math.max(box[2], x);\n box[3] = Math.max(box[3], y);\n }\n buildings.push({ rings: f.geometry, height, box });\n }\n });\n\n const cellOf = (v: number) => Math.max(0, Math.min(ROOF_GRID - 1, Math.floor((v / extent) * ROOF_GRID)));\n\n buildings.forEach(({ box }, b) => {\n for (let cy = cellOf(box[1]); cy <= cellOf(box[3]); cy++)\n for (let cx = cellOf(box[0]); cx <= cellOf(box[2]); cx++) {\n const k = cy * ROOF_GRID + cx;\n const cell = cells.get(k);\n\n if (cell) cell.push(b);\n else cells.set(k, [b]);\n }\n });\n\n /** Whether a point is inside rings (even-odd: the holes left out) */\n const inside = (rings: number[][], px: number, py: number): boolean => {\n let odd = false;\n\n for (const ring of rings)\n for (let i = 0, j = ring.length - 2; i + 1 < ring.length; j = i, i += 2) {\n const [xi, yi, xj, yj] = [ring[i] ?? 0, ring[i + 1] ?? 0, ring[j] ?? 0, ring[j + 1] ?? 0];\n\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) odd = !odd;\n }\n\n return odd;\n };\n\n return (px, py) =>\n (cells.get(cellOf(py) * ROOF_GRID + cellOf(px)) ?? []).reduce<number | undefined>((top, b) => {\n const building = buildings[b];\n\n return building && inside(building.rings, px, py) ? Math.max(top ?? 0, building.height) : top;\n }, undefined);\n};\n\nexport const labels = async (r: Renderer, work: WorkOf<'labels'>): Promise<LabelCandidate[]> => {\n const { z, x, y, id, priority, zoom = z, roofs = false } = work;\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return [];\n\n const out: LabelCandidate[] = [];\n // Only when the page hides the labels behind the buildings: the buildings of the tile in a grid\n const roofAt = roofs ? roofsOf(r, layers, zoom) : () => undefined;\n // The text size of a layer when it depends on the zoom only: legacy stops as they are, an expression as stops\n const sizes = new Map<StyleLayer, Json>();\n const sizeOf = (layer: StyleLayer): Json => {\n const known = sizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['text-size'] ?? 16;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n sizes.set(layer, s);\n\n return s;\n };\n // The icon size of a layer when it depends on the zoom only, as the text size\n const iconSizes = new Map<StyleLayer, Json>();\n const iconSizeOf = (layer: StyleLayer): Json => {\n const known = iconSizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['icon-size'] ?? 1;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n iconSizes.set(layer, s);\n\n return s;\n };\n\n r.layers.forEach((layer, index) => {\n const layout = layer.layout ?? {};\n\n if (layer.type !== 'symbol' || !shown(layer, zoom)) return;\n if (layout['text-field'] === undefined && layout['icon-image'] === undefined) return;\n\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n const placement = value(layer, 'layout', 'symbol-placement', zctx, 'point') === 'line' ? 'line' : 'point';\n const textAlong =\n placement === 'line' && value(layer, 'layout', 'text-rotation-alignment', zctx, 'auto') !== 'viewport';\n\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (!filter(layer.filter, ctx)) continue;\n\n const field = text(layout['text-field'], ctx).trim();\n const image = text(layout['icon-image'], ctx).trim();\n\n if (!field && !image) continue;\n\n const t = cased(field, value(layer, 'layout', 'text-transform', ctx, 'none'));\n const fonts = value(layer, 'layout', 'text-font', ctx, ['Noto Sans Regular']);\n const font = labelFont(Array.isArray(fonts) && typeof fonts[0] === 'string' ? fonts[0] : 'Noto Sans Regular');\n const base = {\n layer: index,\n text: t,\n font,\n // Zoom stops are kept for the engine; a value of the feature evaluated here\n size: isFeatureDependent(layer.layout?.['text-size'])\n ? Number(value(layer, 'layout', 'text-size', ctx, 16))\n : sizeOf(layer),\n color: String(value(layer, 'paint', 'text-color', ctx, '#000')),\n haloColor: String(value(layer, 'paint', 'text-halo-color', ctx, 'rgba(0,0,0,0)')),\n haloWidth: Number(value(layer, 'paint', 'text-halo-width', ctx, 0)),\n anchor: String(value(layer, 'layout', 'text-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'text-offset', ctx, [0, 0]), [0, 0]),\n maxWidth: Number(value(layer, 'layout', 'text-max-width', ctx, 10)),\n lineHeight: Number(value(layer, 'layout', 'text-line-height', ctx, 1.2)),\n overlap: overlapOf(layer, 'text', ctx),\n ...(textAlong ? { textAlong } : {}),\n ...(value(layer, 'layout', 'text-optional', ctx, false) ? { textOptional: true } : {}),\n ...(image ? { icon: iconOf(layer, image, ctx, placement, iconSizeOf) } : {}),\n };\n\n if (f.type === 1) {\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n const [px, py] = [point[i] ?? 0, point[i + 1] ?? 0];\n\n // Points in the buffer belong to the neighbouring tile\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const height = roofAt(px, py);\n\n out.push({ ...base, lon, lat, ...(height === undefined ? {} : { height }) });\n }\n }\n } else if (!t && placement === 'line') {\n // Icons alone along lines (one-way arrows): every `symbol-spacing` CSS pixels (a tile is 512 across at its\n // level, twice as many at each zoom past it)\n const spacing =\n (Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * data.extent) / (512 * 2 ** (zoom - z));\n\n for (const line of f.geometry) {\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] of lineAnchors(line, Math.max(spacing, 1))) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0] });\n }\n }\n } else if (t && textAlong) {\n // Texts along lines every `symbol-spacing` CSS pixels, each with the line around it, as long before as after\n // (up to `PATH_PIXELS`), for the text to follow its bends; the placement keeps those that fit\n const pixels = data.extent / (512 * 2 ** (zoom - z));\n const spacing = Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * pixels;\n\n for (const line of f.geometry) {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length < data.extent / 32) continue;\n\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0, s = 0] of lineAnchors(\n line,\n Math.max(spacing, 1),\n )) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const half = Math.min(s, length - s, PATH_PIXELS * pixels);\n const part = lineBetween(line, s - half, s + half);\n const path: number[] = [];\n\n for (let i = 0; i + 1 < part.length; i += 2)\n path.push(...lonLat(z, x, y, data.extent, part[i] ?? 0, part[i + 1] ?? 0));\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0], ...(path.length >= 4 ? { path } : {}) });\n }\n }\n } else {\n // The middle of the longest line inside the tile, along it\n let best: number[] | undefined;\n let bestLength = 0;\n\n for (const line of f.geometry) {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length > bestLength) {\n bestLength = length;\n best = line;\n }\n }\n if (!best || bestLength < data.extent / 32) continue;\n\n let rest = bestLength / 2;\n\n for (let i = 2; i + 1 < best.length; i += 2) {\n const [ax, ay, bx, by] = [best[i - 2] ?? 0, best[i - 1] ?? 0, best[i] ?? 0, best[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n if (d >= rest && d > 0) {\n const [px, py] = [ax + ((bx - ax) * rest) / d, ay + ((by - ay) * rest) / d];\n\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) break;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, ...(placement === 'line' ? { along: [lon1 - lon0, lat1 - lat0] } : {}) });\n break;\n }\n rest -= d;\n }\n }\n }\n });\n\n return out;\n};\n",
|
|
20
|
+
"/** The state a basemap worker shares among its jobs: the renderers (a style's layers over a source), the decoded vector\n * tiles and raster images it keeps, the requests in progress, and the style's values as its jobs read them */\n\nimport { decode, decodedBytes, type TileLayer } from '../../basemap/mvt.ts';\nimport { pmtilesTile } from '../../basemap/pmtiles.ts';\nimport {\n type Context,\n color,\n css,\n evaluate,\n isExpression,\n type RasterSource,\n type StyleLayer,\n} from '../../basemap/vectorstyle.ts';\nimport { httpError } from '../../util/fetch.ts';\nimport { latitude, longitude, tileUrl } from '../../util/geo.ts';\nimport { Lru } from '../../util/lru.ts';\nimport { clamp } from '../../util/math.ts';\nimport { withHeaders } from '../../util/requests.ts';\nimport type { Priority } from './protocol.ts';\n\nexport interface Renderer {\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n rasters: Record<string, RasterSource>;\n sprites: Sprite[];\n /** Fill patterns by icon name, cut from the sprites once */\n patterns: Map<string, OffscreenCanvas | undefined>;\n}\n\n/** A sprite of the style: its images by name (`id:name` but in the default sprite) and its sheet */\nexport interface Sprite {\n image: ImageBitmap;\n icons: Record<string, { x: number; y: number; width: number; height: number; pixelRatio?: number }>;\n}\n\n/** An image of the sprites and its sheet */\nexport const spriteIcon = (r: Renderer, name: string) => {\n const sprite = r.sprites.find((sp) => Boolean(sp.icons[name]));\n const icon = sprite?.icons[name];\n\n return sprite && icon ? { icon, image: sprite.image } : undefined;\n};\n\nexport const renderers = new Map<string, Renderer>();\n/** Megabytes of decoded tiles kept by the pool, shared among its workers (a vector tile always goes to the same\n * worker); fewer at a lower quality (`QualitySettings.cachedMegabytes`). Counted in bytes, not tiles: a tile of a\n * city's middle takes some 5 MB of a worker's heap, of a village under 1 */\nconst CACHE_MB = 192;\n/** The least a worker keeps (megabytes): a few tiles of a city, those its jobs share as they come */\nconst MIN_SHARE_MB = 16;\n/** Decoded tiles by URL, each weighed by its bytes (`decodedBytes`) once decoded; this worker's share of them (bytes),\n * set by the renderers */\nexport const cache = new Lru<string, Promise<Map<string, TileLayer> | undefined>>(CACHE_MB << 20);\n\n/** The bytes of decoded tiles one worker of `workers` keeps, of the pool's `cached` megabytes */\nexport const cacheShare = (workers: number, cached = CACHE_MB): number =>\n Math.max(MIN_SHARE_MB, Math.ceil(cached / Math.max(1, workers))) << 20;\n/** Longest a tile's request may take, its body included (ms): past it the request fails and the tile is asked again,\n * rather than every view of it waiting on a connection that hangs */\nconst TILE_TIMEOUT_MS = 30_000;\n\n/** Requests in progress, and those of them aborted (both forgotten once answered) */\nexport const active = new Set<number>();\nexport const aborted = new Set<number>();\n\n/** Images of the raster sources by URL. An image dropped is freed once settled, after the renders that awaited it have\n * drawn it (they draw without awaiting again) */\nconst images = new Lru<string, Promise<ImageBitmap | undefined>>(64, (evicted) =>\n evicted.then(\n (bitmap) => setTimeout(() => bitmap?.close(), 0),\n () => undefined,\n ),\n);\n\n/** An image of a raster source (shared by every renderer); undefined where the source has none */\nexport const image = (url: string, priority: Priority = 'auto'): Promise<ImageBitmap | undefined> => {\n const hit = images.get(url);\n\n if (hit) return hit;\n\n const pending = (async () => {\n // A tile of a PMTiles archive (`pmtiles://…/{z}/{x}/{y}`)\n const archived = pmtilesTile(url);\n\n if (archived) {\n const bytes = await archived;\n\n return bytes && createImageBitmap(new Blob([bytes]));\n }\n\n const init: PriorityInit = { priority, signal: AbortSignal.timeout(TILE_TIMEOUT_MS) };\n const response = await fetch(url, withHeaders(url, init));\n\n if (response.status === 404 || response.status === 204) return undefined;\n if (!response.ok) throw httpError(url, response.status);\n\n return createImageBitmap(await response.blob());\n })();\n\n pending.catch(() => images.delete(url));\n images.set(url, pending);\n\n return pending;\n};\n\n/** `RequestInit` with the fetch priority, which the TypeScript DOM library may not know yet */\ntype PriorityInit = RequestInit & { priority?: Priority };\n\n/** A decoded tile, its weight in the cache its bytes */\nconst weighed = (url: string, layers: Map<string, TileLayer>): Map<string, TileLayer> => {\n cache.weigh(url, decodedBytes(layers));\n\n return layers;\n};\n\n/** A vector tile, decoded (shared by every renderer of its URL); the first request's priority fetches it */\nexport const tile = (url: string, priority: Priority = 'auto'): Promise<Map<string, TileLayer> | undefined> => {\n const hit = cache.get(url);\n\n if (hit) return hit;\n\n const pending = (async () => {\n // A tile of a PMTiles archive, ungzipped by the reader\n const archived = pmtilesTile(url);\n\n if (archived) {\n const bytes = await archived;\n\n return bytes && weighed(url, decode(bytes));\n }\n for (let attempt = 0; ; attempt += 1) {\n const init: PriorityInit = { priority, signal: AbortSignal.timeout(TILE_TIMEOUT_MS) };\n const response = await fetch(url, withHeaders(url, init));\n\n if (response.status === 404 || response.status === 204) return undefined;\n if (response.ok) {\n // Every layer: renderers of other subsets share the tile\n return weighed(url, decode(new Uint8Array(await response.arrayBuffer())));\n }\n if (attempt >= 2) throw httpError(url, response.status);\n await new Promise((r) => setTimeout(r, 400 * (attempt + 1)));\n }\n })();\n\n pending.catch(() => cache.delete(url));\n cache.set(url, pending);\n\n return pending;\n};\n\n/** The vector tile to draw a raster tile from, and where the raster tile lies in it (tile units) */\nexport const source = (r: Renderer, z: number, x: number, y: number) => {\n const vz = clamp(z - 1, 0, r.maxzoom);\n const d = z - vz;\n const n = 2 ** Math.max(0, d);\n const [vx, vy] = d >= 0 ? [Math.floor(x / n), Math.floor(y / n)] : [x, y];\n const url = tileUrl(r.tiles, vz, vx, vy);\n // Fraction of the vector tile covered, and the offset in it\n const part = 1 / n;\n\n return { url, vz, vx, vy, part, ox: (x % n) * part, oy: (y % n) * part };\n};\n\nexport const value = (layer: StyleLayer, group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n const v = layer[group]?.[key];\n\n if (v === undefined) return fallback;\n\n // An array that is not an expression is a literal value (`text-font`, `text-offset`, `line-dasharray`)\n const out = Array.isArray(v) && !isExpression(v) ? v : evaluate(v, ctx);\n\n return out === undefined || out === null ? fallback : out;\n};\n\n/** A color with an opacity, for the canvas */\nexport const paint = (c: unknown, opacity: number): string => {\n const rgba = color(c) ?? [0, 0, 0, 1];\n\n return css([rgba[0], rgba[1], rgba[2], rgba[3] * opacity]);\n};\n\nexport const shown = (layer: StyleLayer, zoom: number): boolean => {\n if (layer.layout?.visibility === 'none') return false;\n\n return zoom >= (layer.minzoom ?? 0) && zoom < (layer.maxzoom ?? 24);\n};\n\n/** Longitude and latitude of a point of tile (z, x, y) in tile units */\nexport const lonLat = (z: number, x: number, y: number, extent: number, px: number, py: number): [number, number] => {\n const n = 2 ** z;\n\n return [longitude((x + px / extent) / n), latitude((y + py / extent) / n)];\n};\n",
|
|
21
|
+
"/** The label candidates of a tile: the texts and icons of the style's symbol layers, for the page to shape and place */\n\nimport type { TileFeature } from '../../basemap/mvt.ts';\nimport {\n type CandidateIcon,\n type CandidateOverlap,\n type Context,\n context,\n filter,\n isExpression,\n isFeatureDependent,\n type Json,\n type LabelCandidate,\n labelFont,\n type StyleLayer,\n text,\n zoomStops,\n} from '../../basemap/vectorstyle.ts';\nimport { tileUrl } from '../../util/geo.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, shown, tile, value } from './tiles.ts';\n\n/** The line kept on each side of a text along it (CSS pixels): half the longest text that follows a line's bends */\nconst PATH_PIXELS = 300;\n\n/** How a layer's text or icon (`prefix`) meets the others: allowed to overlap, ignored by the placement */\nconst overlapOf = (layer: StyleLayer, prefix: 'text' | 'icon', ctx: Context): CandidateOverlap => {\n const allow = Boolean(value(layer, 'layout', `${prefix}-allow-overlap`, ctx, false));\n const ignore = Boolean(value(layer, 'layout', `${prefix}-ignore-placement`, ctx, false));\n\n if (allow && ignore) return true;\n if (allow) return 'allow';\n\n return ignore ? 'ignore' : false;\n};\n\n/** A pair of numbers of a style value, `fallback` if it is not one */\nconst pair = (v: unknown, fallback: [number, number]): [number, number] => {\n return Array.isArray(v) ? [Number(v[0] ?? fallback[0]), Number(v[1] ?? fallback[1])] : fallback;\n};\n\n/** Top, right, bottom, left of one to four numbers, as CSS's sides */\nconst sides = (v: unknown): [number, number, number, number] => {\n const n = (Array.isArray(v) ? v : [v]).map((x) => Number(x) || 0);\n const [top = 0, right = top, bottom = top, left = right] = n;\n\n return [top, right, bottom, left];\n};\n\n/** A label's text in the case of its `text-transform` */\nconst cased = (t: string, transform: unknown): string => {\n if (transform === 'uppercase') return t.toUpperCase();\n if (transform === 'lowercase') return t.toLowerCase();\n\n return t;\n};\n\n/** Points every `spacing` along a line (tile units, x and y interleaved), the first half a spacing in (the middle of a\n * shorter line): each point, the segment it lies on and how far along the line it is (x, y, x0, y0, x1, y1, the\n * distance) */\nexport const lineAnchors = (line: ArrayLike<number>, spacing: number): number[][] => {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n\n const out: number[][] = [];\n\n if (!(length > 0) || !(spacing > 0)) return out;\n\n let next = Math.min(spacing / 2, length / 2);\n let walked = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n while (d > 0 && next <= walked + d) {\n const t = (next - walked) / d;\n\n out.push([ax + (bx - ax) * t, ay + (by - ay) * t, ax, ay, bx, by, next]);\n next += spacing;\n }\n walked += d;\n }\n\n return out;\n};\n\n/** The point `offset` (tile units) beside a line's anchor (`lineAnchors`), the `k`th anchor's on one side of the line,\n * the next one's on the other: x, y and its heading facing the line (degrees; y towards the south in the tile) */\nexport const besideLine = (\n anchor: readonly number[],\n k: number,\n offset: number,\n): [x: number, y: number, heading: number] => {\n const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] = anchor;\n const length = Math.hypot(bx - ax, by - ay) || 1;\n const sign = k % 2 === 0 ? 1 : -1;\n const [nx, ny] = [(-(by - ay) / length) * sign, ((bx - ax) / length) * sign];\n\n return [px + nx * offset, py + ny * offset, (Math.atan2(-nx, ny) * 180) / Math.PI];\n};\n\n/** The part of a line (tile units, interleaved) from `from` to `to` along it (distances from its start) */\nexport const lineBetween = (line: ArrayLike<number>, from: number, to: number): number[] => {\n const out: number[] = [];\n let walked = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n const [s0, s1] = [walked, walked + d];\n\n walked = s1;\n if (d <= 0 || s1 < from || s0 > to) continue;\n\n const at = (s: number) => [ax + ((bx - ax) * (s - s0)) / d, ay + ((by - ay) * (s - s0)) / d];\n\n if (out.length === 0) out.push(...at(Math.max(from, s0)));\n out.push(...at(Math.min(to, s1)));\n }\n\n return out;\n};\n\n/** The icon of a label: its layer's icon properties for the feature */\nconst iconOf = (\n layer: StyleLayer,\n image: string,\n ctx: Context,\n placement: 'point' | 'line',\n sizeOf: (layer: StyleLayer) => Json,\n): CandidateIcon => {\n const alignment = value(layer, 'layout', 'icon-rotation-alignment', ctx, 'auto');\n const fit = String(value(layer, 'layout', 'icon-text-fit', ctx, 'none'));\n const padding = value(layer, 'layout', 'icon-text-fit-padding', ctx, [0, 0, 0, 0]);\n\n return {\n image,\n size: isFeatureDependent(layer.layout?.['icon-size'])\n ? Number(value(layer, 'layout', 'icon-size', ctx, 1))\n : sizeOf(layer),\n anchor: String(value(layer, 'layout', 'icon-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'icon-offset', ctx, [0, 0]), [0, 0]),\n rotate: Number(value(layer, 'layout', 'icon-rotate', ctx, 0)) || 0,\n alignment: alignment === 'map' || (alignment === 'auto' && placement === 'line') ? 'map' : 'viewport',\n overlap: overlapOf(layer, 'icon', ctx),\n optional: Boolean(value(layer, 'layout', 'icon-optional', ctx, false)),\n fit: fit === 'width' || fit === 'height' || fit === 'both' ? fit : 'none',\n padding: sides(padding),\n color: String(value(layer, 'paint', 'icon-color', ctx, '#000')),\n opacity: Number(value(layer, 'paint', 'icon-opacity', ctx, 1)),\n };\n};\n\n/** Squares across a tile of the grid the buildings are found by */\nconst ROOF_GRID = 16;\n\n/**\n * The height of the building under a point of a tile (its units), the highest if several: the buildings of the\n * style's `fill-extrusion` layers shown at `zoom`, at their `fill-extrusion-height`; undefined outside them. A label\n * there stands on its roof, not hidden by its walls. The buildings found through a grid of the tile's squares\n */\nexport const roofsOf = (\n r: Renderer,\n layers: Map<string, { extent: number; features: TileFeature[] }>,\n zoom: number,\n): ((px: number, py: number) => number | undefined) => {\n const buildings: { rings: readonly ArrayLike<number>[]; height: number; box: [number, number, number, number] }[] =\n [];\n const cells = new Map<number, number[]>();\n let extent = 4096;\n\n r.layers.forEach((layer) => {\n if (layer.type !== 'fill-extrusion' || !shown(layer, zoom)) return;\n\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n extent = data.extent;\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (f.type !== 3 || !filter(layer.filter, ctx)) continue;\n\n const height = Number(value(layer, 'paint', 'fill-extrusion-height', ctx, 0));\n\n if (!(height > 0)) continue;\n\n const box: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n\n for (const ring of f.geometry)\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const [x, y] = [ring[i] ?? 0, ring[i + 1] ?? 0];\n\n box[0] = Math.min(box[0], x);\n box[1] = Math.min(box[1], y);\n box[2] = Math.max(box[2], x);\n box[3] = Math.max(box[3], y);\n }\n buildings.push({ rings: f.geometry, height, box });\n }\n });\n\n const cellOf = (v: number) => Math.max(0, Math.min(ROOF_GRID - 1, Math.floor((v / extent) * ROOF_GRID)));\n\n buildings.forEach(({ box }, b) => {\n for (let cy = cellOf(box[1]); cy <= cellOf(box[3]); cy++)\n for (let cx = cellOf(box[0]); cx <= cellOf(box[2]); cx++) {\n const k = cy * ROOF_GRID + cx;\n const cell = cells.get(k);\n\n if (cell) cell.push(b);\n else cells.set(k, [b]);\n }\n });\n\n /** Whether a point is inside rings (even-odd: the holes left out) */\n const inside = (rings: readonly ArrayLike<number>[], px: number, py: number): boolean => {\n let odd = false;\n\n for (const ring of rings)\n for (let i = 0, j = ring.length - 2; i + 1 < ring.length; j = i, i += 2) {\n const [xi, yi, xj, yj] = [ring[i] ?? 0, ring[i + 1] ?? 0, ring[j] ?? 0, ring[j + 1] ?? 0];\n\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) odd = !odd;\n }\n\n return odd;\n };\n\n return (px, py) =>\n (cells.get(cellOf(py) * ROOF_GRID + cellOf(px)) ?? []).reduce<number | undefined>((top, b) => {\n const building = buildings[b];\n\n return building && inside(building.rings, px, py) ? Math.max(top ?? 0, building.height) : top;\n }, undefined);\n};\n\nexport const labels = async (r: Renderer, work: WorkOf<'labels'>): Promise<LabelCandidate[]> => {\n const { z, x, y, id, priority, zoom = z, roofs = false } = work;\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return [];\n\n const out: LabelCandidate[] = [];\n // Only when the page hides the labels behind the buildings: the buildings of the tile in a grid\n const roofAt = roofs ? roofsOf(r, layers, zoom) : () => undefined;\n // The text size of a layer when it depends on the zoom only: legacy stops as they are, an expression as stops\n const sizes = new Map<StyleLayer, Json>();\n const sizeOf = (layer: StyleLayer): Json => {\n const known = sizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['text-size'] ?? 16;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n sizes.set(layer, s);\n\n return s;\n };\n // The icon size of a layer when it depends on the zoom only, as the text size\n const iconSizes = new Map<StyleLayer, Json>();\n const iconSizeOf = (layer: StyleLayer): Json => {\n const known = iconSizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['icon-size'] ?? 1;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n iconSizes.set(layer, s);\n\n return s;\n };\n\n r.layers.forEach((layer, index) => {\n const layout = layer.layout ?? {};\n\n if (layer.type !== 'symbol' || !shown(layer, zoom)) return;\n if (layout['text-field'] === undefined && layout['icon-image'] === undefined) return;\n\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n const placement = value(layer, 'layout', 'symbol-placement', zctx, 'point') === 'line' ? 'line' : 'point';\n const textAlong =\n placement === 'line' && value(layer, 'layout', 'text-rotation-alignment', zctx, 'auto') !== 'viewport';\n\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (!filter(layer.filter, ctx)) continue;\n\n const field = text(layout['text-field'], ctx).trim();\n const image = text(layout['icon-image'], ctx).trim();\n\n if (!field && !image) continue;\n\n const t = cased(field, value(layer, 'layout', 'text-transform', ctx, 'none'));\n const fonts = value(layer, 'layout', 'text-font', ctx, ['Noto Sans Regular']);\n const font = labelFont(Array.isArray(fonts) && typeof fonts[0] === 'string' ? fonts[0] : 'Noto Sans Regular');\n const base = {\n layer: index,\n text: t,\n font,\n // Zoom stops are kept for the engine; a value of the feature evaluated here\n size: isFeatureDependent(layer.layout?.['text-size'])\n ? Number(value(layer, 'layout', 'text-size', ctx, 16))\n : sizeOf(layer),\n color: String(value(layer, 'paint', 'text-color', ctx, '#000')),\n haloColor: String(value(layer, 'paint', 'text-halo-color', ctx, 'rgba(0,0,0,0)')),\n haloWidth: Number(value(layer, 'paint', 'text-halo-width', ctx, 0)),\n anchor: String(value(layer, 'layout', 'text-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'text-offset', ctx, [0, 0]), [0, 0]),\n maxWidth: Number(value(layer, 'layout', 'text-max-width', ctx, 10)),\n lineHeight: Number(value(layer, 'layout', 'text-line-height', ctx, 1.2)),\n overlap: overlapOf(layer, 'text', ctx),\n ...(textAlong ? { textAlong } : {}),\n ...(value(layer, 'layout', 'text-optional', ctx, false) ? { textOptional: true } : {}),\n ...(image ? { icon: iconOf(layer, image, ctx, placement, iconSizeOf) } : {}),\n };\n\n if (f.type === 1) {\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n const [px, py] = [point[i] ?? 0, point[i + 1] ?? 0];\n\n // Points in the buffer belong to the neighbouring tile\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const height = roofAt(px, py);\n\n out.push({ ...base, lon, lat, ...(height === undefined ? {} : { height }) });\n }\n }\n } else if (!t && placement === 'line') {\n // Icons alone along lines (one-way arrows): every `symbol-spacing` CSS pixels (a tile is 512 across at its\n // level, twice as many at each zoom past it)\n const spacing =\n (Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * data.extent) / (512 * 2 ** (zoom - z));\n\n for (const line of f.geometry) {\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] of lineAnchors(line, Math.max(spacing, 1))) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0] });\n }\n }\n } else if (t && textAlong) {\n // Texts along lines every `symbol-spacing` CSS pixels, each with the line around it, as long before as after\n // (up to `PATH_PIXELS`), for the text to follow its bends; the placement keeps those that fit\n const pixels = data.extent / (512 * 2 ** (zoom - z));\n const spacing = Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * pixels;\n\n for (const line of f.geometry) {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length < data.extent / 32) continue;\n\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0, s = 0] of lineAnchors(\n line,\n Math.max(spacing, 1),\n )) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const half = Math.min(s, length - s, PATH_PIXELS * pixels);\n const part = lineBetween(line, s - half, s + half);\n const path: number[] = [];\n\n for (let i = 0; i + 1 < part.length; i += 2)\n path.push(...lonLat(z, x, y, data.extent, part[i] ?? 0, part[i + 1] ?? 0));\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0], ...(path.length >= 4 ? { path } : {}) });\n }\n }\n } else {\n // The middle of the longest line inside the tile, along it\n let best: ArrayLike<number> | undefined;\n let bestLength = 0;\n\n for (const line of f.geometry) {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length > bestLength) {\n bestLength = length;\n best = line;\n }\n }\n if (!best || bestLength < data.extent / 32) continue;\n\n let rest = bestLength / 2;\n\n for (let i = 2; i + 1 < best.length; i += 2) {\n const [ax, ay, bx, by] = [best[i - 2] ?? 0, best[i - 1] ?? 0, best[i] ?? 0, best[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n if (d >= rest && d > 0) {\n const [px, py] = [ax + ((bx - ax) * rest) / d, ay + ((by - ay) * rest) / d];\n\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) break;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, ...(placement === 'line' ? { along: [lon1 - lon0, lat1 - lat0] } : {}) });\n break;\n }\n rest -= d;\n }\n }\n }\n });\n\n return out;\n};\n",
|
|
22
22
|
"/**\n * Where the trees of a vector map grow and how (the page's layers and the workers alike): the style layers they grow\n * on by default and how far apart, the share of conifers in a wood from its data, the height of their models.\n */\n\nimport type { Value } from './mvt.ts';\nimport type { StyleLayer } from './vectorstyle.ts';\n\n/** The models' heights (metres): a tree's height from its data scales them by it */\nexport const TREE_METRES = { broadleaved: 10.2, conifer: 11 } as const;\n\n/** Whether a style layer is OpenMapTiles' grass (the lawns of parks and gardens among it) */\nconst isGrass = (layer: StyleLayer): boolean => layer['source-layer'] === 'landcover' && /grass/i.test(layer.id);\n\n/**\n * Whether trees grow on a style layer by default: the woods and forests of the style's fills (OpenMapTiles'\n * `landcover` wood, PLAN IGN's forests) and the grass of its parks and gardens; not the wooded relief of PLAN IGN,\n * which repeats its forests, nor OpenMapTiles' `park` layer (protected areas and historic sites: a river's banks\n * among them)\n */\nexport const isWoodland = (layer: StyleLayer): boolean =>\n layer.type === 'fill' &&\n layer['source-layer'] !== 'oro_relief' &&\n (/wood|forest|for[eê]t/i.test(layer.id) || isGrass(layer));\n\n/** Default spacing of the trees of a layer (metres): close in woods and forests, apart on grass */\nexport const treeSpacing = (layer: StyleLayer): number => (isGrass(layer) ? 25 : 9);\n\n/**\n * The share of conifers in a wood from its properties: OpenStreetMap's `leaf_type` (needleleaved, broadleaved,\n * mixed), PLAN IGN's `nature` (« conifères », « feuillus », « mixte »); without them, OpenMapTiles' forests a third\n * conifers and its other woods some, the grass of parks none\n */\nexport const coniferShare = (properties: Record<string, Value>): number => {\n const leaf = properties.leaf_type;\n const nature = typeof properties.nature === 'string' ? properties.nature : '';\n\n if (leaf === 'needleleaved' || /conif/i.test(nature)) return 1;\n if (leaf === 'broadleaved' || /feuillu/i.test(nature)) return 0;\n if (leaf === 'mixed' || /mixte/i.test(nature)) return 0.5;\n if (properties.class === 'wood') return properties.subclass === 'forest' ? 0.35 : 0.15;\n\n return 0;\n};\n",
|
|
23
|
-
"/** The trees of a tile: points scattered over the woods of its polygons, the same each time the tile is cut */\n\nimport { PLACED_NUMBERS, PLACED_RANK, turned } from '../../basemap/placed.ts';\nimport { context, filter } from '../../basemap/vectorstyle.ts';\nimport { coniferShare } from '../../basemap/woods.ts';\nimport { tileMetres, tileUrl } from '../../util/geo.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile } from './tiles.ts';\n\n/** Things placed (`PLACED_NUMBERS` each), past `max` thinned evenly by their rank: one in so many kept, the\n * same ones each time */\nexport const thinned = (found: readonly number[], max: number): Float64Array => {\n const count = found.length / PLACED_NUMBERS;\n const keep = count > max ? max / count : 1;\n const out: number[] = [];\n\n for (let i = 0; i < count; i += 1) {\n if (keep >= 1 || (found[i * PLACED_NUMBERS + PLACED_RANK] ?? 0) < keep)\n out.push(...found.slice(i * PLACED_NUMBERS, (i + 1) * PLACED_NUMBERS));\n }\n\n return Float64Array.from(out);\n};\n\n/** A number in [0, 1) from four integers, the same for the same ones: where a tree stands in its cell, its size */\nexport const treeHash = (a: number, b: number, c: number, d: number): number => {\n let h = Math.imul(a ^ 0x9e3779b9, 0x85ebca6b) ^ Math.imul(b ^ 0xc2b2ae35, 0x27d4eb2f);\n\n h = Math.imul(h ^ (h >>> 15) ^ Math.imul(c, 0x165667b1), 0x2c1b3c6d);\n h = Math.imul(h ^ (h >>> 13) ^ Math.imul(d, 0x297a2d39), 0x297a2d39);\n\n return ((h ^ (h >>> 16)) >>> 0) / 2 ** 32;\n};\n\n/** Whether a point lies in rings (interleaved points, unclosed or closed), even-odd: the holes cut out */\nexport const inRings = (rings: readonly
|
|
24
|
-
"/**\n * The street furniture of a tile, from OpenMapTiles' layers: its points of interest of the street where they stand\n * (bus stops' shelters, waste baskets, post boxes, drinking fountains, bicycle racks), each facing the nearest street;\n * benches along the pedestrian streets and the paths of the parks and gardens. The same each time the tile is cut\n */\n\nimport type { TileFeature } from '../../basemap/mvt.ts';\nimport { FURNITURE } from '../../basemap/placed.ts';\nimport { tileMetres, tileUrl } from '../../util/geo.ts';\nimport { besideLine, lineAnchors } from './labels.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile } from './tiles.ts';\nimport { inRings, thinned, treeHash } from './trees.ts';\n\ntype FurnitureKind = (typeof FURNITURE)[number];\n\n/** The kind of a point of interest by its OpenMapTiles subclass */\nconst OF_SUBCLASS: Readonly<Record<string, FurnitureKind>> = {\n bus_stop: 'shelter',\n waste_basket: 'bin',\n post_box: 'postbox',\n drinking_water: 'fountain',\n bicycle_parking: 'rack',\n};\n\n/** The streets a piece of furniture faces: OpenMapTiles' classes of roads */\nconst STREETS = new Set(['primary', 'secondary', 'tertiary', 'minor', 'service', 'trunk']);\n\n/** Metres a piece of furniture looks for its street within */\nconst FACING_METRES = 25;\n\n/** Benches: metres apart along a pedestrian street (every other one on its other side) and a park's path, metres\n * from their middle */\nconst BENCHES = { street: [24, 3.2], path: [18, 1.3] } as const;\n\n/** The point features of a tile's layer */\nconst pointsOf = (features: readonly TileFeature[]) => features.filter((f) => f.type === 1);\n\n/**\n * The street furniture of a tile: longitude, latitude, scale, heading (degrees, facing its street or path), rank (in\n * [0, 1): the page keeps the lowest far from the view) and kind (`FURNITURE`' index) of each, as things placed\n * (`PLACED_NUMBERS`); past `maxObjects`, thinned evenly\n */\nexport const furniture = async (r: Renderer, work: WorkOf<'furniture'>) => {\n const { z, x, y, id, maxObjects, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return undefined;\n\n const poi = layers.get('poi');\n const roads = layers.get('transportation');\n const extent = roads?.extent ?? poi?.extent ?? 4096;\n // Tile units a metre at the tile's middle\n const units = extent / tileMetres(z, y);\n const streets = (roads?.features ?? []).filter((f) => f.type === 2 && STREETS.has(String(f.properties.class)));\n // The parks', gardens' and lawns' outlines, each with its bounds (most points tested are outside them)\n const green = (layers.get('landcover')?.features ?? [])\n .filter((f) => f.type === 3 && String(f.properties.class) === 'grass')\n .map((f) => {\n const outer = f.geometry[0] ?? [];\n const xs = outer.filter((_, i) => i % 2 === 0);\n const ys = outer.filter((_, i) => i % 2 === 1);\n\n return { rings: f.geometry, bounds: [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)] };\n });\n const inGreen = (px: number, py: number) =>\n green.some(\n ({ rings, bounds: [x0 = 0, y0 = 0, x1 = 0, y1 = 0] }) =>\n px >= x0 && px <= x1 && py >= y0 && py <= y1 && inRings(rings, px, py),\n );\n const found: number[] = [];\n const push = (px: number, py: number, heading: number, rank: number, kind: FurnitureKind) => {\n if (px < 0 || py < 0 || px >= extent || py >= extent) return;\n\n const [lon, lat] = lonLat(z, x, y, extent, px, py);\n\n found.push(lon, lat, 1, heading, rank, FURNITURE.indexOf(kind));\n };\n // The streets' segments in a grid of cells as wide as the distance looked within: each search reads nine cells\n const cell = FACING_METRES * units;\n const grid = new Map<number, number[]>();\n // A cell's key: its column and row, the buffer's negative ones too, in one number\n const cellOf = (cx: number, cy: number) => (cx + 32_768) * 65_536 + cy + 32_768;\n\n streets.forEach((f) => {\n f.geometry.forEach((line) => {\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const [x0, x1] = [Math.floor(Math.min(ax, bx) / cell), Math.floor(Math.max(ax, bx) / cell)];\n const [y0, y1] = [Math.floor(Math.min(ay, by) / cell), Math.floor(Math.max(ay, by) / cell)];\n\n for (let cx = x0; cx <= x1; cx += 1) {\n for (let cy = y0; cy <= y1; cy += 1) {\n const list = grid.get(cellOf(cx, cy)) ?? [];\n\n list.push(ax, ay, bx, by);\n grid.set(cellOf(cx, cy), list);\n }\n }\n }\n });\n });\n\n /** The heading of something at (px, py) facing the nearest street within `FACING_METRES`, else its own */\n const facing = (px: number, py: number, own: number): number => {\n let [best, nx, ny] = [cell * cell, 0, 0];\n const [cx, cy] = [Math.floor(px / cell), Math.floor(py / cell)];\n\n for (let gx = cx - 1; gx <= cx + 1; gx += 1) {\n for (let gy = cy - 1; gy <= cy + 1; gy += 1) {\n const list = grid.get(cellOf(gx, gy)) ?? [];\n\n for (let i = 0; i + 3 < list.length; i += 4) {\n const [ax, ay, bx, by] = [list[i] ?? 0, list[i + 1] ?? 0, list[i + 2] ?? 0, list[i + 3] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n const length = dx * dx + dy * dy;\n const t = length > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / length)) : 0;\n const [ex, ey] = [ax + t * dx - px, ay + t * dy - py];\n const d = ex * ex + ey * ey;\n\n if (d < best) [best, nx, ny] = [d, ex, ey];\n }\n }\n }\n if (nx === 0 && ny === 0) return own;\n\n // Its front toward the street (y towards the south in the tile)\n return (Math.atan2(nx, -ny) * 180) / Math.PI;\n };\n\n pointsOf(poi?.features ?? []).forEach((f) => {\n const kind = OF_SUBCLASS[String(f.properties.subclass)];\n\n if (!kind) return;\n f.geometry.forEach(([px = 0,
|
|
23
|
+
"/** The trees of a tile: points scattered over the woods of its polygons, the same each time the tile is cut */\n\nimport { PLACED_NUMBERS, PLACED_RANK, turned } from '../../basemap/placed.ts';\nimport { context, filter } from '../../basemap/vectorstyle.ts';\nimport { coniferShare } from '../../basemap/woods.ts';\nimport { tileMetres, tileUrl } from '../../util/geo.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile } from './tiles.ts';\n\n/** Things placed (`PLACED_NUMBERS` each), past `max` thinned evenly by their rank: one in so many kept, the\n * same ones each time */\nexport const thinned = (found: readonly number[], max: number): Float64Array => {\n const count = found.length / PLACED_NUMBERS;\n const keep = count > max ? max / count : 1;\n const out: number[] = [];\n\n for (let i = 0; i < count; i += 1) {\n if (keep >= 1 || (found[i * PLACED_NUMBERS + PLACED_RANK] ?? 0) < keep)\n out.push(...found.slice(i * PLACED_NUMBERS, (i + 1) * PLACED_NUMBERS));\n }\n\n return Float64Array.from(out);\n};\n\n/** A number in [0, 1) from four integers, the same for the same ones: where a tree stands in its cell, its size */\nexport const treeHash = (a: number, b: number, c: number, d: number): number => {\n let h = Math.imul(a ^ 0x9e3779b9, 0x85ebca6b) ^ Math.imul(b ^ 0xc2b2ae35, 0x27d4eb2f);\n\n h = Math.imul(h ^ (h >>> 15) ^ Math.imul(c, 0x165667b1), 0x2c1b3c6d);\n h = Math.imul(h ^ (h >>> 13) ^ Math.imul(d, 0x297a2d39), 0x297a2d39);\n\n return ((h ^ (h >>> 16)) >>> 0) / 2 ** 32;\n};\n\n/** Whether a point lies in rings (interleaved points, unclosed or closed), even-odd: the holes cut out */\nexport const inRings = (rings: readonly ArrayLike<number>[], px: number, py: number): boolean =>\n rings.reduce((inside, ring) => {\n const n = ring.length / 2;\n let crossings = 0;\n\n for (let i = 0, j = n - 1; i < n; j = i, i += 1) {\n const [xi, yi, xj, yj] = [ring[i * 2] ?? 0, ring[i * 2 + 1] ?? 0, ring[j * 2] ?? 0, ring[j * 2 + 1] ?? 0];\n\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) crossings += 1;\n }\n\n return crossings % 2 === 1 ? !inside : inside;\n }, false);\n\n/**\n * Points scattered over a polygon (its rings, tile units) on a jittered grid of `cell` tile units, the grid and the\n * jitter fixed by the tile (`seed`): the same trees whenever the tile is cut again, none twice across tiles (the points\n * past the tile's edge left to its neighbour). Past `maxCells` cells over the polygon (a tile of a coarse level), the\n * cells grow until they are no more. Each point with a number in [0, 1) for its size and heading\n */\nexport const scatter = (\n rings: readonly ArrayLike<number>[],\n extent: number,\n spacing: number,\n seed: [number, number, number],\n maxCells = Number.POSITIVE_INFINITY,\n): [x: number, y: number, k: number][] => {\n const outer = rings[0] ?? [];\n // The bounds of the outer ring (a loop: a spread of a ring of many points would overflow the call stack)\n const bounds = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ];\n\n for (let i = 0; i + 1 < outer.length; i += 2) {\n const [x, y] = [outer[i] ?? 0, outer[i + 1] ?? 0];\n\n bounds[0] = Math.min(bounds[0] ?? x, x);\n bounds[1] = Math.min(bounds[1] ?? y, y);\n bounds[2] = Math.max(bounds[2] ?? x, x);\n bounds[3] = Math.max(bounds[3] ?? y, y);\n }\n\n const [x0, y0] = [Math.max(0, bounds[0] ?? 0), Math.max(0, bounds[1] ?? 0)];\n const [x1, y1] = [Math.min(extent, bounds[2] ?? 0), Math.min(extent, bounds[3] ?? 0)];\n\n if (!(spacing > 0) || x0 >= x1 || y0 >= y1) return [];\n\n const cells = ((x1 - x0) / spacing) * ((y1 - y0) / spacing);\n const cell = cells > maxCells ? spacing * Math.sqrt(cells / maxCells) : spacing;\n const [cx0, cx1, cy0, cy1] = [\n Math.floor(x0 / cell),\n Math.ceil(x1 / cell),\n Math.floor(y0 / cell),\n Math.ceil(y1 / cell),\n ];\n const [z, x, y] = seed;\n const tileSeed = Math.imul(z + 1, 0x01000193) ^ Math.imul(x, 0x5bd1e995) ^ Math.imul(y, 0x1b873593);\n\n return Array.from({ length: Math.max(0, cy1 - cy0) }, (_, j) => cy0 + j).flatMap((cy) =>\n Array.from({ length: Math.max(0, cx1 - cx0) }, (_, i) => cx0 + i).flatMap((cx): [number, number, number][] => {\n const px = (cx + treeHash(tileSeed, cx, cy, 1)) * cell;\n const py = (cy + treeHash(tileSeed, cx, cy, 2)) * cell;\n\n if (px < 0 || py < 0 || px >= extent || py >= extent || !inRings(rings, px, py)) return [];\n\n return [[px, py, treeHash(tileSeed, cx, cy, 3)]];\n }),\n );\n};\n\n/**\n * Trees over the polygons of the renderer's layers in a tile: longitude, latitude, scale (0.75 to 1.25), heading\n * (degrees), rank (in [0, 1): the page keeps the lowest far from the view) and kind (1 a conifer, as many as its wood's\n * `coniferShare`, else 0) of each, `spacing[s]` metres apart in layer `s` on a jittered grid; past `maxTrees`, thinned\n * evenly\n */\nexport const trees = async (r: Renderer, work: WorkOf<'trees'>) => {\n const { z, x, y, id, spacing, maxTrees, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return undefined;\n\n // Metres across the tile at its middle: the cells in tile units\n const across = tileMetres(z, y);\n const found: [x: number, y: number, k: number, extent: number, conifers: number][] = [];\n\n r.layers.forEach((layer, s) => {\n const metres = spacing[s] ?? 0;\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data || !(metres > 0)) return;\n\n const cell = (metres / across) * data.extent;\n\n data.features.forEach((f) => {\n if (f.type !== 3 || !filter(layer.filter, context(f, z))) return;\n\n const conifers = coniferShare(f.properties);\n\n // Its polygons: an outline (clockwise on screen) and the holes after it\n const polygons = f.geometry.reduce<ArrayLike<number>[][]>((list, ring) => {\n let area = 0;\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const j = (i + 2) % ring.length;\n\n area += (ring[i] ?? 0) * (ring[j + 1] ?? 0) - (ring[j] ?? 0) * (ring[i + 1] ?? 0);\n }\n if (area > 0) list.push([ring]);\n else if (area < 0) list.at(-1)?.push(ring);\n\n return list;\n }, []);\n\n polygons.forEach((rings) => {\n scatter(rings, data.extent, cell, [z, x, y], maxTrees * 4).forEach(([px, py, k]) => {\n found.push([px, py, k, data.extent, conifers]);\n });\n });\n });\n });\n\n // Too many: one in so many kept, the same ones each time\n const keep = found.length > maxTrees ? maxTrees / found.length : 1;\n const kept = found.filter(([, , k]) => keep >= 1 || treeHash(Math.floor(k * 2 ** 31), z, x, y) < keep);\n const out = new Float64Array(kept.length * PLACED_NUMBERS);\n\n kept.forEach(([px, py, k, extent, conifers], i) => {\n const [lon, lat] = lonLat(z, x, y, extent, px, py);\n const rank = treeHash(Math.floor(k * 2 ** 31), 7, 11, 13);\n const conifer = treeHash(Math.floor(k * 2 ** 31), 3, 5, 17) < conifers ? 1 : 0;\n\n out.set([lon, lat, 0.75 + 0.5 * k, turned(k), rank, conifer], i * PLACED_NUMBERS);\n });\n\n return out;\n};\n",
|
|
24
|
+
"/**\n * The street furniture of a tile, from OpenMapTiles' layers: its points of interest of the street where they stand\n * (bus stops' shelters, waste baskets, post boxes, drinking fountains, bicycle racks), each facing the nearest street;\n * benches along the pedestrian streets and the paths of the parks and gardens. The same each time the tile is cut\n */\n\nimport type { TileFeature } from '../../basemap/mvt.ts';\nimport { FURNITURE } from '../../basemap/placed.ts';\nimport { tileMetres, tileUrl } from '../../util/geo.ts';\nimport { besideLine, lineAnchors } from './labels.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile } from './tiles.ts';\nimport { inRings, thinned, treeHash } from './trees.ts';\n\ntype FurnitureKind = (typeof FURNITURE)[number];\n\n/** The kind of a point of interest by its OpenMapTiles subclass */\nconst OF_SUBCLASS: Readonly<Record<string, FurnitureKind>> = {\n bus_stop: 'shelter',\n waste_basket: 'bin',\n post_box: 'postbox',\n drinking_water: 'fountain',\n bicycle_parking: 'rack',\n};\n\n/** The streets a piece of furniture faces: OpenMapTiles' classes of roads */\nconst STREETS = new Set(['primary', 'secondary', 'tertiary', 'minor', 'service', 'trunk']);\n\n/** Metres a piece of furniture looks for its street within */\nconst FACING_METRES = 25;\n\n/** Benches: metres apart along a pedestrian street (every other one on its other side) and a park's path, metres\n * from their middle */\nconst BENCHES = { street: [24, 3.2], path: [18, 1.3] } as const;\n\n/** The point features of a tile's layer */\nconst pointsOf = (features: readonly TileFeature[]) => features.filter((f) => f.type === 1);\n\n/**\n * The street furniture of a tile: longitude, latitude, scale, heading (degrees, facing its street or path), rank (in\n * [0, 1): the page keeps the lowest far from the view) and kind (`FURNITURE`' index) of each, as things placed\n * (`PLACED_NUMBERS`); past `maxObjects`, thinned evenly\n */\nexport const furniture = async (r: Renderer, work: WorkOf<'furniture'>) => {\n const { z, x, y, id, maxObjects, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return undefined;\n\n const poi = layers.get('poi');\n const roads = layers.get('transportation');\n const extent = roads?.extent ?? poi?.extent ?? 4096;\n // Tile units a metre at the tile's middle\n const units = extent / tileMetres(z, y);\n const streets = (roads?.features ?? []).filter((f) => f.type === 2 && STREETS.has(String(f.properties.class)));\n // The parks', gardens' and lawns' outlines, each with its bounds (most points tested are outside them)\n const green = (layers.get('landcover')?.features ?? [])\n .filter((f) => f.type === 3 && String(f.properties.class) === 'grass')\n .map((f) => {\n const outer = Array.from(f.geometry[0] ?? []);\n const xs = outer.filter((_, i) => i % 2 === 0);\n const ys = outer.filter((_, i) => i % 2 === 1);\n\n return { rings: f.geometry, bounds: [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)] };\n });\n const inGreen = (px: number, py: number) =>\n green.some(\n ({ rings, bounds: [x0 = 0, y0 = 0, x1 = 0, y1 = 0] }) =>\n px >= x0 && px <= x1 && py >= y0 && py <= y1 && inRings(rings, px, py),\n );\n const found: number[] = [];\n const push = (px: number, py: number, heading: number, rank: number, kind: FurnitureKind) => {\n if (px < 0 || py < 0 || px >= extent || py >= extent) return;\n\n const [lon, lat] = lonLat(z, x, y, extent, px, py);\n\n found.push(lon, lat, 1, heading, rank, FURNITURE.indexOf(kind));\n };\n // The streets' segments in a grid of cells as wide as the distance looked within: each search reads nine cells\n const cell = FACING_METRES * units;\n const grid = new Map<number, number[]>();\n // A cell's key: its column and row, the buffer's negative ones too, in one number\n const cellOf = (cx: number, cy: number) => (cx + 32_768) * 65_536 + cy + 32_768;\n\n streets.forEach((f) => {\n f.geometry.forEach((line) => {\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const [x0, x1] = [Math.floor(Math.min(ax, bx) / cell), Math.floor(Math.max(ax, bx) / cell)];\n const [y0, y1] = [Math.floor(Math.min(ay, by) / cell), Math.floor(Math.max(ay, by) / cell)];\n\n for (let cx = x0; cx <= x1; cx += 1) {\n for (let cy = y0; cy <= y1; cy += 1) {\n const list = grid.get(cellOf(cx, cy)) ?? [];\n\n list.push(ax, ay, bx, by);\n grid.set(cellOf(cx, cy), list);\n }\n }\n }\n });\n });\n\n /** The heading of something at (px, py) facing the nearest street within `FACING_METRES`, else its own */\n const facing = (px: number, py: number, own: number): number => {\n let [best, nx, ny] = [cell * cell, 0, 0];\n const [cx, cy] = [Math.floor(px / cell), Math.floor(py / cell)];\n\n for (let gx = cx - 1; gx <= cx + 1; gx += 1) {\n for (let gy = cy - 1; gy <= cy + 1; gy += 1) {\n const list = grid.get(cellOf(gx, gy)) ?? [];\n\n for (let i = 0; i + 3 < list.length; i += 4) {\n const [ax, ay, bx, by] = [list[i] ?? 0, list[i + 1] ?? 0, list[i + 2] ?? 0, list[i + 3] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n const length = dx * dx + dy * dy;\n const t = length > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / length)) : 0;\n const [ex, ey] = [ax + t * dx - px, ay + t * dy - py];\n const d = ex * ex + ey * ey;\n\n if (d < best) [best, nx, ny] = [d, ex, ey];\n }\n }\n }\n if (nx === 0 && ny === 0) return own;\n\n // Its front toward the street (y towards the south in the tile)\n return (Math.atan2(nx, -ny) * 180) / Math.PI;\n };\n\n pointsOf(poi?.features ?? []).forEach((f) => {\n const kind = OF_SUBCLASS[String(f.properties.subclass)];\n\n if (!kind) return;\n f.geometry.forEach((point) => {\n const [px, py] = [point[0] ?? 0, point[1] ?? 0];\n const rank = treeHash(Math.floor(px), Math.floor(py), FURNITURE.indexOf(kind), 31);\n\n push(px, py, facing(px, py, rank * 360), rank, kind);\n });\n });\n\n // Benches along the pedestrian streets, and the paths through the grass of the parks and gardens, facing them\n (roads?.features ?? []).forEach((f) => {\n const subclass = String(f.properties.subclass);\n const street = String(f.properties.class) === 'path' && subclass === 'pedestrian';\n const path = String(f.properties.class) === 'path' && (subclass === 'footway' || subclass === 'path');\n\n if (f.type !== 2 || !(street || path)) return;\n\n const [spacing, side] = street ? BENCHES.street : BENCHES.path;\n\n f.geometry.forEach((line) => {\n lineAnchors(line, spacing * units).forEach((anchor, k) => {\n const [px = 0, py = 0, , , , , along = 0] = anchor;\n\n if (path && !inGreen(px, py)) return;\n\n const rank = treeHash(Math.floor(px), Math.floor(py), Math.floor(along), 37);\n\n // Beside the line, its front toward it\n push(...besideLine(anchor, k, side * units), rank, 'bench');\n });\n });\n });\n\n return thinned(found, maxObjects);\n};\n",
|
|
25
25
|
"/**\n * The roofs of the buildings as the engine builds them (`RoofShape::number`): the shapes of OpenStreetMap's\n * `roof:shape`, those it does not draw as the nearest of them, or generated from a building's outline\n */\n\nimport { isRecord } from './guards.ts';\n\n/** OpenStreetMap's `roof:shape` as the engine's roofs (1 flat, 2 hipped, 3 gabled, 4 pyramidal, 5 mansard) */\nconst ROOF_SHAPES: Readonly<Record<string, number>> = {\n flat: 1,\n skillion: 1,\n hipped: 2,\n 'half-hipped': 2,\n side_hipped: 2,\n dome: 2,\n onion: 2,\n round: 2,\n gabled: 3,\n saltbox: 3,\n pyramidal: 4,\n cone: 4,\n mansard: 5,\n gambrel: 5,\n};\n\n/** A roof generated from its building's outline (`shapes::GENERATED_ROOF`) */\nexport const GENERATED_ROOF = 255;\n\n/** The engine's number of a roof shape (`roof:shape`, or `generated`); undefined for a shape it does not know */\nexport const roofNumber = (shape: string): number | undefined =>\n shape === 'generated' ? GENERATED_ROOF : ROOF_SHAPES[shape];\n\n/** How the buildings' roofs are made: from their data (`roof:shape`, `roof:height`; flat without), generated where\n * they have none, or all flat */\nexport type RoofMode = 'data' | 'generated' | 'flat';\n\n/** The first of a feature's properties `names` it has */\nconst property = (p: unknown, names: readonly string[]): unknown =>\n isRecord(p) ? names.map((n) => p[n]).find((v) => v !== undefined) : undefined;\n\n/** A building's roof shape by the `mode`, from its properties (`roof:shape` or `roof_shape`): one the engine knows,\n * else generated in `generated`; undefined for none (flat) */\nexport const roofShapeOf = (properties: unknown, mode: RoofMode): string | undefined => {\n const shape = property(properties, ['roof:shape', 'roof_shape']);\n\n if (mode === 'flat') return undefined;\n if (typeof shape === 'string' && ROOF_SHAPES[shape] !== undefined) return shape;\n\n return mode === 'generated' ? 'generated' : undefined;\n};\n\n/** A building's roof height from its properties (`roof:height` or `roof_height`; not a number: as its slopes make it) */\nexport const roofHeightOf = (properties: unknown): number =>\n Number(property(properties, ['roof:height', 'roof_height']) ?? Number.NaN);\n",
|
|
26
26
|
"/**\n * The floats of a feature's style in the engine (`setFeatureStyle`, `render::features::TEXELS`), for the page's\n * layers and the vector tiles' workers alike: what each holds.\n */\n\n/** Floats per feature */\nexport const FLOATS = 32;\n\n/** Where a feature's style holds what */\nexport const STYLE = {\n /** Its color (RGBA) at the first zoom of its range */\n color: 0,\n /** Its second color (RGBA): at the last zoom of its range, a circle's stroke's; a line's or a building's pattern\n * there instead (its place in the icon atlas, texels) */\n second: 4,\n /** Its size: four zooms, then its value at each (a line's width, a building's height, a circle's radius); a fill's\n * pattern's place in the icon atlas at its values */\n size: 8,\n /** Its second size, the same way (a line's offset, a building's base, a circle's stroke's width); a fill's pattern's\n * pixel ratio at its first zoom */\n size2: 16,\n /** The zooms it is drawn from and to */\n range: 24,\n /** A line's blur (CSS pixels) */\n blur: 26,\n /** A building's landmark flag, in a line's blur's place (1: drawn as a monument, no office windows, floodlit at\n * night) */\n landmark: 26,\n /** A line's or a building's pattern's pixel ratio */\n patternRatio: 27,\n /** A fill's pattern by its name's index past one, the page putting its place instead (not kept by the engine) */\n fillPattern: 28,\n /** A line's or a building's, the same way */\n linePattern: 29,\n} as const;\n",
|
|
27
27
|
"/* @ts-self-types=\"./isard_tess.d.ts\" */\n\n/**\n * A vector tile ready for the GPU (`geo::mesh::vector_tiles::TileMesh`), as the engine's `setVectorTileMesh` takes it\n */\nexport class TessellatedTile {\n static __wrap(ptr) {\n const obj = Object.create(TessellatedTile.prototype);\n obj.__wbg_ptr = ptr;\n TessellatedTileFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n TessellatedTileFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_tessellatedtile_free(ptr, 0);\n }\n /**\n * Their triangles\n * @returns {Uint32Array}\n */\n blockIndices() {\n const ret = wasm.tessellatedtile_blockIndices(this.__wbg_ptr);\n return ret;\n }\n /**\n * Per sublayer: its blocks' indices, first and end\n * @returns {Uint32Array}\n */\n blockRanges() {\n const ret = wasm.tessellatedtile_blockRanges(this.__wbg_ptr);\n var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * The blocks of the raised sublayers (`shapes::Block`, 32 bytes each), as bytes\n * @returns {Uint8Array}\n */\n blocks() {\n const ret = wasm.tessellatedtile_blocks(this.__wbg_ptr);\n return ret;\n }\n /**\n * The extent of the tile's points: min x, min y, max x, max y\n * @returns {Float64Array}\n */\n bounds() {\n const ret = wasm.tessellatedtile_bounds(this.__wbg_ptr);\n var v1 = getArrayF64FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);\n return v1;\n }\n /**\n * Per sublayer: its top cap and the rest of its prism, first and end of each (four numbers)\n * @returns {Uint32Array}\n */\n fillRanges() {\n const ret = wasm.tessellatedtile_fillRanges(this.__wbg_ptr);\n var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * The fill triangles\n * @returns {Uint32Array}\n */\n indices() {\n const ret = wasm.tessellatedtile_indices(this.__wbg_ptr);\n return ret;\n }\n /**\n * Per sublayer: its pieces, first and end\n * @returns {Uint32Array}\n */\n lineRanges() {\n const ret = wasm.tessellatedtile_lineRanges(this.__wbg_ptr);\n var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * Feature and length of each line\n * @returns {Float32Array}\n */\n lineTable() {\n const ret = wasm.tessellatedtile_lineTable(this.__wbg_ptr);\n return ret;\n }\n /**\n * The line pieces (`pieces::Piece`, 28 bytes each), as bytes\n * @returns {Uint8Array}\n */\n pieces() {\n const ret = wasm.tessellatedtile_pieces(this.__wbg_ptr);\n return ret;\n }\n /**\n * Whether the prisms were built\n * @returns {boolean}\n */\n prism() {\n const ret = wasm.tessellatedtile_prism(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * The fill vertices (`shapes::Vertex`, 24 bytes each), as bytes\n * @returns {Uint8Array}\n */\n vertices() {\n const ret = wasm.tessellatedtile_vertices(this.__wbg_ptr);\n return ret;\n }\n}\nif (Symbol.dispose) TessellatedTile.prototype[Symbol.dispose] = TessellatedTile.prototype.free;\n\n/**\n * The geometry of a vector tile made ready for the GPU, as the engine's `setVectorTile` takes it: its polygons\n * (interleaved points, `ring_start`, `polygon_start`, the feature of each, `fill_start`: the first polygon of each\n * sublayer and the end), its lines (interleaved points, `line_first`: the first point of each, the feature of each,\n * `line_start`: the first line of each sublayer and the end); `raised`: per sublayer, whether its polygons are extruded\n * into blocks rather than filled; `roofs` and `roof_heights`: per polygon, the shape and height of its block's roof\n * (`shapes::Roofs`; empty: flat), the whole outlines of the buildings the tile cuts (`roof_outlines`, interleaved\n * Mercator points, `roof_outline_start`: where each polygon's starts, and the end), `roof_metres` the metres per\n * Mercator unit at the tile; `prism`: with the prisms the fills need over the relief; `tile`: the corners of the\n * tile they are cut to (west, north, east, south, Mercator; empty: none), along whose edges no wall of a block rises\n * @param {Float64Array} points\n * @param {Uint32Array} ring_start\n * @param {Uint32Array} polygon_start\n * @param {Uint32Array} polygon_feature\n * @param {Uint32Array} fill_start\n * @param {Float64Array} line_points\n * @param {Uint32Array} line_first\n * @param {Uint32Array} line_feature\n * @param {Uint32Array} line_start\n * @param {Uint8Array} raised\n * @param {Uint8Array} roofs\n * @param {Float32Array} roof_heights\n * @param {Float64Array} roof_outlines\n * @param {Uint32Array} roof_outline_start\n * @param {number} roof_metres\n * @param {boolean} prism\n * @param {Float64Array} tile\n * @returns {TessellatedTile}\n */\nexport function tessellateVectorTile(points, ring_start, polygon_start, polygon_feature, fill_start, line_points, line_first, line_feature, line_start, raised, roofs, roof_heights, roof_outlines, roof_outline_start, roof_metres, prism, tile) {\n const ptr0 = passArrayF64ToWasm0(points, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray32ToWasm0(ring_start, wasm.__wbindgen_malloc);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passArray32ToWasm0(polygon_start, wasm.__wbindgen_malloc);\n const len2 = WASM_VECTOR_LEN;\n const ptr3 = passArray32ToWasm0(polygon_feature, wasm.__wbindgen_malloc);\n const len3 = WASM_VECTOR_LEN;\n const ptr4 = passArray32ToWasm0(fill_start, wasm.__wbindgen_malloc);\n const len4 = WASM_VECTOR_LEN;\n const ptr5 = passArrayF64ToWasm0(line_points, wasm.__wbindgen_malloc);\n const len5 = WASM_VECTOR_LEN;\n const ptr6 = passArray32ToWasm0(line_first, wasm.__wbindgen_malloc);\n const len6 = WASM_VECTOR_LEN;\n const ptr7 = passArray32ToWasm0(line_feature, wasm.__wbindgen_malloc);\n const len7 = WASM_VECTOR_LEN;\n const ptr8 = passArray32ToWasm0(line_start, wasm.__wbindgen_malloc);\n const len8 = WASM_VECTOR_LEN;\n const ptr9 = passArray8ToWasm0(raised, wasm.__wbindgen_malloc);\n const len9 = WASM_VECTOR_LEN;\n const ptr10 = passArray8ToWasm0(roofs, wasm.__wbindgen_malloc);\n const len10 = WASM_VECTOR_LEN;\n const ptr11 = passArrayF32ToWasm0(roof_heights, wasm.__wbindgen_malloc);\n const len11 = WASM_VECTOR_LEN;\n const ptr12 = passArrayF64ToWasm0(roof_outlines, wasm.__wbindgen_malloc);\n const len12 = WASM_VECTOR_LEN;\n const ptr13 = passArray32ToWasm0(roof_outline_start, wasm.__wbindgen_malloc);\n const len13 = WASM_VECTOR_LEN;\n const ptr14 = passArrayF64ToWasm0(tile, wasm.__wbindgen_malloc);\n const len14 = WASM_VECTOR_LEN;\n const ret = wasm.tessellateVectorTile(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, ptr4, len4, ptr5, len5, ptr6, len6, ptr7, len7, ptr8, len8, ptr9, len9, ptr10, len10, ptr11, len11, ptr12, len12, ptr13, len13, roof_metres, prism, ptr14, len14);\n return TessellatedTile.__wrap(ret);\n}\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg___wbindgen_throw_41e9ee4f547fc59a: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_new_from_slice_37a3c3a194266cb8: function(arg0, arg1) {\n const ret = new Uint32Array(getArrayU32FromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_new_from_slice_9a868026ffa4208a: function(arg0, arg1) {\n const ret = new Uint8Array(getArrayU8FromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_new_from_slice_ca6ad97db1f4779a: function(arg0, arg1) {\n const ret = new Float32Array(getArrayF32FromWasm0(arg0, arg1));\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n };\n return {\n __proto__: null,\n \"./isard_tess_bg.js\": import0,\n };\n}\n\nconst TessellatedTileFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_tessellatedtile_free(ptr, 1));\n\nfunction getArrayF32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayF64FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getFloat64ArrayMemory0().subarray(ptr / 8, ptr / 8 + len);\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedFloat32ArrayMemory0 = null;\nfunction getFloat32ArrayMemory0() {\n if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32ArrayMemory0;\n}\n\nlet cachedFloat64ArrayMemory0 = null;\nfunction getFloat64ArrayMemory0() {\n if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) {\n cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer);\n }\n return cachedFloat64ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction passArray32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getUint32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayF32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getFloat32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayF64ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 8, 8) >>> 0;\n getFloat64ArrayMemory0().set(arg, ptr / 8);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasmInstance = instance;\n wasm = instance.exports;\n wasmModule = module;\n cachedFloat32ArrayMemory0 = null;\n cachedFloat64ArrayMemory0 = null;\n cachedUint32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (!module.ok) {\n throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);\n }\n\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('isard_tess_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n",
|
|
28
|
-
"/** A vector tile cut into geometry for the engine: the polygons of the extrusions, the fills, lines and buildings of\n * `vectors()` with their style per feature, made ready for the GPU by the tessellation module */\n\nimport type { TileFeature, Value } from '../../basemap/mvt.ts';\nimport {\n type Context,\n color,\n context,\n filter,\n isFeatureDependent,\n type StyleLayer,\n usesZoom,\n vectorKind,\n} from '../../basemap/vectorstyle.ts';\nimport { metresAt, tileUrl } from '../../util/geo.ts';\nimport { type RoofMode, roofHeightOf, roofNumber, roofShapeOf } from '../../util/roofs.ts';\nimport { FLOATS, STYLE } from '../../util/style-floats.ts';\nimport initTess, { tessellateVectorTile } from '../../wasm/isard_tess.js';\nimport type { TileAt, TileMesh, TilePolygons, TileStyles, TileVectors, WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile, value } from './tiles.ts';\nimport { inRings } from './trees.ts';\n\n/**\n * The polygons of a tile's features in the renderer's fill layers (each feature once, whichever layers keep it), in\n * Mercator [0, 1]: a ring turning clockwise in tile units (y down) starts a polygon, the others are its holes (the\n * vector tile specification)\n */\nexport const polygons = async (r: Renderer, work: TileAt) => {\n const { z, x, y, id, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n const out = {\n points: [] as number[],\n ringStart: [] as number[],\n polygonStart: [] as number[],\n feature: [] as number[],\n };\n const properties: Record<string, Value>[] = [];\n\n if (!layers || aborted.has(id)) return undefined;\n\n const seen = new Set<TileFeature>();\n const n = 2 ** z;\n\n r.layers.forEach((layer) => {\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n data.features.forEach((f) => {\n if (f.type !== 3 || seen.has(f) || !filter(layer.filter, context(f, z))) return;\n seen.add(f);\n\n const index = properties.length;\n\n properties.push(f.properties);\n f.geometry.forEach((ring) => {\n // Twice the signed area: positive for a ring turning clockwise on screen, an outline\n let area = 0;\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const j = (i + 2) % ring.length;\n\n area += (ring[i] ?? 0) * (ring[j + 1] ?? 0) - (ring[j] ?? 0) * (ring[i + 1] ?? 0);\n }\n if (area === 0) return;\n if (area > 0 || out.polygonStart.length === 0 || out.feature.at(-1) !== index) {\n out.polygonStart.push(out.ringStart.length);\n out.feature.push(index);\n }\n out.ringStart.push(out.points.length / 2);\n for (let i = 0; i + 1 < ring.length; i += 2) {\n out.points.push((x + (ring[i] ?? 0) / data.extent) / n, (y + (ring[i + 1] ?? 0) / data.extent) / n);\n }\n });\n });\n });\n out.ringStart.push(out.points.length / 2);\n out.polygonStart.push(out.ringStart.length - 1);\n\n return {\n arrays: {\n points: Float64Array.from(out.points),\n ringStart: Uint32Array.from(out.ringStart),\n polygonStart: Uint32Array.from(out.polygonStart),\n feature: Uint32Array.from(out.feature),\n },\n properties,\n } satisfies TilePolygons;\n};\n\n/** OpenMapTiles' classes of points of interest whose building is a landmark */\nconst LANDMARKS = new Set(['theatre', 'museum', 'place_of_worship', 'castle', 'monument', 'attraction', 'town_hall']);\n\n/** The landmarks of a tile: its points of interest of `LANDMARKS` (x, y interleaved, tile units) */\nexport const landmarksOf = (layers: Map<string, { features: TileFeature[] }> | undefined): number[] =>\n (layers?.get('poi')?.features ?? [])\n .filter((f) => f.type === 1 && LANDMARKS.has(String(f.properties.class)))\n .flatMap((f) => f.geometry.flat());\n\n/** The bounding box of a ring (x, y interleaved): west, north, east, south */\nconst boxOf = (ring: readonly number[]): [number, number, number, number] => {\n let [x0, y0, x1, y1] = [Infinity, Infinity, -Infinity, -Infinity];\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n [x0, y0] = [Math.min(x0, ring[i] ?? 0), Math.min(y0, ring[i + 1] ?? 0)];\n [x1, y1] = [Math.max(x1, ring[i] ?? 0), Math.max(y1, ring[i + 1] ?? 0)];\n }\n\n return [x0, y0, x1, y1];\n};\n\n/** Whether a building's rings (tile units) hold one of the landmarks' points */\nexport const holdsLandmark = (rings: readonly (readonly number[])[], points: readonly number[]): boolean => {\n if (points.length === 0) return false;\n\n const [x0, y0, x1, y1] = boxOf(rings[0] ?? []);\n\n for (let i = 0; i + 1 < points.length; i += 2) {\n const [px, py] = [points[i] ?? 0, points[i + 1] ?? 0];\n\n if (px >= x0 && px <= x1 && py >= y0 && py <= y1 && inRings(rings, px, py)) return true;\n }\n\n return false;\n};\n\n/** The mean of a ring's corners (its last point left out when it is the first again) */\nconst middleOf = (ring: readonly number[]): [number, number] => {\n const closed = ring.length > 2 && ring[0] === ring[ring.length - 2] && ring[1] === ring[ring.length - 1];\n const n = Math.max(1, ring.length / 2 - (closed ? 1 : 0));\n let [x, y] = [0, 0];\n\n for (let i = 0; i < n; i += 1) [x, y] = [x + (ring[i * 2] ?? 0), y + (ring[i * 2 + 1] ?? 0)];\n\n return [x / n, y / n];\n};\n\n/**\n * The buildings of a layer that are landmarks: those holding a landmark's point (`holdsLandmark`), and the parts of\n * those (a building whose middle is inside one of them, or that holds one's middle: the stage tower, the dome). Their\n * walls along each other drawn alike, not one floodlit fighting a dark one as the view moves; a neighbour against a\n * landmark's wall, its middle outside, is none\n */\nexport const landmarkBuildings = (features: readonly TileFeature[], points: readonly number[]): Set<TileFeature> => {\n const polygons = features.filter((f) => f.type === 3);\n const holding = polygons.filter((f) => holdsLandmark(f.geometry, points));\n const found = new Set(holding);\n\n holding.forEach((l) => {\n const [lx0, ly0, lx1, ly1] = boxOf(l.geometry[0] ?? []);\n const lm = middleOf(l.geometry[0] ?? []);\n\n polygons.forEach((f) => {\n if (found.has(f)) return;\n\n const [x0, y0, x1, y1] = boxOf(f.geometry[0] ?? []);\n\n if (x1 < lx0 || x0 > lx1 || y1 < ly0 || y0 > ly1) return;\n if (inRings(l.geometry, ...middleOf(f.geometry[0] ?? [])) || inRings(f.geometry, ...lm)) found.add(f);\n });\n });\n\n return found;\n};\n\n/** The features a kind of sublayer draws, by their type (1 point, 2 line, 3 polygon): lines from lines and polygons'\n * rings, circles from points, fills and blocks from polygons */\nconst DRAWS: Record<NonNullable<ReturnType<typeof vectorKind>>, (type: number) => boolean> = {\n line: (type) => type !== 1,\n circle: (type) => type === 1,\n fill: (type) => type === 3,\n extrusion: (type) => type === 3,\n};\n\n/** A building's roof for the engine: its shape's number (`roofShapeOf`; 0 none) and height (`roofHeightOf`) */\nexport const roofOf = (properties: Record<string, Value>, mode: RoofMode): [number, number] => {\n const shape = roofShapeOf(properties, mode);\n\n return [shape === undefined ? 0 : (roofNumber(shape) ?? 0), roofHeightOf(properties)];\n};\n\n/** The last zoom a tile of the deepest level is drawn at (stretched past it) */\nconst LAST_ZOOM = 24;\n\n/**\n * The zooms a feature shows over by its layer's filter, as MapLibre evaluates a filter (at the whole zoom under the\n * camera's): its filter at each whole zoom of the range a tile of level `z` is drawn over (`z - 1` to `last`), from\n * the first where it holds to past the last (open at the ends of the range, `[0, 0]` for a filter that does not read\n * the zoom); undefined if it holds at none\n */\nexport const filterZooms = (\n layer: StyleLayer,\n feature: TileFeature,\n z: number,\n last: number,\n): [number, number] | undefined => {\n if (!usesZoom(layer.filter)) return filter(layer.filter, context(feature, z)) ? [0, 0] : undefined;\n\n let from: number | undefined;\n let to = 0;\n\n for (let k = z - 1; k <= last; k += 1) {\n if (filter(layer.filter, context(feature, k))) {\n from ??= k;\n to = k + 1;\n } else if (from !== undefined) {\n break;\n }\n }\n\n return from === undefined ? undefined : [from <= z - 1 ? 0 : from, to > last ? 99 : to];\n};\n\n/**\n * A ring cut to the square [0, `extent`] (Sutherland–Hodgman), its points interleaved, unclosed: a polygon lying\n * across the tile's edge keeps its part in the tile, along the edge\n */\nexport const clipRing = (ring: readonly number[], extent: number): number[] => {\n let points = ring.slice();\n const edges: [axis: 0 | 1, bound: number, inside: (v: number) => boolean][] = [\n [0, 0, (v) => v >= 0],\n [0, extent, (v) => v <= extent],\n [1, 0, (v) => v >= 0],\n [1, extent, (v) => v <= extent],\n ];\n\n for (const [axis, bound, inside] of edges) {\n const out: number[] = [];\n const n = points.length / 2;\n\n for (let i = 0; i < n; i += 1) {\n const [ax, ay] = [points[i * 2] ?? 0, points[i * 2 + 1] ?? 0];\n const j = (i + 1) % n;\n const [bx, by] = [points[j * 2] ?? 0, points[j * 2 + 1] ?? 0];\n const [a, b] = axis === 0 ? [ax, bx] : [ay, by];\n\n if (inside(a)) out.push(ax, ay);\n if (inside(a) !== inside(b)) {\n const t = (bound - a) / (b - a);\n\n out.push(axis === 0 ? bound : ax + (bx - ax) * t, axis === 0 ? ay + (by - ay) * t : bound);\n }\n }\n points = out;\n if (points.length === 0) break;\n }\n\n return points;\n};\n\n/** Tile units of a quarter pixel (a tile is drawn 512 pixels across at its zoom): what lines are simplified to */\nconst SIMPLIFY_EXTENT_SHARE = 1 / 2048;\n\n/**\n * A line with the points dropped that lie within `tolerance` of the line through their neighbours kept (Douglas–\n * Peucker): a sequence of photos every few metres (Panoramax's) drawn as many pieces under a pixel, each as wide as the\n * line, covered a pixel ten times over\n */\nexport const simplifyLine = (line: readonly number[], tolerance: number): number[] => {\n const count = line.length / 2;\n\n if (count <= 2) return [...line];\n\n const keep = new Uint8Array(count);\n const stack: [number, number][] = [[0, count - 1]];\n const square = tolerance * tolerance;\n\n keep[0] = 1;\n keep[count - 1] = 1;\n while (stack.length > 0) {\n const [a, b] = stack.pop() ?? [0, 0];\n const [ax, ay, bx, by] = [line[a * 2] ?? 0, line[a * 2 + 1] ?? 0, line[b * 2] ?? 0, line[b * 2 + 1] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n const length = dx * dx + dy * dy;\n let [far, farthest] = [-1, square];\n\n for (let i = a + 1; i < b; i += 1) {\n const [px, py] = [(line[i * 2] ?? 0) - ax, (line[i * 2 + 1] ?? 0) - ay];\n // Squared distance to the segment a–b (to a when it is a point)\n const t = length > 0 ? Math.max(0, Math.min(1, (px * dx + py * dy) / length)) : 0;\n const d = (px - t * dx) ** 2 + (py - t * dy) ** 2;\n\n if (d > farthest) [far, farthest] = [i, d];\n }\n if (far >= 0) {\n keep[far] = 1;\n stack.push([a, far], [far, b]);\n }\n }\n\n return line.filter((_, i) => keep[i >> 1] === 1);\n};\n\n/** A line cut to the square [0, `extent`] (Liang–Barsky per segment): its runs inside, each two points at least */\nexport const clipLine = (line: readonly number[], extent: number): number[][] => {\n const runs: number[][] = [];\n let run: number[] = [];\n const end = () => {\n if (run.length >= 4) runs.push(run);\n run = [];\n };\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n let [t0, t1] = [0, 1];\n\n for (const [p, q] of [\n [-dx, ax],\n [dx, extent - ax],\n [-dy, ay],\n [dy, extent - ay],\n ] as const) {\n if (p === 0) {\n if (q < 0) t1 = -1;\n } else if (p < 0) t0 = Math.max(t0, q / p);\n else t1 = Math.min(t1, q / p);\n }\n if (t0 > t1) {\n end();\n continue;\n }\n if (run.length === 0 || t0 > 0) {\n end();\n run.push(ax + dx * t0, ay + dy * t0);\n }\n run.push(ax + dx * t1, ay + dy * t1);\n if (t1 < 1) end();\n }\n end();\n\n return runs;\n};\n\n/** The zooms a tile of level `z` is styled at: the range it is drawn over, and deeper for the deepest level, which\n * the map stretches past it */\nconst styleZooms = (z: number, deepest: number): [number, number, number, number] => {\n return z >= deepest ? [z - 0.5, z + 1, z + 3, z + 6] : [z - 0.5, z - 1 / 6, z + 1 / 6, z + 0.5];\n};\n\n/**\n * The geometry of a feature of a tile of the source's level in the units of its tile `d` levels deeper at (`ox`, `oy`)\n * among the `2^d × 2^d` it holds (overzoom); undefined if none of it lies in that tile (its points' bounds outside\n * it or along its edge: nothing left once cut to it)\n */\nconst overzoomed = (\n geometry: readonly (readonly number[])[],\n extent: number,\n d: number,\n ox: number,\n oy: number,\n): number[][] | undefined => {\n const scale = 2 ** d;\n const [x0, y0] = [ox * extent, oy * extent];\n const bounds = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ];\n\n geometry.forEach((part) => {\n for (let i = 0; i + 1 < part.length; i += 2) {\n const [px, py] = [(part[i] ?? 0) * scale - x0, (part[i + 1] ?? 0) * scale - y0];\n\n bounds[0] = Math.min(bounds[0] ?? px, px);\n bounds[1] = Math.min(bounds[1] ?? py, py);\n bounds[2] = Math.max(bounds[2] ?? px, px);\n bounds[3] = Math.max(bounds[3] ?? py, py);\n }\n });\n\n const [minX = 0, minY = 0, maxX = 0, maxY = 0] = bounds;\n\n if (maxX <= 0 || maxY <= 0 || minX >= extent || minY >= extent) return undefined;\n\n return geometry.map((part) => part.map((v, i) => v * scale - (i % 2 === 0 ? x0 : y0)));\n};\n\n/** The styles of a tile's styled features, as `TileStyles` gives them, with their properties and sublayers */\nconst styleSink = (zooms: [number, number, number, number]) => {\n const styles: number[] = [];\n /** The names of the fills' patterns (`fill-pattern`), a styled feature giving its own as its index past one */\n const patterns: string[] = [];\n const properties: Record<string, Value>[] = [];\n const sublayer: number[] = [];\n\n /** A styled feature: its style, properties and sublayer (`outline`: a fill's outline, a line of 1 pixel in its\n * `fill-outline-color`); its number */\n const add = (\n s: number,\n layer: StyleLayer,\n ctx: Context,\n props: Record<string, Value>,\n shown: [number, number],\n outline = false,\n ): number => {\n const at = (key: string, fallback: unknown, zoom: number) => value(layer, 'paint', key, { ...ctx, zoom }, fallback);\n // An opacity of the zoom only is the sublayer's, evaluated at the camera's zoom (the same across tiles of other\n // levels); one of the features is folded into their color\n const opacityKey = `${layer.type}-opacity`;\n const ownOpacity = isFeatureDependent(layer.paint?.[opacityKey]);\n /** The color at a zoom, its own opacity folded in */\n const paintAt = (zoom: number): number[] => {\n const [r, g, b, a] = color(at(outline ? 'fill-outline-color' : `${layer.type}-color`, '#000', zoom)) ?? [\n 0, 0, 0, 1,\n ];\n\n return [r, g, b, a * (ownOpacity ? Number(at(opacityKey, 1, zoom)) : 1)];\n };\n const out = new Array<number>(FLOATS).fill(0);\n\n // The color at the first and at the last zoom of the range the tile is drawn over (at the second for a tile of the\n // source's deepest level, styled over six levels past it: the engine mixes the two up to that zoom, see\n // `u_zoom_colors`): a color interpolated by zoom changes smoothly across tiles of other levels\n const colorEnd = zooms[3] - zooms[0] > 1.5 ? zooms[1] : zooms[3];\n\n out.splice(STYLE.color, 8, ...paintAt(zooms[0]), ...paintAt(colorEnd));\n out.splice(STYLE.range, 2, ...shown);\n if (!outline && ['fill', 'background', 'line', 'fill-extrusion'].includes(layer.type)) {\n // Its pattern in the middle of the tile's zooms: its name's index past one (the page puts its place in the icon\n // atlas)\n const name = at(`${layer.type}-pattern`, '', (zooms[0] + colorEnd) / 2);\n\n if (typeof name === 'string' && name) {\n const known = patterns.indexOf(name);\n\n out[layer.type === 'fill' || layer.type === 'background' ? STYLE.fillPattern : STYLE.linePattern] =\n (known >= 0 ? known : patterns.push(name) - 1) + 1;\n }\n }\n if (layer.type === 'circle') {\n // A circle's colors in the middle of the tile's zooms: its second color is its stroke's, not the color at the\n // end of the range\n const middle = (zooms[0] + colorEnd) / 2;\n const [r, g, b, a] = color(at('circle-stroke-color', '#000', middle)) ?? [0, 0, 0, 1];\n\n out.splice(STYLE.color, 8, ...paintAt(middle), r, g, b, a * Number(at('circle-stroke-opacity', 1, middle)));\n }\n zooms.forEach((zoom, k) => {\n out[STYLE.size + k] = zoom;\n // A fill's outline: one pixel wide, as MapLibre draws it\n if (outline) {\n out[STYLE.size + 4 + k] = 1;\n\n return;\n }\n // A circle: its radius and stroke width\n if (layer.type === 'circle') {\n out[STYLE.size + 4 + k] = Math.max(0, Number(at('circle-radius', 5, zoom)) || 0);\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Math.max(0, Number(at('circle-stroke-width', 0, zoom)) || 0);\n\n return;\n }\n // A building: its height and base height (metres) at the same zooms\n if (layer.type === 'fill-extrusion') {\n out[STYLE.size + 4 + k] = Math.max(0, Number(at('fill-extrusion-height', 0, zoom)) || 0);\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Math.max(0, Number(at('fill-extrusion-base', 0, zoom)) || 0);\n\n return;\n }\n if (layer.type !== 'line') return;\n\n // Its blur in the middle of the tile's zooms (CSS pixels)\n if (k === 0) out[STYLE.blur] = Math.max(0, Number(at('line-blur', 0, (zooms[0] + colorEnd) / 2)) || 0);\n\n const width = Number(at('line-width', 1, zoom));\n const gap = Number(at('line-gap-width', 0, zoom));\n\n out[STYLE.size + 4 + k] = Math.max(0, gap > 0 ? gap + 2 * width : width);\n // Its offset to the right of the line (CSS pixels), the second size\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Number(at('line-offset', 0, zoom)) || 0;\n });\n styles.push(...out);\n properties.push(props);\n sublayer.push(s);\n\n return properties.length - 1;\n };\n\n /** A styled feature's building marked a landmark (1: drawn as a monument, no office windows, floodlit at night) */\n const landmark = (f: number) => {\n styles[f * FLOATS + STYLE.landmark] = 1;\n };\n\n return { add, landmark, styles, patterns, properties, sublayer };\n};\n\n/** The fills, lines and circles of the tile (`x`, `y` of `n` across) cut for the engine, sublayer after sublayer */\nconst geometrySink = (x: number, y: number, n: number) => {\n const fills: Record<\n 'points' | 'ringStart' | 'polygonStart' | 'feature' | 'roofs' | 'roofHeights' | 'roofOutlines' | 'roofOutlineStart',\n number[]\n > = {\n points: [],\n ringStart: [],\n polygonStart: [],\n feature: [],\n // Per polygon, its block's roof (`roofOf`; flat for a fill), and the whole outline of a building the tile cuts\n // (its roof built over it: its ridges go on in the next tile)\n roofs: [],\n roofHeights: [],\n roofOutlines: [],\n roofOutlineStart: [],\n };\n const lines: Record<'points' | 'start' | 'feature', number[]> = { points: [], start: [], feature: [] };\n /** The points of the circle sublayers (Mercator), each with its styled feature */\n const circles: Record<'points' | 'feature', number[]> = { points: [], feature: [] };\n /** The first polygon, line and circle of each sublayer */\n const starts: Record<'fill' | 'line' | 'circle', number[]> = { fill: [], line: [], circle: [] };\n\n /** A point of the tile in Mercator */\n const mercator = (px: number, py: number, extent: number): [number, number] => [\n (x + px / extent) / n,\n (y + py / extent) / n,\n ];\n\n /** A polygon of styled feature `f` starts, with its roof */\n const polygon = (f: number, roof: number, roofHeight: number) => {\n fills.polygonStart.push(fills.ringStart.length);\n fills.feature.push(f);\n fills.roofs.push(roof);\n fills.roofHeights.push(roofHeight);\n fills.roofOutlineStart.push(fills.roofOutlines.length / 2);\n };\n\n /** Where each sublayer's polygons, lines and circles end so far (the next one's start) */\n const mark = () => {\n starts.fill.push(fills.polygonStart.length);\n starts.line.push(lines.start.length);\n starts.circle.push(circles.feature.length);\n };\n\n return {\n /** The next sublayer starts */\n sublayer: mark,\n /** A background: the whole tile filled */\n background: (f: number) => {\n polygon(f, 0, Number.NaN);\n fills.ringStart.push(fills.points.length / 2);\n fills.points.push(x / n, y / n, (x + 1) / n, y / n, (x + 1) / n, (y + 1) / n, x / n, (y + 1) / n);\n },\n /** Each point inside the tile (one on its edge is the next tile's too: drawn once) */\n circles: (geometry: number[][], f: number, extent: number) => {\n geometry.forEach((part) => {\n for (let i = 0; i + 1 < part.length; i += 2) {\n const [px = 0, py = 0] = [part[i], part[i + 1]];\n\n if (px < 0 || py < 0 || px >= extent || py >= extent) continue;\n circles.points.push(...mercator(px, py, extent));\n circles.feature.push(f);\n }\n });\n },\n /** The parts of a feature as lines of `f` cut to the tile (`closed`: a polygon's rings, each closed: its outline) */\n lines: (geometry: number[][], closed: boolean, f: number, extent: number) => {\n geometry.forEach((part) => {\n const line = closed && part.length >= 2 ? [...part, part[0] ?? 0, part[1] ?? 0] : part;\n\n clipLine(line, extent).forEach((clipped) => {\n const run = simplifyLine(clipped, extent * SIMPLIFY_EXTENT_SHARE);\n\n lines.start.push(lines.points.length / 2);\n lines.feature.push(f);\n for (let i = 0; i + 1 < run.length; i += 2)\n lines.points.push(...mercator(run[i] ?? 0, run[i + 1] ?? 0, extent));\n });\n });\n },\n /** A feature's polygons cut to the tile, with their roof (a building's: the whole outline of one the tile cuts) */\n polygons: (geometry: number[][], f: number, [roof, roofHeight]: [number, number], extent: number) => {\n let outline = false;\n\n geometry.forEach((ring) => {\n // Twice the signed area: positive for a ring turning clockwise on screen, an outline (as `polygons`)\n let area = 0;\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const j = (i + 2) % ring.length;\n\n area += (ring[i] ?? 0) * (ring[j + 1] ?? 0) - (ring[j] ?? 0) * (ring[i + 1] ?? 0);\n }\n if (area === 0) return;\n // A hole of an outline cut away: dropped\n if (area < 0 && !outline) return;\n\n const clipped = clipRing(ring, extent);\n\n if (area > 0) outline = clipped.length >= 6;\n if (clipped.length < 6) return;\n if (area > 0) {\n polygon(f, roof, roofHeight);\n // A building with a sloped roof the tile cuts: its whole outline (a flat one's as the tile cuts it)\n if (roof > 1 && ring.some((v) => v < 0 || v > extent)) {\n for (let i = 0; i + 1 < ring.length; i += 2)\n fills.roofOutlines.push(...mercator(ring[i] ?? 0, ring[i + 1] ?? 0, extent));\n }\n }\n fills.ringStart.push(fills.points.length / 2);\n for (let i = 0; i + 1 < clipped.length; i += 2)\n fills.points.push(...mercator(clipped[i] ?? 0, clipped[i + 1] ?? 0, extent));\n });\n },\n /** The geometry once every sublayer is in, as `TileVectors` takes it (the ends of the last ones closed) */\n done: (): Pick<TileVectors, 'fills' | 'lines' | 'circles' | 'tile'> => {\n mark();\n fills.ringStart.push(fills.points.length / 2);\n fills.polygonStart.push(fills.ringStart.length - 1);\n fills.roofOutlineStart.push(fills.roofOutlines.length / 2);\n lines.start.push(lines.points.length / 2);\n\n return {\n fills: {\n points: Float64Array.from(fills.points),\n ringStart: Uint32Array.from(fills.ringStart),\n polygonStart: Uint32Array.from(fills.polygonStart),\n feature: Uint32Array.from(fills.feature),\n fillStart: Uint32Array.from(starts.fill),\n roofs: Uint8Array.from(fills.roofs),\n roofHeights: Float32Array.from(fills.roofHeights),\n roofOutlines: Float64Array.from(fills.roofOutlines),\n roofOutlineStart: Uint32Array.from(fills.roofOutlineStart),\n // Metres per Mercator unit at the tile's middle (its latitude's)\n roofMetres: metresAt((y + 0.5) / n),\n },\n lines: {\n points: Float64Array.from(lines.points),\n start: Uint32Array.from(lines.start),\n feature: Uint32Array.from(lines.feature),\n lineStart: Uint32Array.from(starts.line),\n },\n circles: {\n points: Float64Array.from(circles.points),\n feature: Uint32Array.from(circles.feature),\n circleStart: Uint32Array.from(starts.circle),\n },\n tile: Float64Array.of(x / n, y / n, (x + 1) / n, (y + 1) / n),\n };\n },\n };\n};\n\n/**\n * Goes through a tile's features in the renderer's layers as `vectors()` draws them: each one styled, and cut to the\n * tile into `geometry` when given. A tile past the source's deepest level is cut from its tile there (overzoom);\n * undefined if the request was aborted\n */\nconst cut = async (\n r: Renderer,\n work: WorkOf<'vectors'>,\n geometry?: ReturnType<typeof geometrySink>,\n): Promise<ReturnType<typeof styleSink> | undefined> => {\n const { z, x, y, id, priority, deepest = r.maxzoom, roofs: roofMode = 'data', covered = [] } = work;\n // Past the source's deepest level: cut from its tile there\n const d = Math.max(0, z - r.maxzoom);\n const [vz, vx, vy] = [z - d, Math.floor(x / 2 ** d), Math.floor(y / 2 ** d)];\n const [ox, oy] = [x - vx * 2 ** d, y - vy * 2 ** d];\n const layers = await tile(tileUrl(r.tiles, vz, vx, vy), priority);\n\n if (aborted.has(id)) return undefined;\n\n const landmarks = landmarksOf(layers);\n /** The landmarks' buildings by source layer, found once for the style layers drawing it */\n const landmarkSets = new Map<readonly TileFeature[], Set<TileFeature>>();\n const landmarksIn = (features: readonly TileFeature[]) => {\n const found =\n landmarkSets.get(features) ?? (landmarks.length > 0 ? landmarkBuildings(features, landmarks) : new Set());\n\n landmarkSets.set(features, found);\n\n return found;\n };\n /** Whether a raised building stands where 3D buildings take its place: its first point in a box of `covered` */\n const replaced = (feature: TileFeature, extent: number) => {\n if (covered.length === 0) return false;\n\n const [px = 0, py = 0] = feature.geometry[0] ?? [];\n const [lon, lat] = lonLat(vz, vx, vy, extent, px, py);\n\n for (let i = 0; i + 3 < covered.length; i += 4) {\n if (lon >= (covered[i] ?? 0) && lat >= (covered[i + 1] ?? 0) && lon <= (covered[i + 2] ?? 0)) {\n if (lat <= (covered[i + 3] ?? 0)) return true;\n }\n }\n\n return false;\n };\n const styled = styleSink(styleZooms(z, Math.max(deepest, r.maxzoom)));\n // The last whole zoom the tile is drawn at: its own, or every one past the deepest level, where it is stretched\n const last = z >= Math.max(deepest, r.maxzoom) ? LAST_ZOOM : z;\n\n r.layers.forEach((layer, s) => {\n geometry?.sublayer();\n\n const kind = vectorKind(layer);\n // A fill's outline, drawn over it as lines of its sublayer (the rings as they come, past the tile's edge cut away:\n // no line along the edge)\n const outlined =\n layer.type === 'fill' &&\n layer.paint?.['fill-outline-color'] !== undefined &&\n layer.paint?.['fill-antialias'] !== false;\n\n if (!kind) return;\n if (layer.type === 'background') {\n // Styled even without geometry: the restyled styles number the same features\n const f = styled.add(s, layer, { zoom: z, properties: {}, type: 'Unknown' }, {}, [0, 0]);\n\n geometry?.background(f);\n\n return;\n }\n\n const data = layers?.get(layer['source-layer'] ?? '');\n\n data?.features.forEach((feature) => {\n if (!DRAWS[kind](feature.type)) return;\n\n if (kind === 'extrusion' && replaced(feature, data.extent)) return;\n\n const ctx = context(feature, z);\n const shown = filterZooms(layer, feature, z, last);\n\n if (!shown) return;\n\n // In the units of the tile asked for (the same as the source's but past its deepest level)\n const parts = d > 0 ? overzoomed(feature.geometry, data.extent, d, ox, oy) : feature.geometry;\n\n if (!parts) return;\n\n const f = styled.add(s, layer, ctx, feature.properties, shown);\n const o = outlined ? styled.add(s, layer, ctx, feature.properties, shown, true) : -1;\n\n // A landmark's building or one of its parts (in the source tile's units, as the points)\n if (kind === 'extrusion' && landmarksIn(data.features).has(feature)) styled.landmark(f);\n if (!geometry) return;\n if (kind === 'circle') {\n geometry.circles(parts, f, data.extent);\n\n return;\n }\n if (kind === 'line') {\n // A polygon's rings, closed: its outline\n geometry.lines(parts, feature.type === 3, f, data.extent);\n\n return;\n }\n if (o >= 0) geometry.lines(parts, true, o, data.extent);\n\n const roof: [number, number] = kind === 'extrusion' ? roofOf(feature.properties, roofMode) : [0, Number.NaN];\n\n geometry.polygons(parts, f, roof, data.extent);\n });\n });\n\n return styled;\n};\n\n/** The styles alone of a tile's features in the renderer's layers, as `tileVectors` gives them (its paint changed:\n * the same features, in the same order) */\nexport const tileStyles = async (r: Renderer, work: WorkOf<'vectors'>): Promise<TileStyles | undefined> => {\n const styled = await cut(r, work);\n\n return styled && { styles: Float32Array.from(styled.styles), patterns: styled.patterns };\n};\n\n/**\n * The fills, lines, circles and buildings of a tile's features in the renderer's layers, cut to the tile, in Mercator\n * [0, 1], each with its style (color, its opacity folded in; a line's width, its gap folded in as the casing drawn by\n * `draw`; at four zooms over the range the tile is drawn at)\n */\nexport const tileVectors = async (r: Renderer, work: WorkOf<'vectors'>): Promise<TileVectors | undefined> => {\n const geometry = geometrySink(work.x, work.y, 2 ** work.z);\n const styled = await cut(r, work, geometry);\n\n if (!styled) return undefined;\n\n return {\n ...geometry.done(),\n styles: Float32Array.from(styled.styles),\n patterns: styled.patterns,\n properties: styled.properties,\n sublayer: Uint16Array.from(styled.sublayer),\n } satisfies TileVectors;\n};\n\n/** The tessellation module: where it is, and once loaded whether it works (false: the main thread does its work) */\nexport const tess: { url?: string; ready?: Promise<boolean> } = {};\n\n/** The tessellation module loaded, once; false without one or if it failed */\nexport const tessellator = (): Promise<boolean> => {\n if (!tess.url) return Promise.resolve(false);\n\n const ready =\n tess.ready ??\n initTess({ module_or_path: tess.url }).then(\n () => true,\n (error: unknown) => {\n console.warn('isard: the tessellation module failed to load, the main thread does its work', error);\n\n return false;\n },\n );\n\n tess.ready = ready;\n\n return ready;\n};\n\n/** A cut tile made ready for the GPU by the tessellation module (`raised`: per sublayer, whether its polygons are\n * extruded into blocks); undefined if it fails (it is then left aside) */\nexport const tessellate = (out: TileVectors, raised: Uint8Array, prism: boolean): TileMesh | undefined => {\n const { fills, lines } = out;\n\n try {\n const t = tessellateVectorTile(\n fills.points,\n fills.ringStart,\n fills.polygonStart,\n fills.feature,\n fills.fillStart,\n lines.points,\n lines.start,\n lines.feature,\n lines.lineStart,\n raised,\n fills.roofs ?? new Uint8Array(),\n fills.roofHeights ?? new Float32Array(),\n fills.roofOutlines ?? new Float64Array(),\n fills.roofOutlineStart ?? new Uint32Array(),\n fills.roofMetres ?? 0,\n prism,\n out.tile ?? new Float64Array(),\n );\n const mesh: TileMesh = {\n vertices: t.vertices(),\n indices: t.indices(),\n fillRanges: t.fillRanges(),\n prism: t.prism(),\n pieces: t.pieces(),\n lineTable: t.lineTable(),\n lineRanges: t.lineRanges(),\n blocks: t.blocks(),\n blockIndices: t.blockIndices(),\n blockRanges: t.blockRanges(),\n bounds: t.bounds(),\n };\n\n t.free();\n\n return mesh;\n } catch (error) {\n // A trap leaves the module unusable: the next tiles without it\n console.warn('isard: the tessellation module failed, the main thread does its work', error);\n tess.ready = Promise.resolve(false);\n\n return undefined;\n }\n};\n",
|
|
28
|
+
"/** A vector tile cut into geometry for the engine: the polygons of the extrusions, the fills, lines and buildings of\n * `vectors()` with their style per feature, made ready for the GPU by the tessellation module */\n\nimport type { TileFeature, Value } from '../../basemap/mvt.ts';\nimport {\n type Context,\n color,\n context,\n filter,\n isFeatureDependent,\n type StyleLayer,\n usesZoom,\n vectorKind,\n} from '../../basemap/vectorstyle.ts';\nimport { metresAt, tileUrl } from '../../util/geo.ts';\nimport { type RoofMode, roofHeightOf, roofNumber, roofShapeOf } from '../../util/roofs.ts';\nimport { FLOATS, STYLE } from '../../util/style-floats.ts';\nimport initTess, { tessellateVectorTile } from '../../wasm/isard_tess.js';\nimport type { TileAt, TileMesh, TilePolygons, TileStyles, TileVectors, WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile, value } from './tiles.ts';\nimport { inRings } from './trees.ts';\n\n/**\n * The polygons of a tile's features in the renderer's fill layers (each feature once, whichever layers keep it), in\n * Mercator [0, 1]: a ring turning clockwise in tile units (y down) starts a polygon, the others are its holes (the\n * vector tile specification)\n */\nexport const polygons = async (r: Renderer, work: TileAt) => {\n const { z, x, y, id, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n const out = {\n points: [] as number[],\n ringStart: [] as number[],\n polygonStart: [] as number[],\n feature: [] as number[],\n };\n const properties: Record<string, Value>[] = [];\n\n if (!layers || aborted.has(id)) return undefined;\n\n const seen = new Set<TileFeature>();\n const n = 2 ** z;\n\n r.layers.forEach((layer) => {\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n data.features.forEach((f) => {\n if (f.type !== 3 || seen.has(f) || !filter(layer.filter, context(f, z))) return;\n seen.add(f);\n\n const index = properties.length;\n\n properties.push(f.properties);\n f.geometry.forEach((ring) => {\n // Twice the signed area: positive for a ring turning clockwise on screen, an outline\n let area = 0;\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const j = (i + 2) % ring.length;\n\n area += (ring[i] ?? 0) * (ring[j + 1] ?? 0) - (ring[j] ?? 0) * (ring[i + 1] ?? 0);\n }\n if (area === 0) return;\n if (area > 0 || out.polygonStart.length === 0 || out.feature.at(-1) !== index) {\n out.polygonStart.push(out.ringStart.length);\n out.feature.push(index);\n }\n out.ringStart.push(out.points.length / 2);\n for (let i = 0; i + 1 < ring.length; i += 2) {\n out.points.push((x + (ring[i] ?? 0) / data.extent) / n, (y + (ring[i + 1] ?? 0) / data.extent) / n);\n }\n });\n });\n });\n out.ringStart.push(out.points.length / 2);\n out.polygonStart.push(out.ringStart.length - 1);\n\n return {\n arrays: {\n points: Float64Array.from(out.points),\n ringStart: Uint32Array.from(out.ringStart),\n polygonStart: Uint32Array.from(out.polygonStart),\n feature: Uint32Array.from(out.feature),\n },\n properties,\n } satisfies TilePolygons;\n};\n\n/** OpenMapTiles' classes of points of interest whose building is a landmark */\nconst LANDMARKS = new Set(['theatre', 'museum', 'place_of_worship', 'castle', 'monument', 'attraction', 'town_hall']);\n\n/** The landmarks of a tile: its points of interest of `LANDMARKS` (x, y interleaved, tile units) */\nexport const landmarksOf = (layers: Map<string, { features: TileFeature[] }> | undefined): number[] =>\n (layers?.get('poi')?.features ?? [])\n .filter((f) => f.type === 1 && LANDMARKS.has(String(f.properties.class)))\n .flatMap((f) => f.geometry.flatMap((ring) => Array.from(ring)));\n\n/** The bounding box of a ring (x, y interleaved): west, north, east, south */\nconst boxOf = (ring: ArrayLike<number>): [number, number, number, number] => {\n let [x0, y0, x1, y1] = [Infinity, Infinity, -Infinity, -Infinity];\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n [x0, y0] = [Math.min(x0, ring[i] ?? 0), Math.min(y0, ring[i + 1] ?? 0)];\n [x1, y1] = [Math.max(x1, ring[i] ?? 0), Math.max(y1, ring[i + 1] ?? 0)];\n }\n\n return [x0, y0, x1, y1];\n};\n\n/** Whether a building's rings (tile units) hold one of the landmarks' points */\nexport const holdsLandmark = (rings: readonly ArrayLike<number>[], points: readonly number[]): boolean => {\n if (points.length === 0) return false;\n\n const [x0, y0, x1, y1] = boxOf(rings[0] ?? []);\n\n for (let i = 0; i + 1 < points.length; i += 2) {\n const [px, py] = [points[i] ?? 0, points[i + 1] ?? 0];\n\n if (px >= x0 && px <= x1 && py >= y0 && py <= y1 && inRings(rings, px, py)) return true;\n }\n\n return false;\n};\n\n/** The mean of a ring's corners (its last point left out when it is the first again) */\nconst middleOf = (ring: ArrayLike<number>): [number, number] => {\n const closed = ring.length > 2 && ring[0] === ring[ring.length - 2] && ring[1] === ring[ring.length - 1];\n const n = Math.max(1, ring.length / 2 - (closed ? 1 : 0));\n let [x, y] = [0, 0];\n\n for (let i = 0; i < n; i += 1) [x, y] = [x + (ring[i * 2] ?? 0), y + (ring[i * 2 + 1] ?? 0)];\n\n return [x / n, y / n];\n};\n\n/**\n * The buildings of a layer that are landmarks: those holding a landmark's point (`holdsLandmark`), and the parts of\n * those (a building whose middle is inside one of them, or that holds one's middle: the stage tower, the dome). Their\n * walls along each other drawn alike, not one floodlit fighting a dark one as the view moves; a neighbour against a\n * landmark's wall, its middle outside, is none\n */\nexport const landmarkBuildings = (features: readonly TileFeature[], points: readonly number[]): Set<TileFeature> => {\n const polygons = features.filter((f) => f.type === 3);\n const holding = polygons.filter((f) => holdsLandmark(f.geometry, points));\n const found = new Set(holding);\n\n if (holding.length === 0) return found;\n\n // Each building's outline read once (its point lists are views made as they are read): its box and its middle\n const outlines = polygons.map((f) => {\n const outer = f.geometry[0] ?? [];\n\n return { f, box: boxOf(outer), middle: middleOf(outer) };\n });\n\n outlines\n .filter(({ f }) => found.has(f))\n .forEach((l) => {\n const [lx0, ly0, lx1, ly1] = l.box;\n const rings = l.f.geometry;\n\n outlines.forEach(({ f, box: [x0, y0, x1, y1], middle }) => {\n if (found.has(f) || x1 < lx0 || x0 > lx1 || y1 < ly0 || y0 > ly1) return;\n if (inRings(rings, ...middle) || inRings(f.geometry, ...l.middle)) found.add(f);\n });\n });\n\n return found;\n};\n\n/** The features a kind of sublayer draws, by their type (1 point, 2 line, 3 polygon): lines from lines and polygons'\n * rings, circles from points, fills and blocks from polygons */\nconst DRAWS: Record<NonNullable<ReturnType<typeof vectorKind>>, (type: number) => boolean> = {\n line: (type) => type !== 1,\n circle: (type) => type === 1,\n fill: (type) => type === 3,\n extrusion: (type) => type === 3,\n};\n\n/** A building's roof for the engine: its shape's number (`roofShapeOf`; 0 none) and height (`roofHeightOf`) */\nexport const roofOf = (properties: Record<string, Value>, mode: RoofMode): [number, number] => {\n const shape = roofShapeOf(properties, mode);\n\n return [shape === undefined ? 0 : (roofNumber(shape) ?? 0), roofHeightOf(properties)];\n};\n\n/** The last zoom a tile of the deepest level is drawn at (stretched past it) */\nconst LAST_ZOOM = 24;\n\n/**\n * The zooms a feature shows over by its layer's filter, as MapLibre evaluates a filter (at the whole zoom under the\n * camera's): its filter at each whole zoom of the range a tile of level `z` is drawn over (`z - 1` to `last`), from\n * the first where it holds to past the last (open at the ends of the range, `[0, 0]` for a filter that does not read\n * the zoom); undefined if it holds at none\n */\nexport const filterZooms = (\n layer: StyleLayer,\n feature: TileFeature,\n z: number,\n last: number,\n): [number, number] | undefined => {\n if (!usesZoom(layer.filter)) return filter(layer.filter, context(feature, z)) ? [0, 0] : undefined;\n\n let from: number | undefined;\n let to = 0;\n\n for (let k = z - 1; k <= last; k += 1) {\n if (filter(layer.filter, context(feature, k))) {\n from ??= k;\n to = k + 1;\n } else if (from !== undefined) {\n break;\n }\n }\n\n return from === undefined ? undefined : [from <= z - 1 ? 0 : from, to > last ? 99 : to];\n};\n\n/**\n * A ring cut to the square [0, `extent`] (Sutherland–Hodgman), its points interleaved, unclosed: a polygon lying\n * across the tile's edge keeps its part in the tile, along the edge\n */\nexport const clipRing = (ring: ArrayLike<number>, extent: number): number[] => {\n let points = Array.from(ring);\n const edges: [axis: 0 | 1, bound: number, inside: (v: number) => boolean][] = [\n [0, 0, (v) => v >= 0],\n [0, extent, (v) => v <= extent],\n [1, 0, (v) => v >= 0],\n [1, extent, (v) => v <= extent],\n ];\n\n for (const [axis, bound, inside] of edges) {\n const out: number[] = [];\n const n = points.length / 2;\n\n for (let i = 0; i < n; i += 1) {\n const [ax, ay] = [points[i * 2] ?? 0, points[i * 2 + 1] ?? 0];\n const j = (i + 1) % n;\n const [bx, by] = [points[j * 2] ?? 0, points[j * 2 + 1] ?? 0];\n const [a, b] = axis === 0 ? [ax, bx] : [ay, by];\n\n if (inside(a)) out.push(ax, ay);\n if (inside(a) !== inside(b)) {\n const t = (bound - a) / (b - a);\n\n out.push(axis === 0 ? bound : ax + (bx - ax) * t, axis === 0 ? ay + (by - ay) * t : bound);\n }\n }\n points = out;\n if (points.length === 0) break;\n }\n\n return points;\n};\n\n/** Tile units of a quarter pixel (a tile is drawn 512 pixels across at its zoom): what lines are simplified to */\nconst SIMPLIFY_EXTENT_SHARE = 1 / 2048;\n\n/**\n * A line with the points dropped that lie within `tolerance` of the line through their neighbours kept (Douglas–\n * Peucker): a sequence of photos every few metres (Panoramax's) drawn as many pieces under a pixel, each as wide as the\n * line, covered a pixel ten times over\n */\nexport const simplifyLine = (line: ArrayLike<number>, tolerance: number): number[] => {\n const count = line.length / 2;\n\n if (count <= 2) return Array.from(line);\n\n const keep = new Uint8Array(count);\n const stack: [number, number][] = [[0, count - 1]];\n const square = tolerance * tolerance;\n\n keep[0] = 1;\n keep[count - 1] = 1;\n while (stack.length > 0) {\n const [a, b] = stack.pop() ?? [0, 0];\n const [ax, ay, bx, by] = [line[a * 2] ?? 0, line[a * 2 + 1] ?? 0, line[b * 2] ?? 0, line[b * 2 + 1] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n const length = dx * dx + dy * dy;\n let [far, farthest] = [-1, square];\n\n for (let i = a + 1; i < b; i += 1) {\n const [px, py] = [(line[i * 2] ?? 0) - ax, (line[i * 2 + 1] ?? 0) - ay];\n // Squared distance to the segment a–b (to a when it is a point)\n const t = length > 0 ? Math.max(0, Math.min(1, (px * dx + py * dy) / length)) : 0;\n const d = (px - t * dx) ** 2 + (py - t * dy) ** 2;\n\n if (d > farthest) [far, farthest] = [i, d];\n }\n if (far >= 0) {\n keep[far] = 1;\n stack.push([a, far], [far, b]);\n }\n }\n\n return Array.from(line).filter((_, i) => keep[i >> 1] === 1);\n};\n\n/** A line cut to the square [0, `extent`] (Liang–Barsky per segment): its runs inside, each two points at least */\nexport const clipLine = (line: ArrayLike<number>, extent: number): number[][] => {\n const runs: number[][] = [];\n let run: number[] = [];\n const end = () => {\n if (run.length >= 4) runs.push(run);\n run = [];\n };\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const [dx, dy] = [bx - ax, by - ay];\n let [t0, t1] = [0, 1];\n\n for (const [p, q] of [\n [-dx, ax],\n [dx, extent - ax],\n [-dy, ay],\n [dy, extent - ay],\n ] as const) {\n if (p === 0) {\n if (q < 0) t1 = -1;\n } else if (p < 0) t0 = Math.max(t0, q / p);\n else t1 = Math.min(t1, q / p);\n }\n if (t0 > t1) {\n end();\n continue;\n }\n if (run.length === 0 || t0 > 0) {\n end();\n run.push(ax + dx * t0, ay + dy * t0);\n }\n run.push(ax + dx * t1, ay + dy * t1);\n if (t1 < 1) end();\n }\n end();\n\n return runs;\n};\n\n/** The zooms a tile of level `z` is styled at: the range it is drawn over, and deeper for the deepest level, which\n * the map stretches past it */\nconst styleZooms = (z: number, deepest: number): [number, number, number, number] => {\n return z >= deepest ? [z - 0.5, z + 1, z + 3, z + 6] : [z - 0.5, z - 1 / 6, z + 1 / 6, z + 0.5];\n};\n\n/**\n * The geometry of a feature of a tile of the source's level in the units of its tile `d` levels deeper at (`ox`, `oy`)\n * among the `2^d × 2^d` it holds (overzoom); undefined if none of it lies in that tile (its points' bounds outside\n * it or along its edge: nothing left once cut to it)\n */\nconst overzoomed = (\n geometry: readonly ArrayLike<number>[],\n extent: number,\n d: number,\n ox: number,\n oy: number,\n): number[][] | undefined => {\n const scale = 2 ** d;\n const [x0, y0] = [ox * extent, oy * extent];\n const bounds = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ];\n\n geometry.forEach((part) => {\n for (let i = 0; i + 1 < part.length; i += 2) {\n const [px, py] = [(part[i] ?? 0) * scale - x0, (part[i + 1] ?? 0) * scale - y0];\n\n bounds[0] = Math.min(bounds[0] ?? px, px);\n bounds[1] = Math.min(bounds[1] ?? py, py);\n bounds[2] = Math.max(bounds[2] ?? px, px);\n bounds[3] = Math.max(bounds[3] ?? py, py);\n }\n });\n\n const [minX = 0, minY = 0, maxX = 0, maxY = 0] = bounds;\n\n if (maxX <= 0 || maxY <= 0 || minX >= extent || minY >= extent) return undefined;\n\n return geometry.map((part) => Array.from(part, (v, i) => v * scale - (i % 2 === 0 ? x0 : y0)));\n};\n\n/** The styles of a tile's styled features, as `TileStyles` gives them, with their properties and sublayers */\nconst styleSink = (zooms: [number, number, number, number]) => {\n const styles: number[] = [];\n /** The names of the fills' patterns (`fill-pattern`), a styled feature giving its own as its index past one */\n const patterns: string[] = [];\n const properties: Record<string, Value>[] = [];\n const sublayer: number[] = [];\n\n /** A styled feature: its style, properties and sublayer (`outline`: a fill's outline, a line of 1 pixel in its\n * `fill-outline-color`); its number */\n const add = (\n s: number,\n layer: StyleLayer,\n ctx: Context,\n props: Record<string, Value>,\n shown: [number, number],\n outline = false,\n ): number => {\n const at = (key: string, fallback: unknown, zoom: number) => value(layer, 'paint', key, { ...ctx, zoom }, fallback);\n // An opacity of the zoom only is the sublayer's, evaluated at the camera's zoom (the same across tiles of other\n // levels); one of the features is folded into their color\n const opacityKey = `${layer.type}-opacity`;\n const ownOpacity = isFeatureDependent(layer.paint?.[opacityKey]);\n /** The color at a zoom, its own opacity folded in */\n const paintAt = (zoom: number): number[] => {\n const [r, g, b, a] = color(at(outline ? 'fill-outline-color' : `${layer.type}-color`, '#000', zoom)) ?? [\n 0, 0, 0, 1,\n ];\n\n return [r, g, b, a * (ownOpacity ? Number(at(opacityKey, 1, zoom)) : 1)];\n };\n const out = new Array<number>(FLOATS).fill(0);\n\n // The color at the first and at the last zoom of the range the tile is drawn over (at the second for a tile of the\n // source's deepest level, styled over six levels past it: the engine mixes the two up to that zoom, see\n // `u_zoom_colors`): a color interpolated by zoom changes smoothly across tiles of other levels\n const colorEnd = zooms[3] - zooms[0] > 1.5 ? zooms[1] : zooms[3];\n\n out.splice(STYLE.color, 8, ...paintAt(zooms[0]), ...paintAt(colorEnd));\n out.splice(STYLE.range, 2, ...shown);\n if (!outline && ['fill', 'background', 'line', 'fill-extrusion'].includes(layer.type)) {\n // Its pattern in the middle of the tile's zooms: its name's index past one (the page puts its place in the icon\n // atlas)\n const name = at(`${layer.type}-pattern`, '', (zooms[0] + colorEnd) / 2);\n\n if (typeof name === 'string' && name) {\n const known = patterns.indexOf(name);\n\n out[layer.type === 'fill' || layer.type === 'background' ? STYLE.fillPattern : STYLE.linePattern] =\n (known >= 0 ? known : patterns.push(name) - 1) + 1;\n }\n }\n if (layer.type === 'circle') {\n // A circle's colors in the middle of the tile's zooms: its second color is its stroke's, not the color at the\n // end of the range\n const middle = (zooms[0] + colorEnd) / 2;\n const [r, g, b, a] = color(at('circle-stroke-color', '#000', middle)) ?? [0, 0, 0, 1];\n\n out.splice(STYLE.color, 8, ...paintAt(middle), r, g, b, a * Number(at('circle-stroke-opacity', 1, middle)));\n }\n zooms.forEach((zoom, k) => {\n out[STYLE.size + k] = zoom;\n // A fill's outline: one pixel wide, as MapLibre draws it\n if (outline) {\n out[STYLE.size + 4 + k] = 1;\n\n return;\n }\n // A circle: its radius and stroke width\n if (layer.type === 'circle') {\n out[STYLE.size + 4 + k] = Math.max(0, Number(at('circle-radius', 5, zoom)) || 0);\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Math.max(0, Number(at('circle-stroke-width', 0, zoom)) || 0);\n\n return;\n }\n // A building: its height and base height (metres) at the same zooms\n if (layer.type === 'fill-extrusion') {\n out[STYLE.size + 4 + k] = Math.max(0, Number(at('fill-extrusion-height', 0, zoom)) || 0);\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Math.max(0, Number(at('fill-extrusion-base', 0, zoom)) || 0);\n\n return;\n }\n if (layer.type !== 'line') return;\n\n // Its blur in the middle of the tile's zooms (CSS pixels)\n if (k === 0) out[STYLE.blur] = Math.max(0, Number(at('line-blur', 0, (zooms[0] + colorEnd) / 2)) || 0);\n\n const width = Number(at('line-width', 1, zoom));\n const gap = Number(at('line-gap-width', 0, zoom));\n\n out[STYLE.size + 4 + k] = Math.max(0, gap > 0 ? gap + 2 * width : width);\n // Its offset to the right of the line (CSS pixels), the second size\n out[STYLE.size2 + k] = zoom;\n out[STYLE.size2 + 4 + k] = Number(at('line-offset', 0, zoom)) || 0;\n });\n styles.push(...out);\n properties.push(props);\n sublayer.push(s);\n\n return properties.length - 1;\n };\n\n /** A styled feature's building marked a landmark (1: drawn as a monument, no office windows, floodlit at night) */\n const landmark = (f: number) => {\n styles[f * FLOATS + STYLE.landmark] = 1;\n };\n\n return { add, landmark, styles, patterns, properties, sublayer };\n};\n\n/** The fills, lines and circles of the tile (`x`, `y` of `n` across) cut for the engine, sublayer after sublayer */\nconst geometrySink = (x: number, y: number, n: number) => {\n const fills: Record<\n 'points' | 'ringStart' | 'polygonStart' | 'feature' | 'roofs' | 'roofHeights' | 'roofOutlines' | 'roofOutlineStart',\n number[]\n > = {\n points: [],\n ringStart: [],\n polygonStart: [],\n feature: [],\n // Per polygon, its block's roof (`roofOf`; flat for a fill), and the whole outline of a building the tile cuts\n // (its roof built over it: its ridges go on in the next tile)\n roofs: [],\n roofHeights: [],\n roofOutlines: [],\n roofOutlineStart: [],\n };\n const lines: Record<'points' | 'start' | 'feature', number[]> = { points: [], start: [], feature: [] };\n /** The points of the circle sublayers (Mercator), each with its styled feature */\n const circles: Record<'points' | 'feature', number[]> = { points: [], feature: [] };\n /** The first polygon, line and circle of each sublayer */\n const starts: Record<'fill' | 'line' | 'circle', number[]> = { fill: [], line: [], circle: [] };\n\n /** A point of the tile in Mercator */\n const mercator = (px: number, py: number, extent: number): [number, number] => [\n (x + px / extent) / n,\n (y + py / extent) / n,\n ];\n\n /** A polygon of styled feature `f` starts, with its roof */\n const polygon = (f: number, roof: number, roofHeight: number) => {\n fills.polygonStart.push(fills.ringStart.length);\n fills.feature.push(f);\n fills.roofs.push(roof);\n fills.roofHeights.push(roofHeight);\n fills.roofOutlineStart.push(fills.roofOutlines.length / 2);\n };\n\n /** Where each sublayer's polygons, lines and circles end so far (the next one's start) */\n const mark = () => {\n starts.fill.push(fills.polygonStart.length);\n starts.line.push(lines.start.length);\n starts.circle.push(circles.feature.length);\n };\n\n return {\n /** The next sublayer starts */\n sublayer: mark,\n /** A background: the whole tile filled */\n background: (f: number) => {\n polygon(f, 0, Number.NaN);\n fills.ringStart.push(fills.points.length / 2);\n fills.points.push(x / n, y / n, (x + 1) / n, y / n, (x + 1) / n, (y + 1) / n, x / n, (y + 1) / n);\n },\n /** Each point inside the tile (one on its edge is the next tile's too: drawn once) */\n circles: (geometry: readonly ArrayLike<number>[], f: number, extent: number) => {\n geometry.forEach((part) => {\n for (let i = 0; i + 1 < part.length; i += 2) {\n const [px = 0, py = 0] = [part[i], part[i + 1]];\n\n if (px < 0 || py < 0 || px >= extent || py >= extent) continue;\n circles.points.push(...mercator(px, py, extent));\n circles.feature.push(f);\n }\n });\n },\n /** The parts of a feature as lines of `f` cut to the tile (`closed`: a polygon's rings, each closed: its outline) */\n lines: (geometry: readonly ArrayLike<number>[], closed: boolean, f: number, extent: number) => {\n geometry.forEach((part) => {\n const line = closed && part.length >= 2 ? [...Array.from(part), part[0] ?? 0, part[1] ?? 0] : part;\n\n clipLine(line, extent).forEach((clipped) => {\n const run = simplifyLine(clipped, extent * SIMPLIFY_EXTENT_SHARE);\n\n lines.start.push(lines.points.length / 2);\n lines.feature.push(f);\n for (let i = 0; i + 1 < run.length; i += 2)\n lines.points.push(...mercator(run[i] ?? 0, run[i + 1] ?? 0, extent));\n });\n });\n },\n /** A feature's polygons cut to the tile, with their roof (a building's: the whole outline of one the tile cuts) */\n polygons: (\n geometry: readonly ArrayLike<number>[],\n f: number,\n [roof, roofHeight]: [number, number],\n extent: number,\n ) => {\n let outline = false;\n\n geometry.forEach((ring) => {\n // Twice the signed area: positive for a ring turning clockwise on screen, an outline (as `polygons`)\n let area = 0;\n\n for (let i = 0; i + 1 < ring.length; i += 2) {\n const j = (i + 2) % ring.length;\n\n area += (ring[i] ?? 0) * (ring[j + 1] ?? 0) - (ring[j] ?? 0) * (ring[i + 1] ?? 0);\n }\n if (area === 0) return;\n // A hole of an outline cut away: dropped\n if (area < 0 && !outline) return;\n\n const clipped = clipRing(ring, extent);\n\n if (area > 0) outline = clipped.length >= 6;\n if (clipped.length < 6) return;\n if (area > 0) {\n polygon(f, roof, roofHeight);\n // A building with a sloped roof the tile cuts: its whole outline (a flat one's as the tile cuts it)\n if (roof > 1 && Array.from(ring).some((v) => v < 0 || v > extent)) {\n for (let i = 0; i + 1 < ring.length; i += 2)\n fills.roofOutlines.push(...mercator(ring[i] ?? 0, ring[i + 1] ?? 0, extent));\n }\n }\n fills.ringStart.push(fills.points.length / 2);\n for (let i = 0; i + 1 < clipped.length; i += 2)\n fills.points.push(...mercator(clipped[i] ?? 0, clipped[i + 1] ?? 0, extent));\n });\n },\n /** The geometry once every sublayer is in, as `TileVectors` takes it (the ends of the last ones closed) */\n done: (): Pick<TileVectors, 'fills' | 'lines' | 'circles' | 'tile'> => {\n mark();\n fills.ringStart.push(fills.points.length / 2);\n fills.polygonStart.push(fills.ringStart.length - 1);\n fills.roofOutlineStart.push(fills.roofOutlines.length / 2);\n lines.start.push(lines.points.length / 2);\n\n return {\n fills: {\n points: Float64Array.from(fills.points),\n ringStart: Uint32Array.from(fills.ringStart),\n polygonStart: Uint32Array.from(fills.polygonStart),\n feature: Uint32Array.from(fills.feature),\n fillStart: Uint32Array.from(starts.fill),\n roofs: Uint8Array.from(fills.roofs),\n roofHeights: Float32Array.from(fills.roofHeights),\n roofOutlines: Float64Array.from(fills.roofOutlines),\n roofOutlineStart: Uint32Array.from(fills.roofOutlineStart),\n // Metres per Mercator unit at the tile's middle (its latitude's)\n roofMetres: metresAt((y + 0.5) / n),\n },\n lines: {\n points: Float64Array.from(lines.points),\n start: Uint32Array.from(lines.start),\n feature: Uint32Array.from(lines.feature),\n lineStart: Uint32Array.from(starts.line),\n },\n circles: {\n points: Float64Array.from(circles.points),\n feature: Uint32Array.from(circles.feature),\n circleStart: Uint32Array.from(starts.circle),\n },\n tile: Float64Array.of(x / n, y / n, (x + 1) / n, (y + 1) / n),\n };\n },\n };\n};\n\n/**\n * Goes through a tile's features in the renderer's layers as `vectors()` draws them: each one styled, and cut to the\n * tile into `geometry` when given. A tile past the source's deepest level is cut from its tile there (overzoom);\n * undefined if the request was aborted\n */\nconst cut = async (\n r: Renderer,\n work: WorkOf<'vectors'>,\n geometry?: ReturnType<typeof geometrySink>,\n): Promise<ReturnType<typeof styleSink> | undefined> => {\n const { z, x, y, id, priority, deepest = r.maxzoom, roofs: roofMode = 'data', covered = [] } = work;\n // Past the source's deepest level: cut from its tile there\n const d = Math.max(0, z - r.maxzoom);\n const [vz, vx, vy] = [z - d, Math.floor(x / 2 ** d), Math.floor(y / 2 ** d)];\n const [ox, oy] = [x - vx * 2 ** d, y - vy * 2 ** d];\n const layers = await tile(tileUrl(r.tiles, vz, vx, vy), priority);\n\n if (aborted.has(id)) return undefined;\n\n const landmarks = landmarksOf(layers);\n /** The landmarks' buildings by source layer, found once for the style layers drawing it */\n const landmarkSets = new Map<readonly TileFeature[], Set<TileFeature>>();\n const landmarksIn = (features: readonly TileFeature[]) => {\n const found =\n landmarkSets.get(features) ?? (landmarks.length > 0 ? landmarkBuildings(features, landmarks) : new Set());\n\n landmarkSets.set(features, found);\n\n return found;\n };\n /** Whether a raised building stands where 3D buildings take its place: its first point in a box of `covered` */\n const replaced = (feature: TileFeature, extent: number) => {\n if (covered.length === 0) return false;\n\n const first = feature.geometry[0];\n const [px, py] = [first?.[0] ?? 0, first?.[1] ?? 0];\n const [lon, lat] = lonLat(vz, vx, vy, extent, px, py);\n\n for (let i = 0; i + 3 < covered.length; i += 4) {\n if (lon >= (covered[i] ?? 0) && lat >= (covered[i + 1] ?? 0) && lon <= (covered[i + 2] ?? 0)) {\n if (lat <= (covered[i + 3] ?? 0)) return true;\n }\n }\n\n return false;\n };\n const styled = styleSink(styleZooms(z, Math.max(deepest, r.maxzoom)));\n // The last whole zoom the tile is drawn at: its own, or every one past the deepest level, where it is stretched\n const last = z >= Math.max(deepest, r.maxzoom) ? LAST_ZOOM : z;\n\n r.layers.forEach((layer, s) => {\n geometry?.sublayer();\n\n const kind = vectorKind(layer);\n // A fill's outline, drawn over it as lines of its sublayer (the rings as they come, past the tile's edge cut away:\n // no line along the edge)\n const outlined =\n layer.type === 'fill' &&\n layer.paint?.['fill-outline-color'] !== undefined &&\n layer.paint?.['fill-antialias'] !== false;\n\n if (!kind) return;\n if (layer.type === 'background') {\n // Styled even without geometry: the restyled styles number the same features\n const f = styled.add(s, layer, { zoom: z, properties: {}, type: 'Unknown' }, {}, [0, 0]);\n\n geometry?.background(f);\n\n return;\n }\n\n const data = layers?.get(layer['source-layer'] ?? '');\n\n data?.features.forEach((feature) => {\n if (!DRAWS[kind](feature.type)) return;\n\n if (kind === 'extrusion' && replaced(feature, data.extent)) return;\n\n const ctx = context(feature, z);\n const shown = filterZooms(layer, feature, z, last);\n\n if (!shown) return;\n\n // In the units of the tile asked for (the same as the source's but past its deepest level)\n const parts = d > 0 ? overzoomed(feature.geometry, data.extent, d, ox, oy) : feature.geometry;\n\n if (!parts) return;\n\n const f = styled.add(s, layer, ctx, feature.properties, shown);\n const o = outlined ? styled.add(s, layer, ctx, feature.properties, shown, true) : -1;\n\n // A landmark's building or one of its parts (in the source tile's units, as the points)\n if (kind === 'extrusion' && landmarksIn(data.features).has(feature)) styled.landmark(f);\n if (!geometry) return;\n if (kind === 'circle') {\n geometry.circles(parts, f, data.extent);\n\n return;\n }\n if (kind === 'line') {\n // A polygon's rings, closed: its outline\n geometry.lines(parts, feature.type === 3, f, data.extent);\n\n return;\n }\n if (o >= 0) geometry.lines(parts, true, o, data.extent);\n\n const roof: [number, number] = kind === 'extrusion' ? roofOf(feature.properties, roofMode) : [0, Number.NaN];\n\n geometry.polygons(parts, f, roof, data.extent);\n });\n });\n\n return styled;\n};\n\n/** The styles alone of a tile's features in the renderer's layers, as `tileVectors` gives them (its paint changed:\n * the same features, in the same order) */\nexport const tileStyles = async (r: Renderer, work: WorkOf<'vectors'>): Promise<TileStyles | undefined> => {\n const styled = await cut(r, work);\n\n return styled && { styles: Float32Array.from(styled.styles), patterns: styled.patterns };\n};\n\n/**\n * The fills, lines, circles and buildings of a tile's features in the renderer's layers, cut to the tile, in Mercator\n * [0, 1], each with its style (color, its opacity folded in; a line's width, its gap folded in as the casing drawn by\n * `draw`; at four zooms over the range the tile is drawn at)\n */\nexport const tileVectors = async (r: Renderer, work: WorkOf<'vectors'>): Promise<TileVectors | undefined> => {\n const geometry = geometrySink(work.x, work.y, 2 ** work.z);\n const styled = await cut(r, work, geometry);\n\n if (!styled) return undefined;\n\n return {\n ...geometry.done(),\n styles: Float32Array.from(styled.styles),\n patterns: styled.patterns,\n properties: styled.properties,\n sublayer: Uint16Array.from(styled.sublayer),\n } satisfies TileVectors;\n};\n\n/** The tessellation module: where it is, and once loaded whether it works (false: the main thread does its work) */\nexport const tess: { url?: string; ready?: Promise<boolean> } = {};\n\n/** The tessellation module loaded, once; false without one or if it failed */\nexport const tessellator = (): Promise<boolean> => {\n if (!tess.url) return Promise.resolve(false);\n\n const ready =\n tess.ready ??\n initTess({ module_or_path: tess.url }).then(\n () => true,\n (error: unknown) => {\n console.warn('isard: the tessellation module failed to load, the main thread does its work', error);\n\n return false;\n },\n );\n\n tess.ready = ready;\n\n return ready;\n};\n\n/** A cut tile made ready for the GPU by the tessellation module (`raised`: per sublayer, whether its polygons are\n * extruded into blocks); undefined if it fails (it is then left aside) */\nexport const tessellate = (out: TileVectors, raised: Uint8Array, prism: boolean): TileMesh | undefined => {\n const { fills, lines } = out;\n\n try {\n const t = tessellateVectorTile(\n fills.points,\n fills.ringStart,\n fills.polygonStart,\n fills.feature,\n fills.fillStart,\n lines.points,\n lines.start,\n lines.feature,\n lines.lineStart,\n raised,\n fills.roofs ?? new Uint8Array(),\n fills.roofHeights ?? new Float32Array(),\n fills.roofOutlines ?? new Float64Array(),\n fills.roofOutlineStart ?? new Uint32Array(),\n fills.roofMetres ?? 0,\n prism,\n out.tile ?? new Float64Array(),\n );\n const mesh: TileMesh = {\n vertices: t.vertices(),\n indices: t.indices(),\n fillRanges: t.fillRanges(),\n prism: t.prism(),\n pieces: t.pieces(),\n lineTable: t.lineTable(),\n lineRanges: t.lineRanges(),\n blocks: t.blocks(),\n blockIndices: t.blockIndices(),\n blockRanges: t.blockRanges(),\n bounds: t.bounds(),\n };\n\n t.free();\n\n return mesh;\n } catch (error) {\n // A trap leaves the module unusable: the next tiles without it\n console.warn('isard: the tessellation module failed, the main thread does its work', error);\n tess.ready = Promise.resolve(false);\n\n return undefined;\n }\n};\n",
|
|
29
29
|
"/** The street lamps of a tile: points along its streets, on one side then the other, the same each time the tile is cut */\n\nimport { context, filter } from '../../basemap/vectorstyle.ts';\nimport { tileMetres, tileUrl } from '../../util/geo.ts';\nimport { besideLine, lineAnchors } from './labels.ts';\nimport type { WorkOf } from './protocol.ts';\nimport { aborted, lonLat, type Renderer, tile } from './tiles.ts';\nimport { thinned, treeHash } from './trees.ts';\n\n/** Metres from a street's middle to its lamps, by OpenMapTiles' class of road (none along the others: motorways,\n * paths, railways) */\nconst SIDE_METRES: Readonly<Record<string, number>> = {\n primary: 8,\n secondary: 7,\n tertiary: 6,\n minor: 5,\n service: 4,\n};\n\n/**\n * Lamps along the lines of the renderer's layers in a tile, `spacing` metres apart along each street, every other\n * one on its other side, as far from its middle as its class says (`SIDE_METRES`): longitude, latitude, scale, heading\n * (degrees, facing the street) and rank (in [0, 1): the page keeps the lowest far from the view) of each, as things\n * placed (`PLACED_NUMBERS`, the kind 0); past `maxLamps`, thinned evenly. A street in several layers has its lamps once\n */\nexport const lamps = async (r: Renderer, work: WorkOf<'lamps'>) => {\n const { z, x, y, id, spacing, maxLamps, priority } = work;\n\n const url = tileUrl(r.tiles, z, x, y);\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return undefined;\n\n // Metres across the tile at its middle: the distances in tile units\n const across = tileMetres(z, y);\n const seen = new Set<object>();\n const found: number[] = [];\n\n r.layers.forEach((layer) => {\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n\n const units = data.extent / across;\n\n data.features.forEach((f) => {\n const side = SIDE_METRES[String(f.properties.class)];\n\n if (f.type !== 2 || side === undefined || seen.has(f) || !filter(layer.filter, context(f, z))) return;\n seen.add(f);\n f.geometry.forEach((line) => {\n lineAnchors(line, spacing * units).forEach((anchor, k) => {\n // On one side of the street, then on the other, facing it\n const [lx, ly, heading] = besideLine(anchor, k, side * units);\n\n if (lx < 0 || ly < 0 || lx >= data.extent || ly >= data.extent) return;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, lx, ly);\n const rank = treeHash(Math.floor(lx), Math.floor(ly), Math.floor(anchor[6] ?? 0), 29);\n\n found.push(lon, lat, 1, heading, rank, 0);\n });\n });\n });\n });\n\n return thinned(found, maxLamps);\n};\n",
|
|
30
30
|
"/** A vector tile drawn into an image with its style (Canvas 2D), for the raster pool */\n\nimport type { TileFeature, TileLayer } from '../../basemap/mvt.ts';\nimport { type Context, color, context, filter, isFeatureDependent } from '../../basemap/vectorstyle.ts';\nimport { tileUrl } from '../../util/geo.ts';\nimport { clamp } from '../../util/math.ts';\nimport type { Priority, WorkOf } from './protocol.ts';\nimport { aborted, image, paint, type Renderer, shown, source, spriteIcon, tile, value } from './tiles.ts';\n\nconst LINE_CAPS: ReadonlySet<unknown> = new Set<CanvasLineCap>(['butt', 'round', 'square']);\nconst LINE_JOINS: ReadonlySet<unknown> = new Set<CanvasLineJoin>(['bevel', 'miter', 'round']);\n\nconst isLineCap = (value: unknown): value is CanvasLineCap => LINE_CAPS.has(value);\nconst isLineJoin = (value: unknown): value is CanvasLineJoin => LINE_JOINS.has(value);\n\n/** A style's `line-cap` for the canvas: `butt` if it is none */\nconst lineCap = (value: unknown): CanvasLineCap => (isLineCap(value) ? value : 'butt');\n\n/** A style's `line-join` for the canvas: `miter` if it is none */\nconst lineJoin = (value: unknown): CanvasLineJoin => (isLineJoin(value) ? value : 'miter');\n\n/** The image of a fill pattern, cut from the sprite on first use */\nconst patternImage = (r: Renderer, name: string): OffscreenCanvas | undefined => {\n if (r.patterns.has(name)) return r.patterns.get(name);\n\n const cut = (): OffscreenCanvas | undefined => {\n const found = spriteIcon(r, name);\n\n if (!found || !(found.icon.width > 0) || !(found.icon.height > 0)) return undefined;\n\n const { icon } = found;\n const canvas = new OffscreenCanvas(icon.width, icon.height);\n\n canvas\n .getContext('2d')\n ?.drawImage(found.image, icon.x, icon.y, icon.width, icon.height, 0, 0, icon.width, icon.height);\n\n return canvas;\n };\n const image = cut();\n\n r.patterns.set(name, image);\n\n return image;\n};\n\n/** Canvases free for the next tiles, by size: one per tile being drawn at most */\nconst canvases = new Map<number, OffscreenCanvas[]>();\n\n/** A blank canvas of `size` pixels and its context, from the free ones if any */\nconst takeCanvas = (size: number): { canvas: OffscreenCanvas; g: OffscreenCanvasRenderingContext2D } => {\n const canvas = canvases.get(size)?.pop() ?? new OffscreenCanvas(size, size);\n // A canvas on the CPU: its pixels are read back here, in the worker, not on the main thread at the upload\n const g = canvas.getContext('2d', { willReadFrequently: true });\n\n if (!g) throw new Error('isard: no 2D context');\n // The state a former tile left\n g.setTransform(1, 0, 0, 1, 0, 0);\n g.globalAlpha = 1;\n g.setLineDash([]);\n g.clearRect(0, 0, size, size);\n\n return { canvas, g };\n};\n\nconst giveCanvas = (canvas: OffscreenCanvas): void => {\n const free = canvases.get(canvas.width) ?? [];\n\n canvases.set(canvas.width, free);\n if (free.length < 4) free.push(canvas);\n};\n\n/**\n * The image of a drawn canvas, its alpha straight (the engine blends straight alpha). An opaque tile (a background\n * of full opacity, as a basemap's) is moved out of the canvas as it is, premultiplied and straight being the same\n * there; another one is read back unpremultiplied, copied\n */\nexport const tileImage = (\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n opaque: boolean,\n): Promise<ImageBitmap> => {\n if (opaque) return Promise.resolve(canvas.transferToImageBitmap());\n\n return createImageBitmap(g.getImageData(0, 0, canvas.width, canvas.height), { premultiplyAlpha: 'none' });\n};\n\nexport const render = async (r: Renderer, work: WorkOf<'render'>) => {\n const { z, x, y, size, id, priority } = work;\n\n const s = source(r, z, x, y);\n const layers = await tile(s.url, priority);\n\n if (aborted.has(id)) return undefined;\n\n const { canvas, g } = takeCanvas(size);\n\n try {\n return await draw(r, s, layers, canvas, g, z, x, y, size, id, priority);\n } finally {\n giveCanvas(canvas);\n }\n};\n\nconst draw = async (\n r: Renderer,\n s: ReturnType<typeof source>,\n layers: Map<string, TileLayer> | undefined,\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n z: number,\n x: number,\n y: number,\n size: number,\n id: number,\n priority?: Priority,\n) => {\n const zoom = Math.max(0, z - 1);\n // CSS pixels to canvas pixels: the tile is 256 CSS pixels across at its zoom\n const px = size / 256;\n let drawn = false;\n /** A background of full opacity covers the tile: every pixel stays opaque */\n let opaque = false;\n\n for (const layer of r.layers) {\n if (!shown(layer, zoom)) continue;\n\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n\n if (layer.type === 'background') {\n const fill = value(layer, 'paint', 'background-color', zctx, '#000');\n const opacity = Number(value(layer, 'paint', 'background-opacity', zctx, 1));\n\n g.fillStyle = paint(fill, opacity);\n g.fillRect(0, 0, size, size);\n if ((color(fill) ?? [0, 0, 0, 1])[3] * opacity >= 1) opaque = true;\n drawn = true;\n continue;\n }\n if (layer.type === 'raster') {\n const source = layer.source === undefined ? undefined : r.rasters[layer.source];\n\n if (!source) continue;\n\n // The canvas covers the Web Mercator tile (z, x, y): a source tile of 512 px covers it from a level coarser\n const rz = clamp(z - (source.tileSize >= 512 ? 1 : 0), 0, source.maxzoom);\n const n = 2 ** (z - rz);\n const url = tileUrl(source.tiles, rz, Math.floor(x / n), Math.floor(y / n));\n // None there (404, 204): drawn without it; any other failure fails the tile, which the engine asks for again\n // rather than keeping it without this layer\n const picture = await image(url, priority);\n\n if (aborted.has(id)) return undefined;\n if (!picture) continue;\n\n const [w, h] = [picture.width / n, picture.height / n];\n\n g.globalAlpha = Number(value(layer, 'paint', 'raster-opacity', zctx, 1));\n g.drawImage(picture, (x % n) * w, (y % n) * h, w, h, 0, 0, size, size);\n g.globalAlpha = 1;\n drawn = true;\n continue;\n }\n\n const data = layers?.get(layer['source-layer'] ?? '');\n\n if (!data) continue;\n\n // Tile units to canvas pixels\n const k = size / (data.extent * s.part);\n const [ox, oy] = [s.ox * data.extent, s.oy * data.extent];\n const path = (f: TileFeature, close: boolean) => {\n g.beginPath();\n for (const line of f.geometry) {\n for (let i = 0; i + 1 < line.length; i += 2) {\n const [lx, ly] = [((line[i] ?? 0) - ox) * k, ((line[i + 1] ?? 0) - oy) * k];\n\n if (i === 0) g.moveTo(lx, ly);\n else g.lineTo(lx, ly);\n }\n if (close) g.closePath();\n }\n };\n // Values that only depend on the zoom are evaluated once for the layer\n const dependent = new Map<string, boolean>();\n const get = (group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n const known = dependent.get(key);\n const d = known ?? isFeatureDependent(layer[group]?.[key]);\n\n if (known === undefined) dependent.set(key, d);\n\n return value(layer, group, key, d ? ctx : zctx, fallback);\n };\n\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (!filter(layer.filter, ctx)) continue;\n if (layer.type === 'fill-extrusion' && f.type === 3) {\n // Flat, seen from above: its color\n path(f, true);\n g.fillStyle = paint(\n get('paint', 'fill-extrusion-color', ctx, '#000'),\n Number(get('paint', 'fill-extrusion-opacity', ctx, 1)),\n );\n g.fill('evenodd');\n drawn = true;\n } else if (layer.type === 'fill' && f.type === 3) {\n const opacity = Number(get('paint', 'fill-opacity', ctx, 1));\n const pattern = get('paint', 'fill-pattern', ctx, undefined);\n\n path(f, true);\n\n const icon = typeof pattern === 'string' ? spriteIcon(r, pattern)?.icon : undefined;\n const image = icon && typeof pattern === 'string' && patternImage(r, pattern);\n\n if (icon && image) {\n const p = g.createPattern(image, 'repeat');\n\n if (p) {\n p.setTransform(new DOMMatrix().scale(px / (icon.pixelRatio ?? 1)));\n g.globalAlpha = opacity;\n g.fillStyle = p;\n g.fill('evenodd');\n g.globalAlpha = 1;\n }\n } else {\n g.fillStyle = paint(get('paint', 'fill-color', ctx, '#000'), opacity);\n g.fill('evenodd');\n\n const outline = get('paint', 'fill-outline-color', ctx, undefined);\n\n if (outline !== undefined) {\n g.strokeStyle = paint(outline, opacity);\n g.lineWidth = px;\n g.setLineDash([]);\n g.stroke();\n }\n }\n drawn = true;\n } else if (layer.type === 'line' && f.type !== 1) {\n const width = Number(get('paint', 'line-width', ctx, 1));\n\n if (width <= 0) continue;\n\n // A gap: two lines on either side of it, drawn as one wide line (the casing of a road, its inside drawn over)\n const gap = Number(get('paint', 'line-gap-width', ctx, 0));\n\n g.strokeStyle = paint(get('paint', 'line-color', ctx, '#000'), Number(get('paint', 'line-opacity', ctx, 1)));\n g.lineWidth = (gap > 0 ? gap + 2 * width : width) * px;\n g.lineCap = lineCap(get('layout', 'line-cap', ctx, 'butt'));\n g.lineJoin = lineJoin(get('layout', 'line-join', ctx, 'miter'));\n\n const dash = get('paint', 'line-dasharray', ctx, undefined);\n\n g.setLineDash(Array.isArray(dash) ? dash.map((d) => Number(d) * width * px) : []);\n path(f, f.type === 3);\n g.stroke();\n drawn = true;\n } else if (layer.type === 'circle' && f.type === 1) {\n const radius = Number(get('paint', 'circle-radius', ctx, 5)) * px;\n\n g.fillStyle = paint(get('paint', 'circle-color', ctx, '#000'), Number(get('paint', 'circle-opacity', ctx, 1)));\n\n const stroke = Number(get('paint', 'circle-stroke-width', ctx, 0)) * px;\n\n g.strokeStyle = paint(\n get('paint', 'circle-stroke-color', ctx, '#000'),\n Number(get('paint', 'circle-stroke-opacity', ctx, 1)),\n );\n g.lineWidth = stroke;\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n g.beginPath();\n g.arc(((point[i] ?? 0) - ox) * k, ((point[i + 1] ?? 0) - oy) * k, radius, 0, 2 * Math.PI);\n g.fill();\n if (stroke > 0) g.stroke();\n }\n }\n drawn = true;\n }\n }\n }\n if (!drawn && !layers) return null;\n\n return tileImage(canvas, g, opaque);\n};\n",
|
|
31
31
|
"/** The wind of a city's streets: the buildings of the vector tiles around a square, laid on its grid of cells, and\n * the flow round them for a wind towards the east and one towards the north (the grid module) */\n\nimport { type StreetFlows, streetFlows } from '../../grid-module.ts';\nimport { polygons } from './geometry.ts';\nimport type { Priority } from './protocol.ts';\nimport { aborted, type Renderer } from './tiles.ts';\n\n/** What a street flow is asked with: its square (Mercator: west, north, east, south) and grid, the tiles of level `z`\n * over it (x, y pairs), the sweeps, the grid module's URL */\nexport interface StreetWork {\n module: string;\n z: number;\n tiles: number[];\n bounds: [x0: number, y0: number, x1: number, y1: number];\n width: number;\n height: number;\n iterations: number;\n priority?: Priority;\n}\n\n/** The streets' flows of a square: the buildings of its tiles in cells (those away from it left out), then solved */\nexport const streetFlowOf = async (r: Renderer, work: StreetWork & { id: number }): Promise<StreetFlows> => {\n const { z, tiles, bounds, width, height, iterations, module, priority, id } = work;\n const [x0, y0, x1, y1] = bounds;\n const points: number[] = [];\n const ringStart: number[] = [];\n const polygonStart: number[] = [];\n\n const n = 2 ** z;\n\n for (let t = 0; t + 1 < tiles.length; t += 2) {\n // A column past the antimeridian (the square across it): the tile of the world's other side, a turn away\n const column = tiles[t] ?? 0;\n const wrapped = ((column % n) + n) % n;\n const turn = (column - wrapped) / n;\n const tile = await polygons(r, { z, x: wrapped, y: tiles[t + 1] ?? 0, id, priority });\n\n // A square no longer wanted (the view went on): not solved, its worker free for the tiles\n if (aborted.has(id)) throw new Error('aborted');\n if (!tile) continue;\n\n const { points: merc, ringStart: rings, polygonStart: starts } = tile.arrays;\n\n for (let p = 0; p + 1 < starts.length; p++) {\n const [first, end] = [starts[p] ?? 0, starts[p + 1] ?? 0];\n const from = rings[first] ?? 0;\n const to = rings[end] ?? 0;\n // Its points' bounds in Mercator: away from the square, left out\n let [minX, minY, maxX, maxY] = [Infinity, Infinity, -Infinity, -Infinity];\n\n for (let k = from; k < to; k++) {\n const [mx, my] = [(merc[k * 2] ?? 0) + turn, merc[k * 2 + 1] ?? 0];\n\n minX = Math.min(minX, mx);\n minY = Math.min(minY, my);\n maxX = Math.max(maxX, mx);\n maxY = Math.max(maxY, my);\n }\n if (maxX < x0 || minX > x1 || maxY < y0 || minY > y1) continue;\n\n polygonStart.push(ringStart.length);\n for (let ring = first; ring < end; ring++) {\n ringStart.push(points.length / 2);\n for (let k = rings[ring] ?? 0; k < (rings[ring + 1] ?? 0); k++) {\n points.push(\n (((merc[k * 2] ?? 0) + turn - x0) / (x1 - x0)) * width,\n (((merc[k * 2 + 1] ?? 0) - y0) / (y1 - y0)) * height,\n );\n }\n }\n }\n }\n ringStart.push(points.length / 2);\n polygonStart.push(ringStart.length - 1);\n\n return streetFlows(\n {\n points: Float64Array.from(points),\n ringStart: Uint32Array.from(ringStart),\n polygonStart: Uint32Array.from(polygonStart),\n },\n width,\n height,\n iterations,\n module,\n );\n};\n",
|
|
32
32
|
"/**\n * Worker of the vector basemaps: fetches and decodes vector tiles (kept for the tiles that share them), draws their\n * fills, lines and circles with a MapLibre style into images (Canvas 2D, off the main thread) for the raster pool,\n * with the style's raster layers under them, and lists the label candidates of the style's symbol layers (their texts\n * and icons) for the page to shape and place. Extrusions are drawn flat, as fills. Or it cuts the fills, lines and\n * buildings of a tile into geometry for the engine to draw as such (`vectors`), with their style per feature (a\n * building's color, height and base height). It also decodes the\n * altitudes of PNG relief tiles and draws the rasters reprojected from other grids (planned by the page), for the\n * map's other layers.\n *\n * A raster tile of level z covers 256 CSS pixels at map zoom z - 1 (MapLibre's 512 px convention): it is drawn from\n * the vector tile of level z - 1 (or the deepest one the source has), with the style at that zoom.\n *\n * This module answers the page's messages (typed in `./basemap/protocol.ts`), each work run by its job (`jobs`); the\n * jobs are in `./basemap/`: the state they share (`tiles.ts`), the images (`raster.ts`), the labels (`labels.ts`), the\n * geometry (`geometry.ts`), the trees, lamps and furniture (`trees.ts`, `lamps.ts`, `furniture.ts`), the streets' wind\n * (`street.ts`).\n */\n\nimport { resampler } from '../basemap/resample.ts';\nimport { fetchHeights, type Surface } from '../basemap/terrain.ts';\nimport { vectorKind } from '../basemap/vectorstyle.ts';\nimport { decodeGrids } from '../grid-module.ts';\nimport { fetchOk } from '../util/fetch.ts';\nimport { setHeaderRules, withHeaders } from '../util/requests.ts';\nimport { furniture } from './basemap/furniture.ts';\nimport { polygons, tess, tessellate, tessellator, tileStyles, tileVectors } from './basemap/geometry.ts';\nimport { labels } from './basemap/labels.ts';\nimport { lamps } from './basemap/lamps.ts';\nimport type {\n BasemapReply,\n BasemapRequest,\n BasemapResponse,\n BasemapWork,\n TileVectors,\n WorkOf,\n} from './basemap/protocol.ts';\nimport { render } from './basemap/raster.ts';\nimport { streetFlowOf } from './basemap/street.ts';\nimport { aborted, active, cache, cacheShare, type Renderer, renderers } from './basemap/tiles.ts';\nimport { trees } from './basemap/trees.ts';\n\n/** The signals of the relief and reprojection requests in progress, aborted with them */\nconst controllers = new Map<number, AbortController>();\n\n/** Where this worker reads the colors of the relief tiles back */\nconst heightsSurface: Surface = {};\n\n/** The reprojected rasters' source images this worker keeps, shared by every source */\nconst reprojection = resampler();\n\n// The worker's scope: the tests compile this file with Bun's types, whose `postMessage` takes Bun's transferables\n// (not an `ImageBitmap`)\nconst post = (message: BasemapResponse, transfer: Transferable[] = []) =>\n (self as unknown as Worker).postMessage(message, transfer);\n\n/** An answer and the buffers it hands over; undefined: nothing there (`missing`) */\ntype Answer = [reply: BasemapReply, transfer: Transferable[]] | undefined;\n\n/** The works of a renderer's tiles (the others decode a file or a tile of another layer: `decodeTile`) */\ntype TileWork = Exclude<BasemapWork, { type: 'heights' | 'reproject' | 'grids' }>['type'];\n\n/** The buffers of a tile's geometry, and of its mesh (handed over, not copied) */\nconst vectorBuffers = ({ fills, lines, circles, styles, sublayer, mesh }: TileVectors): Transferable[] =>\n [\n fills.points,\n fills.ringStart,\n fills.polygonStart,\n fills.feature,\n fills.fillStart,\n fills.roofs,\n fills.roofHeights,\n fills.roofOutlines,\n fills.roofOutlineStart,\n lines.points,\n lines.start,\n lines.feature,\n lines.lineStart,\n circles?.points,\n circles?.feature,\n circles?.circleStart,\n styles,\n sublayer,\n mesh?.vertices,\n mesh?.indices,\n mesh?.fillRanges,\n mesh?.pieces,\n mesh?.lineTable,\n mesh?.lineRanges,\n mesh?.blocks,\n mesh?.blockIndices,\n mesh?.blockRanges,\n mesh?.bounds,\n ].flatMap((a) => (a ? [a.buffer] : []));\n\n/** The job of each work on a renderer's tiles: its answer */\nconst jobs: { [T in TileWork]: (r: Renderer, work: WorkOf<T>) => Promise<Answer> } = {\n render: async (r, work) => {\n const image = await render(r, work);\n\n return image ? [{ image }, [image]] : undefined;\n },\n labels: async (r, work) => [{ labels: await labels(r, work) }, []],\n polygons: async (r, work) => {\n const tile = await polygons(r, work);\n\n if (!tile) return undefined;\n\n const { points, ringStart, polygonStart, feature } = tile.arrays;\n\n return [{ polygons: tile }, [points.buffer, ringStart.buffer, polygonStart.buffer, feature.buffer]];\n },\n trees: async (r, work) => {\n const found = await trees(r, work);\n\n return found && [{ trees: found }, [found.buffer]];\n },\n furniture: async (r, work) => {\n const found = await furniture(r, work);\n\n return found && [{ furniture: found }, [found.buffer]];\n },\n lamps: async (r, work) => {\n const found = await lamps(r, work);\n\n return found && [{ lamps: found }, [found.buffer]];\n },\n street: async (r, work) => {\n const street = await streetFlowOf(r, work);\n\n return [{ street }, [street.eastU, street.eastV, street.northU, street.northV].map((a) => a.buffer)];\n },\n vectors: async (r, work) => {\n // The paint changed: the styles alone, of the same features\n if (work.styles) {\n const styles = await tileStyles(r, work);\n\n return styles && [styles, [styles.styles.buffer]];\n }\n\n const cut = await tileVectors(r, work);\n\n if (!cut) return undefined;\n\n // Made ready for the GPU here when the tessellation module loads (else by the engine, on the main thread)\n const raised = Uint8Array.from(r.layers, (l) => (vectorKind(l) === 'extrusion' ? 1 : 0));\n const mesh = (await tessellator()) ? tessellate(cut, raised, work.prism === true) : undefined;\n const vectors = mesh ? { ...cut, mesh } : cut;\n\n return [{ vectors }, vectorBuffers(vectors)];\n },\n};\n\n/** Runs the job of a work of type `type` */\nconst run = <T extends TileWork>(r: Renderer, type: T, work: WorkOf<T>): Promise<Answer> => jobs[type](r, work);\n\nself.onmessage = async ({ data }: MessageEvent<BasemapRequest>) => {\n if (data.type === 'headers') {\n setHeaderRules(data.rules);\n\n return;\n }\n if (data.type === 'tess') {\n tess.url = data.url;\n\n return;\n }\n if (data.type === 'init') {\n if (data.workers !== undefined) cache.capacity = cacheShare(data.workers, data.cached);\n renderers.set(data.key, {\n tiles: data.tiles,\n maxzoom: data.maxzoom,\n layers: data.layers,\n rasters: data.rasters ?? {},\n sprites: data.sprites ?? [],\n patterns: new Map(),\n });\n\n return;\n }\n if (data.type === 'drop') {\n // Its copy of the sprites\n renderers.get(data.key)?.sprites.forEach((sprite) => {\n sprite.image.close();\n });\n renderers.delete(data.key);\n\n return;\n }\n if (data.type === 'abort') {\n // An abort that arrives after the answer is ignored\n if (active.has(data.id)) aborted.add(data.id);\n controllers.get(data.id)?.abort();\n\n return;\n }\n if (data.type === 'heights' || data.type === 'reproject' || data.type === 'grids') {\n await decodeTile(data);\n\n return;\n }\n active.add(data.id);\n\n try {\n const r = renderers.get(data.key);\n\n if (!r) throw new Error(`isard: no renderer ${data.key}`);\n\n const answer = await run(r, data.type, data);\n\n if (answer) post({ id: data.id, ...answer[0] }, answer[1]);\n else post({ id: data.id, missing: true });\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n active.delete(data.id);\n aborted.delete(data.id);\n }\n};\n\n/** A file's bytes, with the page's request headers */\nconst fetchBytes = async (url: string, signal: AbortSignal): Promise<ArrayBuffer> => {\n const response = await fetchOk(url, withHeaders(url, { signal }));\n\n return response.arrayBuffer();\n};\n\n/** A tile of another layer: the altitudes of a relief tile, or a reprojected raster tile; or a file's grids */\nconst decodeTile = async (data: Extract<BasemapWork, { type: 'heights' | 'reproject' | 'grids' }> & { id: number }) => {\n const controller = new AbortController();\n\n controllers.set(data.id, controller);\n try {\n if (data.type === 'grids') {\n const { module, url, bytes } = data;\n const file = bytes ?? (url ? await fetchBytes(url, controller.signal) : new ArrayBuffer(0));\n const { grids, values } = await decodeGrids(new Uint8Array(file), module);\n\n post(\n { id: data.id, grids, values },\n values.map((v) => v.buffer),\n );\n } else if (data.type === 'heights') {\n const heights = await fetchHeights(data.url, data.encoding, data.floor, controller.signal, heightsSurface);\n\n if (heights) post({ id: data.id, heights }, [heights.buffer]);\n else post({ id: data.id, missing: true });\n } else {\n reprojection.cache.capacity = data.cached;\n\n const image = await reprojection.draw(data.job, controller.signal);\n\n if (image) post({ id: data.id, image }, [image]);\n else post({ id: data.id, missing: true });\n }\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n controllers.delete(data.id);\n }\n};\n"
|
|
33
33
|
],
|
|
34
|
-
"mappings": "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",
|
|
35
|
-
"debugId": "
|
|
34
|
+
"mappings": "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",
|
|
35
|
+
"debugId": "7EF1C22F755AE97E64756E2164756E21",
|
|
36
36
|
"names": []
|
|
37
37
|
}
|