@maptiler/sdk 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +15 -5
- package/.github/pull_request_template.md +11 -0
- package/.github/workflows/format-lint.yml +24 -0
- package/CHANGELOG.md +94 -51
- package/colorramp.md +93 -0
- package/dist/maptiler-sdk.d.ts +1207 -123
- package/dist/maptiler-sdk.min.mjs +3 -1
- package/dist/maptiler-sdk.mjs +3561 -485
- package/dist/maptiler-sdk.mjs.map +1 -1
- package/dist/maptiler-sdk.umd.js +3825 -869
- package/dist/maptiler-sdk.umd.js.map +1 -1
- package/dist/maptiler-sdk.umd.min.js +51 -49
- package/package.json +27 -13
- package/readme.md +298 -0
- package/rollup.config.js +2 -16
- package/src/Map.ts +489 -357
- package/src/MaptilerGeolocateControl.ts +23 -20
- package/src/MaptilerLogoControl.ts +3 -3
- package/src/MaptilerNavigationControl.ts +9 -6
- package/src/MaptilerTerrainControl.ts +15 -14
- package/src/Minimap.ts +373 -0
- package/src/Point.ts +3 -5
- package/src/colorramp.ts +1216 -0
- package/src/config.ts +4 -3
- package/src/converters/index.ts +1 -0
- package/src/converters/xml.ts +681 -0
- package/src/defaults.ts +1 -1
- package/src/helpers/index.ts +27 -0
- package/src/helpers/stylehelper.ts +395 -0
- package/src/helpers/vectorlayerhelpers.ts +1511 -0
- package/src/index.ts +10 -0
- package/src/language.ts +116 -79
- package/src/mapstyle.ts +4 -2
- package/src/tools.ts +68 -16
- package/tsconfig.json +8 -5
- package/vite.config.ts +10 -0
- package/demos/maptiler-sdk.css +0 -147
- package/demos/maptiler-sdk.umd.js +0 -4041
- package/demos/mountain.html +0 -67
- package/demos/simple.html +0 -67
- package/demos/transform-request.html +0 -81
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maptiler-sdk.mjs","sources":["../src/language.ts","../src/config.ts","../src/defaults.ts","../src/LogoControl.ts","../src/MaptilerLogoControl.ts","../src/tools.ts","../src/mapstyle.ts","../src/MaptilerTerrainControl.ts","../src/NavigationControl.ts","../src/MaptilerNavigationControl.ts","../src/GeolocateControl.ts","../src/MaptilerGeolocateControl.ts","../src/AttributionControl.ts","../src/ScaleControl.ts","../src/FullscreenControl.ts","../src/Map.ts","../src/Marker.ts","../src/Popup.ts","../src/Style.ts","../src/CanvasSource.ts","../src/GeoJSONSource.ts","../src/ImageSource.ts","../src/RasterTileSource.ts","../src/RasterDEMTileSource.ts","../src/VectorTileSource.ts","../src/VideoSource.ts","../src/TerrainControl.ts","../src/Point.ts","../src/index.ts"],"sourcesContent":["/**\n * Languages. Note that not all the languages of this list are available but the compatibility list may be expanded in the future.\n */\nconst Language = {\n /**\n * AUTO mode uses the language of the browser\n */\n AUTO: \"auto\",\n\n /**\n * STYLE is a custom flag to keep the language of the map as defined into the style.\n * If STYLE is set in the constructor, then further modification of the language\n * with `.setLanguage()` is not possible.\n */\n STYLE_LOCK: \"style_lock\",\n\n /**\n * Default fallback languages that uses latin charaters\n */\n LATIN: \"latin\",\n\n /**\n * Default fallback languages that uses non-latin charaters\n */\n NON_LATIN: \"nonlatin\",\n\n /**\n * Labels are in their local language, when available\n */\n LOCAL: \"\",\n\n ALBANIAN: \"sq\",\n AMHARIC: \"am\",\n ARABIC: \"ar\",\n ARMENIAN: \"hy\",\n AZERBAIJANI: \"az\",\n BASQUE: \"eu\",\n BELORUSSIAN: \"be\",\n BOSNIAN: \"bs\",\n BRETON: \"br\",\n BULGARIAN: \"bg\",\n CATALAN: \"ca\",\n CHINESE: \"zh\",\n CORSICAN: \"co\",\n CROATIAN: \"hr\",\n CZECH: \"cs\",\n DANISH: \"da\",\n DUTCH: \"nl\",\n ENGLISH: \"en\",\n ESPERANTO: \"eo\",\n ESTONIAN: \"et\",\n FINNISH: \"fi\",\n FRENCH: \"fr\",\n FRISIAN: \"fy\",\n GEORGIAN: \"ka\",\n GERMAN: \"de\",\n GREEK: \"el\",\n HEBREW: \"he\",\n HINDI: \"hi\",\n HUNGARIAN: \"hu\",\n ICELANDIC: \"is\",\n INDONESIAN: \"id\",\n IRISH: \"ga\",\n ITALIAN: \"it\",\n JAPANESE: \"ja\",\n JAPANESE_HIRAGANA: \"ja-Hira\",\n JAPANESE_KANA: \"ja_kana\",\n JAPANESE_LATIN: \"ja_rm\",\n JAPANESE_2018: \"ja-Latn\",\n KANNADA: \"kn\",\n KAZAKH: \"kk\",\n KOREAN: \"ko\",\n KOREAN_LATIN: \"ko-Latn\",\n KURDISH: \"ku\",\n ROMAN_LATIN: \"la\",\n LATVIAN: \"lv\",\n LITHUANIAN: \"lt\",\n LUXEMBOURGISH: \"lb\",\n MACEDONIAN: \"mk\",\n MALAYALAM: \"ml\",\n MALTESE: \"mt\",\n NORWEGIAN: \"no\",\n OCCITAN: \"oc\",\n POLISH: \"pl\",\n PORTUGUESE: \"pt\",\n ROMANIAN: \"ro\",\n ROMANSH: \"rm\",\n RUSSIAN: \"ru\",\n SCOTTISH_GAELIC: \"gd\",\n SERBIAN_CYRILLIC: \"sr\",\n SERBIAN_LATIN: \"sr-Latn\",\n SLOVAK: \"sk\",\n SLOVENE: \"sl\",\n SPANISH: \"es\",\n SWEDISH: \"sv\",\n TAMIL: \"ta\",\n TELUGU: \"te\",\n THAI: \"th\",\n TURKISH: \"tr\",\n UKRAINIAN: \"uk\",\n WELSH: \"cy\",\n} as const;\n\nconst languagesIsoSet = new Set(Object.values(Language) as Array<string>);\n\nfunction isLanguageSupported(lang: string): boolean {\n return languagesIsoSet.has(lang);\n}\n\nconst languageCodeSet = new Set(Object.values(Language));\n\n/**\n * Type representing the key of the Language object\n */\ntype LanguageKey = keyof typeof Language;\n\ntype Values<T> = T[keyof T];\n\n/**\n * Built-in languages values as strings\n */\ntype LanguageString = Values<typeof Language>;\n\nfunction getBrowserLanguage(): LanguageString {\n if (typeof navigator === \"undefined\") {\n return Intl.DateTimeFormat()\n .resolvedOptions()\n .locale.split(\"-\")[0] as LanguageString;\n }\n\n const canditatelangs = Array.from(\n new Set(navigator.languages.map((l) => l.split(\"-\")[0]))\n ).filter((l) => languageCodeSet.has(l as LanguageString));\n\n return canditatelangs.length\n ? (canditatelangs[0] as LanguageString)\n : Language.LATIN;\n}\n\nexport {\n Language,\n LanguageString,\n LanguageKey,\n getBrowserLanguage,\n isLanguageSupported,\n};\n","import EventEmitter from \"events\";\nimport { Language, LanguageString } from \"./language\";\nimport { config as clientConfig, FetchFunction } from \"@maptiler/client\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Unit } from \"./unit\";\n\nexport const MAPTILER_SESSION_ID = uuidv4();\n\n/**\n * Configuration class for the SDK\n */\nclass SdkConfig extends EventEmitter {\n /**\n * The primary language. By default, the language of the web browser is used.\n */\n primaryLanguage: LanguageString | null = Language.AUTO;\n\n /**\n * The secondary language, to overwrite the default language defined in the map style.\n * This settings is highly dependant on the style compatibility and may not work in most cases.\n */\n secondaryLanguage: LanguageString | null = null;\n\n /**\n * Setting on whether of not the SDK runs with a session logic.\n * A \"session\" is started at the initialization of the SDK and finished when the browser\n * page is being refreshed.\n * When `session` is enabled (default: true), the extra URL param `mtsid` is added to queries\n * on the MapTiler Cloud API. This allows MapTiler to enable \"session based billing\".\n */\n session = true;\n\n /**\n * Unit to be used\n */\n private _unit: Unit = \"metric\";\n\n /**\n * MapTiler Cloud API key\n */\n private _apiKey = \"\";\n\n constructor() {\n super();\n }\n\n /**\n * Set the unit system\n */\n set unit(u: Unit) {\n this._unit = u;\n this.emit(\"unit\", u);\n }\n\n /**\n * Get the unit system\n */\n get unit(): Unit {\n return this._unit;\n }\n\n /**\n * Set the MapTiler Cloud API key\n */\n set apiKey(k: string) {\n this._apiKey = k;\n clientConfig.apiKey = k;\n this.emit(\"apiKey\", k);\n }\n\n /**\n * Get the MapTiler Cloud API key\n */\n get apiKey(): string {\n return this._apiKey;\n }\n\n /**\n * Set a the custom fetch function to replace the default one\n */\n set fetch(f: FetchFunction) {\n clientConfig.fetch = f;\n }\n\n /**\n * Get the fetch fucntion\n */\n get fetch(): FetchFunction | null {\n return clientConfig.fetch;\n }\n}\n\nconst config = new SdkConfig();\n\nexport { config, SdkConfig };\n","import { Language } from \"./language\";\n\n/**\n * Some default settings for the SDK\n */\nconst defaults = {\n maptilerLogoURL: \"https://api.maptiler.com/resources/logo.svg\",\n maptilerURL: \"https://www.maptiler.com/\",\n maptilerApiHost: \"api.maptiler.com\",\n rtlPluginURL:\n \"https://cdn.maptiler.com/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.min.js\",\n primaryLanguage: Language.AUTO,\n secondaryLanguage: Language.LOCAL,\n terrainSourceURL: \"https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json\",\n terrainSourceId: \"maptiler-terrain\",\n};\n\nObject.freeze(defaults);\n\nexport { defaults };\n","/**\n * This is an extension of MapLibre LogoControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class LogoControl extends maplibregl.LogoControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport type { LogoOptions as LogoOptionsML } from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { Map } from \"./Map\";\nimport { LogoControl } from \"./LogoControl\";\n\ntype LogoOptions = LogoOptionsML & {\n logoURL?: string;\n linkURL?: string;\n};\n\n/**\n * This LogoControl extends the MapLibre LogoControl but instead can use any image URL and\n * any link URL. By default this is using MapTiler logo and URL.\n */\nexport class MaptilerLogoControl extends LogoControl {\n private logoURL = \"\";\n private linkURL = \"\";\n\n constructor(options: LogoOptions = {}) {\n super(options);\n\n this.logoURL = options.logoURL ?? defaults.maptilerLogoURL;\n this.linkURL = options.linkURL ?? defaults.maptilerURL;\n }\n\n onAdd(map: Map): HTMLElement {\n this._map = map;\n this._compact = this.options && this.options.compact;\n this._container = window.document.createElement(\"div\");\n this._container.className = \"maplibregl-ctrl\";\n const anchor = window.document.createElement(\"a\");\n anchor.style.backgroundRepeat = \"no-repeat\";\n anchor.style.cursor = \"pointer\";\n anchor.style.display = \"block\";\n anchor.style.height = \"23px\";\n anchor.style.margin = \"0 0 -4px -4px\";\n anchor.style.overflow = \"hidden\";\n anchor.style.width = \"88px\";\n anchor.style.backgroundImage = `url(${this.logoURL})`;\n anchor.style.backgroundSize = \"100px 30px\";\n anchor.style.width = \"100px\";\n anchor.style.height = \"30px\";\n\n anchor.target = \"_blank\";\n anchor.rel = \"noopener\";\n anchor.href = this.linkURL;\n anchor.setAttribute(\"aria-label\", \"MapTiler logo\");\n anchor.setAttribute(\"rel\", \"noopener\");\n this._container.appendChild(anchor);\n this._container.style.display = \"block\";\n\n this._map.on(\"resize\", this._updateCompact);\n this._updateCompact();\n\n return this._container;\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport type {\n RequestParameters,\n ResourceType,\n RequestTransformFunction,\n} from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { config } from \"./config\";\nimport { MAPTILER_SESSION_ID } from \"./config\";\n\nexport function enableRTL() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (maplibregl.getRTLTextPluginStatus() === \"unavailable\") {\n maplibregl.setRTLTextPlugin(\n defaults.rtlPluginURL,\n null,\n true // Lazy load the plugin\n );\n }\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/util.ts#L223\nexport function bindAll(fns: Array<string>, context: any): void {\n fns.forEach((fn) => {\n if (!context[fn]) {\n return;\n }\n context[fn] = context[fn].bind(context);\n });\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L22\nexport function DOMcreate<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n container?: HTMLElement\n): HTMLElementTagNameMap[K] {\n const el = window.document.createElement(tagName);\n if (className !== undefined) el.className = className;\n if (container) container.appendChild(el);\n return el;\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L111\nexport function DOMremove(node: HTMLElement) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\n\n/**\n * This function is meant to be used as transformRequest by any Map instance created.\n * It adds the session ID as well as the MapTiler Cloud key from the config to all the requests\n * performed on MapTiler Cloud servers.\n * @param url\n * @param resourceType\n * @returns\n */\nexport function maptilerCloudTransformRequest(\n url: string,\n resourceType?: ResourceType\n): RequestParameters {\n let reqUrl = null;\n\n try {\n // The URL is expected to be absolute.\n // Yet, if it's local we just return it without assuming a 'base' url (in the URL constructor)\n // and we let the URL be locally resolved with a potential base path.\n reqUrl = new URL(url);\n } catch (e) {\n return {\n url,\n };\n }\n\n if (reqUrl.host === defaults.maptilerApiHost) {\n if (!reqUrl.searchParams.has(\"key\")) {\n reqUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n if (config.session) {\n reqUrl.searchParams.append(\"mtsid\", MAPTILER_SESSION_ID);\n }\n }\n\n return {\n url: reqUrl.href,\n };\n}\n\n/**\n * This combines a user-defined tranformRequest function (optionnal)\n * with the MapTiler Cloud-specific one: maptilerCloudTransformRequest\n * @param userDefinedRTF\n * @returns\n */\nexport function combineTransformRequest(\n userDefinedRTF: RequestTransformFunction = null\n): RequestTransformFunction {\n return function (\n url: string,\n resourceType?: ResourceType\n ): RequestParameters {\n if (userDefinedRTF) {\n const rp = userDefinedRTF(url, resourceType);\n const rp2 = maptilerCloudTransformRequest(rp.url);\n\n return {\n ...rp,\n ...rp2,\n };\n } else {\n return maptilerCloudTransformRequest(url);\n }\n };\n}\n","import {\n MapStyle,\n ReferenceMapStyle,\n MapStyleVariant,\n mapStylePresetList,\n expandMapStyle,\n} from \"@maptiler/client\";\n\nexport function styleToStyle(\n style:\n | string\n | ReferenceMapStyle\n | MapStyleVariant\n | maplibregl.StyleSpecification\n | null\n | undefined\n): string | maplibregl.StyleSpecification {\n if (!style) {\n return MapStyle[mapStylePresetList[0].referenceStyleID]\n .getDefaultVariant()\n .getExpandedStyleURL();\n }\n\n // If the provided style is a shorthand (eg. \"streets-v2\") or a full style URL\n if (typeof style === \"string\" || style instanceof String) {\n if (!style.startsWith(\"http\") && style.toLowerCase().includes(\".json\")) {\n // If a style does not start by http but still contains the extension \".json\"\n // we assume it's a relative path to a style json file\n return style as string;\n } else {\n return expandMapStyle(style);\n }\n }\n\n if (style instanceof MapStyleVariant) {\n return style.getExpandedStyleURL();\n }\n\n if (style instanceof ReferenceMapStyle) {\n return (style.getDefaultVariant() as MapStyleVariant).getExpandedStyleURL();\n }\n\n return style as maplibregl.StyleSpecification;\n}\n","import { bindAll, DOMcreate, DOMremove } from \"./tools\";\n\nimport { Map } from \"./Map\";\nimport maplibregl from \"maplibre-gl\";\n\n/**\n * A `MaptilerTerrainControl` control adds a button to turn terrain on and off\n * by triggering the terrain logic that is already deployed in the Map object.\n */\nexport class MaptilerTerrainControl implements maplibregl.IControl {\n _map: Map;\n _container: HTMLElement;\n _terrainButton: HTMLButtonElement;\n\n constructor() {\n bindAll([\"_toggleTerrain\", \"_updateTerrainIcon\"], this);\n }\n\n onAdd(map: Map) {\n this._map = map;\n this._container = DOMcreate(\"div\", \"maplibregl-ctrl maplibregl-ctrl-group\");\n this._terrainButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-terrain\",\n this._container\n );\n DOMcreate(\"span\", \"maplibregl-ctrl-icon\", this._terrainButton).setAttribute(\n \"aria-hidden\",\n \"true\"\n );\n this._terrainButton.type = \"button\";\n this._terrainButton.addEventListener(\"click\", this._toggleTerrain);\n\n this._updateTerrainIcon();\n this._map.on(\"terrain\", this._updateTerrainIcon);\n return this._container;\n }\n\n onRemove() {\n DOMremove(this._container);\n this._map.off(\"terrain\", this._updateTerrainIcon);\n this._map = undefined;\n }\n\n _toggleTerrain() {\n if (this._map.hasTerrain()) {\n this._map.disableTerrain();\n } else {\n this._map.enableTerrain();\n }\n\n this._updateTerrainIcon();\n }\n\n _updateTerrainIcon() {\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain\");\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain-enabled\");\n // if (this._map.terrain) {\n if (this._map.hasTerrain()) {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain-enabled\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.disableTerrain\"\n );\n } else {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.enableTerrain\"\n );\n }\n }\n}\n","/**\n * This is an extension of MapLibre NavigationControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class NavigationControl extends maplibregl.NavigationControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import { NavigationControl } from \"./NavigationControl\";\n\ntype HTMLButtonElementPlus = HTMLButtonElement & {\n clickFunction: (e?: any) => unknown;\n};\n\nexport class MaptilerNavigationControl extends NavigationControl {\n constructor() {\n super({\n showCompass: true,\n showZoom: true,\n visualizePitch: true,\n });\n\n // Removing the default click event\n this._compass.removeEventListener(\n \"click\",\n (this._compass as HTMLButtonElementPlus).clickFunction\n );\n\n // Adding custom click event\n this._compass.addEventListener(\"click\", (e) => {\n {\n const currentPitch = this._map.getPitch();\n if (currentPitch === 0) {\n this._map.easeTo({ pitch: Math.min(this._map.getMaxPitch(), 80) });\n } else {\n if (this.options.visualizePitch) {\n this._map.resetNorthPitch({}, { originalEvent: e });\n } else {\n this._map.resetNorth({}, { originalEvent: e });\n }\n }\n }\n });\n }\n\n /**\n * Overloading: the button now stores its click callback so that we can later on delete it and replace it\n */\n _createButton(\n className: string,\n fn: (e?: any) => unknown\n ): HTMLButtonElementPlus {\n const button = super._createButton(className, fn) as HTMLButtonElementPlus;\n button.clickFunction = fn;\n return button;\n }\n\n /**\n * Overloading: Limit how flat the compass icon can get\n */\n _rotateCompassArrow() {\n const rotate = this.options.visualizePitch\n ? `scale(${Math.min(\n 1.5,\n 1 /\n Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)\n )}) rotateX(${Math.min(70, this._map.transform.pitch)}deg) rotateZ(${\n this._map.transform.angle * (180 / Math.PI)\n }deg)`\n : `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;\n\n this._compassIcon.style.transform = rotate;\n }\n}\n","/**\n * This is an extension of MapLibre GeolocateControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeolocateControl extends maplibregl.GeolocateControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import type { LngLatLike } from \"maplibre-gl\";\nimport maplibregl from \"maplibre-gl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { DOMcreate } from \"./tools\";\n\nconst Marker = maplibregl.Marker;\nconst LngLat = maplibregl.LngLat;\nconst LngLatBounds = maplibregl.LngLatBounds;\n\n/**\n * The MaptilerGeolocateControl is an extension of the original GeolocateControl\n * with a few changes. In this version, the active mode persists as long as the\n * location is still centered. This means it's robust to rotation, pitch and zoom.\n *\n */\nexport class MaptilerGeolocateControl extends GeolocateControl {\n private lastUpdatedCenter = new LngLat(0, 0);\n\n /**\n * Update the camera location to center on the current position\n *\n * @param {Position} position the Geolocation API Position\n * @private\n */\n _updateCamera(position: GeolocationPosition) {\n const center = new LngLat(\n position.coords.longitude,\n position.coords.latitude\n );\n const radius = position.coords.accuracy;\n const bearing = this._map.getBearing();\n const options = {\n bearing,\n ...this.options.fitBoundsOptions,\n linear: true,\n };\n\n const currentMapZoom = this._map.getZoom();\n\n if (currentMapZoom > this.options.fitBoundsOptions.maxZoom) {\n options.zoom = currentMapZoom;\n }\n\n this._map.fitBounds(LngLatBounds.fromLngLat(center, radius), options, {\n geolocateSource: true, // tag this camera change so it won't cause the control to change to background state\n });\n\n let hasFittingBeenDisrupted = false;\n\n const flagFittingDisruption = () => {\n hasFittingBeenDisrupted = true;\n };\n\n this._map.once(\"click\", flagFittingDisruption);\n this._map.once(\"dblclick\", flagFittingDisruption);\n this._map.once(\"dragstart\", flagFittingDisruption);\n this._map.once(\"mousedown\", flagFittingDisruption);\n this._map.once(\"touchstart\", flagFittingDisruption);\n this._map.once(\"wheel\", flagFittingDisruption);\n\n this._map.once(\"moveend\", () => {\n // Removing the events if not used\n this._map.off(\"click\", flagFittingDisruption);\n this._map.off(\"dblclick\", flagFittingDisruption);\n this._map.off(\"dragstart\", flagFittingDisruption);\n this._map.off(\"mousedown\", flagFittingDisruption);\n this._map.off(\"touchstart\", flagFittingDisruption);\n this._map.off(\"wheel\", flagFittingDisruption);\n\n if (hasFittingBeenDisrupted) {\n return;\n }\n\n this.lastUpdatedCenter = this._map.getCenter();\n });\n }\n\n _setupUI(supported: boolean) {\n this.lastUpdatedCenter = this._map.getCenter();\n\n this._container.addEventListener(\"contextmenu\", (e: MouseEvent) =>\n e.preventDefault()\n );\n this._geolocateButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-geolocate\",\n this._container\n );\n DOMcreate(\n \"span\",\n \"maplibregl-ctrl-icon\",\n this._geolocateButton\n ).setAttribute(\"aria-hidden\", \"true\");\n this._geolocateButton.type = \"button\";\n\n if (supported === false) {\n // warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');\n const title = this._map._getUIString(\n \"GeolocateControl.LocationNotAvailable\"\n );\n this._geolocateButton.disabled = true;\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n } else {\n const title = this._map._getUIString(\"GeolocateControl.FindMyLocation\");\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n }\n\n if (this.options.trackUserLocation) {\n this._geolocateButton.setAttribute(\"aria-pressed\", \"false\");\n this._watchState = \"OFF\";\n }\n\n // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map\n if (this.options.showUserLocation) {\n this._dotElement = DOMcreate(\"div\", \"maplibregl-user-location-dot\");\n\n this._userLocationDotMarker = new Marker(this._dotElement);\n\n this._circleElement = DOMcreate(\n \"div\",\n \"maplibregl-user-location-accuracy-circle\"\n );\n this._accuracyCircleMarker = new Marker({\n element: this._circleElement,\n pitchAlignment: \"map\",\n });\n\n if (this.options.trackUserLocation) this._watchState = \"OFF\";\n\n this._map.on(\"move\", this._onZoom);\n }\n\n this._geolocateButton.addEventListener(\"click\", this.trigger.bind(this));\n\n this._setup = true;\n\n // when the camera is changed (and it's not as a result of the Geolocation Control) change\n // the watch mode to background watch, so that the marker is updated but not the camera.\n // Addition: Yet the status change does not occur if the ditance it has moved to is less than\n // one meter from the last auto-updated position. This is to guarrantee that if the move\n // is a zoom, rotation or pitch (where the center stays the same) then we can keep the ACTIVE_LOCK\n // mode ON.\n if (this.options.trackUserLocation) {\n this._map.on(\"moveend\", (event: any) => {\n const fromResize =\n event.originalEvent && event.originalEvent.type === \"resize\";\n const movingDistance = this.lastUpdatedCenter.distanceTo(\n this._map.getCenter()\n );\n\n if (\n !event.geolocateSource &&\n this._watchState === \"ACTIVE_LOCK\" &&\n !fromResize &&\n movingDistance > 1\n ) {\n this._watchState = \"BACKGROUND\";\n this._geolocateButton.classList.add(\n \"maplibregl-ctrl-geolocate-background\"\n );\n this._geolocateButton.classList.remove(\n \"maplibregl-ctrl-geolocate-active\"\n );\n\n this.fire(new Event(\"trackuserlocationend\"));\n }\n });\n }\n }\n\n _updateCircleRadius() {\n if (\n this._watchState !== \"BACKGROUND\" &&\n this._watchState !== \"ACTIVE_LOCK\"\n ) {\n return;\n }\n\n const lastKnownLocation: LngLatLike = [\n this._lastKnownPosition.coords.longitude,\n this._lastKnownPosition.coords.latitude,\n ];\n\n const projectedLocation = this._map.project(lastKnownLocation);\n const a = this._map.unproject([projectedLocation.x, projectedLocation.y]);\n const b = this._map.unproject([\n projectedLocation.x + 20,\n projectedLocation.y,\n ]);\n const metersPerPixel = a.distanceTo(b) / 20;\n\n const circleDiameter = Math.ceil((2.0 * this._accuracy) / metersPerPixel);\n this._circleElement.style.width = `${circleDiameter}px`;\n this._circleElement.style.height = `${circleDiameter}px`;\n }\n\n _onZoom() {\n if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n this._updateCircleRadius();\n }\n }\n}\n","/**\n * This is an extension of MapLibre AttributionControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class AttributionControl extends maplibregl.AttributionControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ScaleControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ScaleControl extends maplibregl.ScaleControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre FullscreenControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class FullscreenControl extends maplibregl.FullscreenControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { Base64 } from \"js-base64\";\nimport type {\n StyleSpecification,\n MapOptions as MapOptionsML,\n ControlPosition,\n StyleOptions,\n MapDataEvent,\n Tile,\n RasterDEMSourceSpecification,\n RequestTransformFunction,\n} from \"maplibre-gl\";\nimport { ReferenceMapStyle, MapStyleVariant } from \"@maptiler/client\";\nimport { config, MAPTILER_SESSION_ID, SdkConfig } from \"./config\";\nimport { defaults } from \"./defaults\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { combineTransformRequest, enableRTL } from \"./tools\";\nimport {\n getBrowserLanguage,\n isLanguageSupported,\n Language,\n LanguageString,\n} from \"./language\";\nimport { styleToStyle } from \"./mapstyle\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\nimport { geolocation } from \"@maptiler/client\";\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\n\nfunction sleepAsync(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport type LoadWithTerrainEvent = {\n type: \"loadWithTerrain\";\n target: Map;\n terrain: {\n source: string;\n exaggeration: number;\n };\n};\n\n// StyleSwapOptions is not exported by Maplibre, but we can redefine it (used for setStyle)\nexport type TransformStyleFunction = (\n previous: StyleSpecification,\n next: StyleSpecification\n) => StyleSpecification;\n\nexport type StyleSwapOptions = {\n diff?: boolean;\n transformStyle?: TransformStyleFunction;\n};\n\nexport const GeolocationType: {\n POINT: \"POINT\";\n COUNTRY: \"COUNTRY\";\n} = {\n POINT: \"POINT\",\n COUNTRY: \"COUNTRY\",\n} as const;\n\ntype MapTerrainDataEvent = MapDataEvent & {\n isSourceLoaded: boolean;\n tile: Tile;\n sourceId: string;\n source: RasterDEMSourceSpecification;\n};\n\n/**\n * Options to provide to the `Map` constructor\n */\nexport type MapOptions = Omit<MapOptionsML, \"style\" | \"maplibreLogo\"> & {\n /**\n * Style of the map. Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n */\n style?: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string;\n\n /**\n * Define the language of the map. This can be done directly with a language ISO code (eg. \"en\")\n * or with a built-in shorthand (eg. Language.ENGLISH).\n * Note that this is equivalent to setting the `config.primaryLanguage` and will overwrite it.\n */\n language?: LanguageString;\n\n /**\n * Define the MapTiler Cloud API key to be used. This is strictly equivalent to setting\n * `config.apiKey` and will overwrite it.\n */\n apiKey?: string;\n\n /**\n * Shows or hides the MapTiler logo in the bottom left corner.\n *\n * For paid plans:\n * - `true` shows MapTiler logo\n * - `false` hodes MapTiler logo\n * - default: `false` (hide)\n *\n * For free plans: MapTiler logo always shows, regardless of the value.\n */\n maptilerLogo?: boolean;\n\n /**\n * Enables 3D terrain if `true`. (default: `false`)\n */\n terrain?: boolean;\n\n /**\n * Exaggeration factor of the terrain. (default: `1`, no exaggeration)\n */\n terrainExaggeration?: number;\n\n /**\n * Show the navigation control. (default: `true`, will hide if `false`)\n */\n navigationControl?: boolean | ControlPosition;\n\n /**\n * Show the terrain control. (default: `false`, will show if `true`)\n */\n terrainControl?: boolean | ControlPosition;\n\n /**\n * Show the geolocate control. (default: `true`, will hide if `false`)\n */\n geolocateControl?: boolean | ControlPosition;\n\n /**\n * Show the scale control. (default: `false`, will show if `true`)\n */\n scaleControl?: boolean | ControlPosition;\n\n /**\n * Show the full screen control. (default: `false`, will show if `true`)\n */\n fullscreenControl?: boolean | ControlPosition;\n\n /**\n * Method to position the map at a given geolocation. Only if:\n * - `hash` is `false`\n * - `center` is not provided\n *\n * If the value is `true` of `\"POINT\"` (given by `GeolocationType.POINT`) then the positionning uses the MapTiler Cloud\n * Geolocation to find the non-GPS location point.\n * The zoom level can be provided in the `Map` constructor with the `zoom` option or will be `13` if not provided.\n *\n * If the value is `\"COUNTRY\"` (given by `GeolocationType.COUNTRY`) then the map is centered around the bounding box of the country.\n * In this case, the `zoom` option will be ignored.\n *\n * If the value is `false`, no geolocation is performed and the map centering and zooming depends on other options or on\n * the built-in defaults.\n *\n * If this option is non-false and the options `center` is also provided, then `center` prevails.\n *\n * Default: `false`\n */\n geolocate?: (typeof GeolocationType)[keyof typeof GeolocationType] | boolean;\n};\n\n/**\n * The Map class can be instanciated to display a map in a `<div>`\n */\nexport class Map extends maplibregl.Map {\n private isTerrainEnabled = false;\n private terrainExaggeration = 1;\n private primaryLanguage: LanguageString | null = null;\n private secondaryLanguage: LanguageString | null = null;\n private terrainGrowing = false;\n private terrainFlattening = false;\n\n constructor(options: MapOptions) {\n if (options.apiKey) {\n config.apiKey = options.apiKey;\n }\n\n const style = styleToStyle(options.style);\n const hashPreConstructor = location.hash;\n\n if (!config.apiKey) {\n console.warn(\n \"MapTiler Cloud API key is not set. Visit https://maptiler.com and try Cloud for free!\"\n );\n }\n\n // calling the map constructor with full length style\n super({\n ...options,\n style,\n maplibreLogo: false,\n transformRequest: combineTransformRequest(options.transformRequest),\n });\n\n this.primaryLanguage = options.language ?? config.primaryLanguage;\n this.secondaryLanguage = config.secondaryLanguage;\n this.terrainExaggeration =\n options.terrainExaggeration ?? this.terrainExaggeration;\n\n // Map centering and geolocation\n this.once(\"styledata\", async () => {\n // Not using geolocation centering if...\n\n // the geolcoate option is not provided or is falsy\n if (!options.geolocate) {\n return;\n }\n\n // ... a center is provided in options\n if (options.center) {\n return;\n }\n\n // ... the hash option is enabled and a hash is present in the URL\n if (options.hash && !!hashPreConstructor) {\n return;\n }\n\n // If the geolocation is set to COUNTRY:\n try {\n if (options.geolocate === GeolocationType.COUNTRY) {\n await this.fitToIpBounds();\n return;\n }\n } catch (e) {\n // not raising\n console.warn(e.message);\n }\n\n // As a fallback, we want to center the map on the visitor. First with IP geolocation...\n let ipLocatedCameraHash = null;\n try {\n await this.centerOnIpPoint(options.zoom);\n ipLocatedCameraHash = this.getCameraHash();\n } catch (e) {\n // not raising\n console.warn(e.message);\n }\n\n // A more precise localization\n\n // This more advanced localization is commented out because the easeTo animation\n // triggers an error if the terrain grow is enabled (due to being nable to project the center while moving)\n\n // Then, the get a more precise location, we rely on the browser location, but only if it was already granted\n // before (we don't want to ask wih a popup at launch time)\n const locationResult = await navigator.permissions.query({\n name: \"geolocation\",\n });\n\n if (locationResult.state === \"granted\") {\n navigator.geolocation.getCurrentPosition(\n // success callback\n (data) => {\n // If the user has already moved since the ip location, then we no longer want to move the center\n if (ipLocatedCameraHash !== this.getCameraHash()) {\n return;\n }\n\n if (this.terrain) {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n } else {\n this.once(\"terrain\", () => {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n });\n }\n },\n\n // error callback\n null,\n\n // options\n {\n maximumAge: 24 * 3600 * 1000, // a day in millisec\n timeout: 5000, // milliseconds\n enableHighAccuracy: false,\n }\n );\n }\n });\n\n // If the config includes language changing, we must update the map language\n this.on(\"styledata\", () => {\n this.setPrimaryLanguage(this.primaryLanguage);\n this.setSecondaryLanguage(this.secondaryLanguage);\n });\n\n // this even is in charge of reaplying the terrain elevation after the\n // style has changed because depending on the src/tgt style,\n // the style logic is not always able to resolve the application of terrain\n this.on(\"styledata\", () => {\n // the styling resolver did no manage to reaply the terrain,\n // so let's reload it\n if (this.getTerrain() === null && this.isTerrainEnabled) {\n this.enableTerrain(this.terrainExaggeration);\n }\n });\n\n // load the Right-to-Left text plugin (will happen only once)\n this.once(\"load\", async () => {\n enableRTL();\n });\n\n // Update logo and attibution\n this.once(\"load\", async () => {\n let tileJsonContent = { logo: null };\n\n try {\n const possibleSources = Object.keys(this.style.sourceCaches)\n .map((sourceName) => this.getSource(sourceName))\n .filter(\n (s: any) =>\n typeof s.url === \"string\" && s.url.includes(\"tiles.json\")\n );\n\n const styleUrl = new URL(\n (possibleSources[0] as maplibregl.VectorTileSource).url\n );\n\n if (!styleUrl.searchParams.has(\"key\")) {\n styleUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n const tileJsonRes = await fetch(styleUrl.href);\n tileJsonContent = await tileJsonRes.json();\n } catch (e) {\n // No tiles.json found (should not happen on maintained styles)\n }\n\n // The attribution and logo must show when required\n if (\"logo\" in tileJsonContent && tileJsonContent.logo) {\n const logoURL: string = tileJsonContent.logo;\n\n this.addControl(\n new MaptilerLogoControl({ logoURL }),\n options.logoPosition\n );\n\n // if attribution in option is `false` but the the logo shows up in the tileJson, then the attribution must show anyways\n if (options.attributionControl === false) {\n this.addControl(\n new AttributionControl({\n customAttribution: options.customAttribution,\n })\n );\n }\n } else if (options.maptilerLogo) {\n this.addControl(new MaptilerLogoControl(), options.logoPosition);\n }\n\n // the other controls at init time but be after\n // (due to the async nature of logo control)\n\n // By default, no scale control\n if (options.scaleControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.scaleControl === true || options.scaleControl === undefined\n ? \"bottom-right\"\n : options.scaleControl\n ) as ControlPosition;\n\n const scaleControl = new ScaleControl({ unit: config.unit });\n this.addControl(scaleControl, position);\n config.on(\"unit\", (unit) => {\n scaleControl.setUnit(unit);\n });\n }\n\n if (options.navigationControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.navigationControl === true ||\n options.navigationControl === undefined\n ? \"top-right\"\n : options.navigationControl\n ) as ControlPosition;\n this.addControl(new MaptilerNavigationControl(), position);\n }\n\n if (options.geolocateControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.geolocateControl === true ||\n options.geolocateControl === undefined\n ? \"top-right\"\n : options.geolocateControl\n ) as ControlPosition;\n\n this.addControl(\n // new maplibregl.GeolocateControl({\n new MaptilerGeolocateControl({\n positionOptions: {\n enableHighAccuracy: true,\n maximumAge: 0,\n timeout: 6000 /* 6 sec */,\n },\n fitBoundsOptions: {\n maxZoom: 15,\n },\n trackUserLocation: true,\n showAccuracyCircle: true,\n showUserLocation: true,\n }),\n position\n );\n }\n\n if (options.terrainControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.terrainControl === true ||\n options.terrainControl === undefined\n ? \"top-right\"\n : options.terrainControl\n ) as ControlPosition;\n this.addControl(new MaptilerTerrainControl(), position);\n }\n\n // By default, no fullscreen control\n if (options.fullscreenControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.fullscreenControl === true ||\n options.fullscreenControl === undefined\n ? \"top-right\"\n : options.fullscreenControl\n ) as ControlPosition;\n\n this.addControl(new FullscreenControl({}), position);\n }\n });\n\n // Creating a custom event: \"loadWithTerrain\"\n // that fires only once when both:\n // - the map has full loaded (corresponds to the the \"load\" event)\n // - the terrain has loaded (corresponds to the \"terrain\" event with terrain beion non-null)\n // This custom event is necessary to wait for when the map is instanciated with `terrain: true`\n // and some animation (flyTo, easeTo) are running from the begining.\n let loadEventTriggered = false;\n let terrainEventTriggered = false;\n let terrainEventData: LoadWithTerrainEvent = null;\n\n this.once(\"load\", (_) => {\n loadEventTriggered = true;\n if (terrainEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData);\n }\n });\n\n const terrainCallback = (evt) => {\n if (!evt.terrain) return;\n terrainEventTriggered = true;\n terrainEventData = {\n type: \"loadWithTerrain\",\n target: this,\n terrain: evt.terrain,\n };\n this.off(\"terrain\", terrainCallback);\n\n if (loadEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData as LoadWithTerrainEvent);\n }\n };\n\n this.on(\"terrain\", terrainCallback);\n\n // enable 3D terrain if provided in options\n if (options.terrain) {\n this.enableTerrain(\n options.terrainExaggeration ?? this.terrainExaggeration\n );\n }\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" and returns a Promise to the Map.\n * If _this_ Map instance is already loaded, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"load\" event.\n * @returns\n */\n async onLoadAsync() {\n return new Promise<Map>((resolve, reject) => {\n if (this.loaded()) {\n return resolve(this);\n }\n\n this.once(\"load\", (_) => {\n resolve(this);\n });\n });\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" as well as with terrain being non-null for the first time\n * and returns a Promise to the Map.\n * If _this_ Map instance is already loaded with terrain, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"loadWithTerrain\" event.\n * @returns\n */\n async onLoadWithTerrainAsync() {\n return new Promise<Map>((resolve, reject) => {\n if (this.loaded() && this.terrain) {\n return resolve(this);\n }\n\n this.once(\"loadWithTerrain\", (_) => {\n resolve(this);\n });\n });\n }\n\n /**\n * Update the style of the map.\n * Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n * @param style\n * @param options\n * @returns\n */\n setStyle(\n style: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string,\n options?: StyleSwapOptions & StyleOptions\n ) {\n return super.setStyle(styleToStyle(style), options);\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n * This function is a short for `.setPrimaryLanguage()`\n * @param language\n */\n setLanguage(language: LanguageString = defaults.primaryLanguage) {\n if (language === Language.AUTO) {\n return this.setLanguage(getBrowserLanguage());\n }\n this.setPrimaryLanguage(language);\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n * @param language\n */\n setPrimaryLanguage(language: LanguageString = defaults.primaryLanguage) {\n if (this.primaryLanguage === Language.STYLE_LOCK) {\n console.warn(\n \"The language cannot be changed because this map has been instantiated with the STYLE_LOCK language flag.\"\n );\n return;\n }\n\n if (!isLanguageSupported(language as string)) {\n return;\n }\n\n this.primaryLanguage = language;\n\n this.onStyleReady(() => {\n if (language === Language.AUTO) {\n return this.setPrimaryLanguage(getBrowserLanguage());\n }\n\n const layers = this.getStyle().layers;\n\n // detects pattern like \"{name:somelanguage}\" with loose spacing\n const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // detects pattern like \"name:somelanguage\" with loose spacing\n const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n // for string based bilingual lang such as \"{name:latin} {name:nonlatin}\" or \"{name:latin} {name}\"\n const strBilingualRegex =\n /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // Regex to capture when there are more info, such as mountains elevation with unit m/ft\n const strMoreInfoRegex = /^(.*)({\\s*name\\s*(:\\s*(\\S*))?\\s*})(.*)$/;\n\n const langStr = language ? `name:${language}` : \"name\"; // to handle local lang\n const replacer = [\n \"case\",\n [\"has\", langStr],\n [\"get\", langStr],\n [\"get\", \"name\"],\n ];\n\n for (let i = 0; i < layers.length; i += 1) {\n const layer = layers[i];\n const layout = layer.layout;\n\n if (!layout) {\n continue;\n }\n\n if (!layout[\"text-field\"]) {\n continue;\n }\n\n const textFieldLayoutProp = this.getLayoutProperty(\n layer.id,\n \"text-field\"\n );\n\n // Note:\n // The value of the 'text-field' property can take multiple shape;\n // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n // 2. can be an array with 'get' on its first element (monolingual)\n // 3. can be a string of shape '{name:latin}'\n // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n //\n // The case 1, 2 and 3 will be updated while maintaining their original type and shape.\n // The case 3 will not be updated\n\n let regexMatch;\n\n // This is case 1\n if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n ) {\n const newProp = textFieldLayoutProp.slice(); // newProp is Array\n // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n // The style could also define that there are more things being concatenated and not only languages\n\n for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n const elem = textFieldLayoutProp[j];\n\n // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n // the entry of of shape '{name:somelangage}', possibly with loose spacing\n if (\n (typeof elem === \"string\" || elem instanceof String) &&\n strLanguageRegex.exec(elem.toString())\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n }\n // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n else if (\n Array.isArray(elem) &&\n elem.length >= 2 &&\n elem[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(elem[1].toString())\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n } else if (\n Array.isArray(elem) &&\n elem.length === 4 &&\n elem[0].trim().toLowerCase() === \"case\"\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n }\n }\n\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // This is case 2\n else if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(textFieldLayoutProp[1].toString())\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // This is case 3\n else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n strLanguageRegex.exec(textFieldLayoutProp.toString())\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length === 4 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"case\"\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strBilingualRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const newProp = `{${langStr}}${regexMatch[3]}{name${\n regexMatch[4] || \"\"\n }}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strMoreInfoRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const newProp = `${regexMatch[1]}{${langStr}}${regexMatch[5]}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n }\n });\n }\n\n /**\n * Define the secondary language of the map. Note that this is not supported by all the map styles\n * Note that most styles do not allow a secondary language and this function only works if the style allows (no force adding)\n * @param language\n */\n setSecondaryLanguage(language: LanguageString = defaults.secondaryLanguage) {\n // Using the lock flag as a primaty language also applies to the secondary\n if (this.primaryLanguage === Language.STYLE_LOCK) {\n console.warn(\n \"The language cannot be changed because this map has been instantiated with the STYLE_LOCK language flag.\"\n );\n return;\n }\n\n if (!isLanguageSupported(language as string)) {\n return;\n }\n\n this.secondaryLanguage = language;\n\n this.onStyleReady(() => {\n if (language === Language.AUTO) {\n return this.setSecondaryLanguage(getBrowserLanguage());\n }\n\n const layers = this.getStyle().layers;\n\n // detects pattern like \"{name:somelanguage}\" with loose spacing\n const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // detects pattern like \"name:somelanguage\" with loose spacing\n const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n // for string based bilingual lang such as \"{name:latin} {name:nonlatin}\" or \"{name:latin} {name}\"\n const strBilingualRegex =\n /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n let regexMatch;\n\n for (let i = 0; i < layers.length; i += 1) {\n const layer = layers[i];\n const layout = layer.layout;\n\n if (!layout) {\n continue;\n }\n\n if (!layout[\"text-field\"]) {\n continue;\n }\n\n const textFieldLayoutProp = this.getLayoutProperty(\n layer.id,\n \"text-field\"\n );\n\n let newProp;\n\n // Note:\n // The value of the 'text-field' property can take multiple shape;\n // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n // 2. can be an array with 'get' on its first element (monolingual)\n // 3. can be a string of shape '{name:latin}'\n // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n //\n // Only the case 1 will be updated because we don't want to change the styling (read: add a secondary language where the original styling is only displaying 1)\n\n // This is case 1\n if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n ) {\n newProp = textFieldLayoutProp.slice(); // newProp is Array\n // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n // The style could also define that there are more things being concatenated and not only languages\n\n let languagesAlreadyFound = 0;\n\n for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n const elem = textFieldLayoutProp[j];\n\n // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n // the entry of of shape '{name:somelangage}', possibly with loose spacing\n if (\n (typeof elem === \"string\" || elem instanceof String) &&\n strLanguageRegex.exec(elem.toString())\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j] = `{name:${language}}`;\n break; // we just want to update the secondary language\n }\n\n languagesAlreadyFound += 1;\n }\n // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n else if (\n Array.isArray(elem) &&\n elem.length >= 2 &&\n elem[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(elem[1].toString())\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j][1] = `name:${language}`;\n break; // we just want to update the secondary language\n }\n\n languagesAlreadyFound += 1;\n } else if (\n Array.isArray(elem) &&\n elem.length === 4 &&\n elem[0].trim().toLowerCase() === \"case\"\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j] = [\"get\", `name:${language}`]; // the situation with 'case' is supposed to only happen with the primary lang\n break; // but in case a styling also does that for secondary...\n }\n\n languagesAlreadyFound += 1;\n }\n }\n\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // the language (both first and second) are defined into a single string model\n else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strBilingualRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const langStr = language ? `name:${language}` : \"name\"; // to handle local lang\n newProp = `{name${regexMatch[1] || \"\"}}${regexMatch[3]}{${langStr}}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n }\n });\n }\n\n /**\n * Get the primary language\n * @returns\n */\n getPrimaryLanguage(): LanguageString {\n return this.primaryLanguage;\n }\n\n /**\n * Get the secondary language\n * @returns\n */\n getSecondaryLanguage(): LanguageString {\n return this.secondaryLanguage;\n }\n\n /**\n * Get the exaggeration factor applied to the terrain\n * @returns\n */\n getTerrainExaggeration(): number {\n return this.terrainExaggeration;\n }\n\n /**\n * Know if terrian is enabled or not\n * @returns\n */\n hasTerrain(): boolean {\n return this.isTerrainEnabled;\n }\n\n private growTerrain(exaggeration, durationMs = 1000) {\n // This method assumes the terrain is already built\n if (!this.terrain) {\n return;\n }\n\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n const deltaExaggeration = exaggeration - currentExaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the flattening animation is triggered while the growing animation\n // is running, then the flattening animation is stopped\n if (this.terrainFlattening) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop = (performance.now() - startTime) / durationMs;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = 1 - Math.pow(1 - positionInLoop, 4);\n const newExaggeration =\n currentExaggeration + exaggerationFactor * deltaExaggeration;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n this.terrain.exaggeration = exaggeration;\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = true;\n this.terrainFlattening = false;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Enables the 3D terrain visualization\n * @param exaggeration\n * @returns\n */\n enableTerrain(exaggeration = this.terrainExaggeration) {\n if (exaggeration < 0) {\n console.warn(\"Terrain exaggeration cannot be negative.\");\n return;\n }\n\n // This function is mapped to a map \"data\" event. It checks that the terrain\n // tiles are loaded and when so, it starts an animation to make the terrain grow\n const dataEventTerrainGrow = async (evt: MapTerrainDataEvent) => {\n if (!this.terrain) {\n return;\n }\n\n if (\n evt.type !== \"data\" ||\n evt.dataType !== \"source\" ||\n !(\"source\" in evt)\n ) {\n return;\n }\n\n if (evt.sourceId !== \"maptiler-terrain\") {\n return;\n }\n\n const source = evt.source;\n\n if (source.type !== \"raster-dem\") {\n return;\n }\n\n if (!evt.isSourceLoaded) {\n return;\n }\n\n // We shut this event off because we want it to happen only once.\n // Yet, we cannot use the \"once\" method because only the last event of the series\n // has `isSourceLoaded` true\n this.off(\"data\", dataEventTerrainGrow);\n\n this.growTerrain(exaggeration);\n };\n\n // This is put into a function so that it can be called regardless\n // of the loading state of _this_ the map instance\n const addTerrain = () => {\n // When style is changed,\n this.isTerrainEnabled = true;\n this.terrainExaggeration = exaggeration;\n\n // Mapping it to the \"data\" event so that we can check that the terrain\n // growing starts only when terrain tiles are loaded (to reduce glitching)\n this.on(\"data\", dataEventTerrainGrow);\n\n this.addSource(defaults.terrainSourceId, {\n type: \"raster-dem\",\n url: defaults.terrainSourceURL,\n });\n\n // Setting up the terrain with a 0 exaggeration factor\n // so it loads ~seamlessly and then can grow from there\n this.setTerrain({\n source: defaults.terrainSourceId,\n exaggeration: 0,\n });\n };\n\n // The terrain has already been loaded,\n // we just update the exaggeration.\n if (this.getTerrain()) {\n this.isTerrainEnabled = true;\n this.growTerrain(exaggeration);\n return;\n }\n\n if (this.loaded() || this.isTerrainEnabled) {\n addTerrain();\n } else {\n this.once(\"load\", () => {\n if (this.getTerrain() && this.getSource(defaults.terrainSourceId)) {\n return;\n }\n addTerrain();\n });\n }\n }\n\n /**\n * Disable the 3D terrain visualization\n */\n disableTerrain() {\n // It could be disabled already\n if (!this.terrain) {\n return;\n }\n\n this.isTerrainEnabled = false;\n // this.stopFlattening = false;\n\n // Duration of the animation in millisec\n const animationLoopDuration = 1 * 1000;\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the growing animation is triggered while flattening,\n // then we exist the flatening\n if (this.terrainGrowing) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop =\n (performance.now() - startTime) / animationLoopDuration;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = Math.pow(1 - positionInLoop, 4);\n const newExaggeration = currentExaggeration * exaggerationFactor;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrain.exaggeration = 0;\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n this.setTerrain(null);\n if (this.getSource(defaults.terrainSourceId)) {\n this.removeSource(defaults.terrainSourceId);\n }\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = false;\n this.terrainFlattening = true;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Sets the 3D terrain exageration factor.\n * If the terrain was not enabled prior to the call of this method,\n * the method `.enableTerrain()` will be called.\n * If `animate` is `true`, the terrain transformation will be animated in the span of 1 second.\n * If `animate` is `false`, no animated transition to the newly defined exaggeration.\n * @param exaggeration\n * @param animate\n */\n setTerrainExaggeration(exaggeration: number, animate = true) {\n if (!animate && this.terrain) {\n this.terrainExaggeration = exaggeration;\n this.terrain.exaggeration = exaggeration;\n this.triggerRepaint();\n } else {\n this.enableTerrain(exaggeration);\n }\n }\n\n /**\n * Perform an action when the style is ready. It could be at the moment of calling this method\n * or later.\n * @param cb\n */\n private onStyleReady(cb) {\n if (this.isStyleLoaded()) {\n cb();\n } else {\n this.once(\"styledata\", () => {\n cb();\n });\n }\n }\n\n async fitToIpBounds() {\n const ipGeolocateResult = await geolocation.info();\n this.fitBounds(\n ipGeolocateResult.country_bounds as [number, number, number, number],\n {\n duration: 0,\n padding: 100,\n }\n );\n }\n\n async centerOnIpPoint(zoom: number | undefined) {\n const ipGeolocateResult = await geolocation.info();\n this.jumpTo({\n center: [ipGeolocateResult.longitude, ipGeolocateResult.latitude],\n zoom: zoom || 11,\n });\n }\n\n getCameraHash() {\n const hashBin = new Float32Array(5);\n const center = this.getCenter();\n hashBin[0] = center.lng;\n hashBin[1] = center.lat;\n hashBin[2] = this.getZoom();\n hashBin[3] = this.getPitch();\n hashBin[4] = this.getBearing();\n return Base64.fromUint8Array(new Uint8Array(hashBin.buffer));\n }\n\n /**\n * Get the SDK config object.\n * This is convenient to dispatch the SDK configuration to externally built layers\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n * @returns\n */\n getSdkConfig(): SdkConfig {\n return config;\n }\n\n /**\n * Get the MapTiler session ID. Convenient to dispatch to externaly built component\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n * @returns\n */\n getMaptilerSessionId(): string {\n return MAPTILER_SESSION_ID;\n }\n\n /**\n * Updates the requestManager's transform request with a new function.\n *\n * @param transformRequest A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.\n * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties\n *\n * @returns {Map} `this`\n *\n * @example\n * map.setTransformRequest((url: string, resourceType: string) => {});\n */\n setTransformRequest(transformRequest: RequestTransformFunction) {\n super.setTransformRequest(combineTransformRequest(transformRequest));\n return this;\n }\n}\n","/**\n * This is an extension of MapLibre Marker to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Marker extends maplibregl.Marker {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Popup to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Popup extends maplibregl.Popup {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Style to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL, StyleOptions } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Style extends maplibregl.Style {\n constructor(map: Map, options: StyleOptions = {}) {\n super(map as MapMLGL, options);\n }\n}\n","/**\n * This is an extension of MapLibre CanvasSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class CanvasSource extends maplibregl.CanvasSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre GeoJSONSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeoJSONSource extends maplibregl.GeoJSONSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ImageSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ImageSource extends maplibregl.ImageSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterTileSource extends maplibregl.RasterTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterDEMTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterDEMTileSource extends maplibregl.RasterDEMTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VectorTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VectorTileSource extends maplibregl.VectorTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VideoSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VideoSource extends maplibregl.VideoSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre TerrainControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class TerrainControl extends maplibregl.TerrainControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is TypeScript rewrite of the Point class to use instead of the version imported in MapLibre.\n * It also uses a class instead of prototypes.\n */\n\n/**\n * Row major 2x2 matrix\n */\nexport type Matrix2 = [number, number, number, number];\n\n/**\n * a point\n * @param x\n * @param y\n */\nexport class Point {\n public x: number;\n public y: number;\n\n constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n private _matMult(m: Matrix2): Point {\n const x = m[0] * this.x + m[1] * this.y;\n const y = m[2] * this.x + m[3] * this.y;\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _add(p: Point): Point {\n this.x += p.x;\n this.y += p.y;\n return this;\n }\n\n private _sub(p: Point): Point {\n this.x -= p.x;\n this.y -= p.y;\n return this;\n }\n\n private _mult(k: number): Point {\n this.x *= k;\n this.y *= k;\n return this;\n }\n\n private _div(k: number): Point {\n this.x /= k;\n this.y /= k;\n return this;\n }\n\n private _multByPoint(p: Point): Point {\n this.x *= p.x;\n this.y *= p.y;\n return this;\n }\n\n private _divByPoint(p: Point): Point {\n this.x /= p.x;\n this.y /= p.y;\n return this;\n }\n\n private _unit(): Point {\n this._div(this.mag());\n return this;\n }\n\n private _perp(): Point {\n const y = this.y;\n this.y = this.x;\n this.x = -y;\n return this;\n }\n\n private _rotate(angle: number): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const x = cos * this.x - sin * this.y;\n const y = sin * this.x + cos * this.y;\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _rotateAround(angle: number, p: Point): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y);\n const y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _round(): Point {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n\n /**\n * Clone this point, returning a new point that can be modified\n * without affecting the old one.\n * @return {Point} the clone\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Add this point's x & y coordinates to another point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n add(p: Point): Point {\n return this.clone()._add(p);\n }\n\n /**\n * Subtract this point's x & y coordinates to from point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n sub(p: Point): Point {\n return this.clone()._sub(p);\n }\n\n /**\n * Multiply this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n multByPoint(p: Point): Point {\n return this.clone()._multByPoint(p);\n }\n\n /**\n * Divide this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n divByPoint(p: Point): Point {\n return this.clone()._divByPoint(p);\n }\n\n /**\n * Multiply this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Number} k factor\n * @return {Point} output point\n */\n mult(k: number): Point {\n return this.clone()._mult(k);\n }\n\n /**\n * Divide this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Point} k factor\n * @return {Point} output point\n */\n div(k: number): Point {\n return this.clone()._div(k);\n }\n\n /**\n * Rotate this point around the 0, 0 origin by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @return {Point} output point\n */\n rotate(a: number): Point {\n return this.clone()._rotate(a);\n }\n\n /**\n * Rotate this point around p point by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @param {Point} p Point to rotate around\n * @return {Point} output point\n */\n rotateAround(a: number, p: Point): Point {\n return this.clone()._rotateAround(a, p);\n }\n\n /**\n * Multiply this point by a 4x1 transformation matrix\n * @param {Array<Number>} m transformation matrix\n * @return {Point} output point\n */\n matMult(m: Matrix2): Point {\n return this.clone()._matMult(m);\n }\n\n /**\n * Calculate this point but as a unit vector from 0, 0, meaning\n * that the distance from the resulting point to the 0, 0\n * coordinate will be equal to 1 and the angle from the resulting\n * point to the 0, 0 coordinate will be the same as before.\n * @return {Point} unit vector point\n */\n unit(): Point {\n return this.clone()._unit();\n }\n\n /**\n * Compute a perpendicular point, where the new y coordinate\n * is the old x coordinate and the new x coordinate is the old y\n * coordinate multiplied by -1\n * @return {Point} perpendicular point\n */\n perp(): Point {\n return this.clone()._perp();\n }\n\n /**\n * Return a version of this point with the x & y coordinates\n * rounded to integers.\n * @return {Point} rounded point\n */\n round(): Point {\n return this.clone()._round();\n }\n\n /**\n * Return the magnitude of this point: this is the Euclidean\n * distance from the 0, 0 coordinate to this point's x and y\n * coordinates.\n * @return {Number} magnitude\n */\n mag(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n /**\n * Judge whether this point is equal to another point, returning\n * true or false.\n * @param {Point} other the other point\n * @return {boolean} whether the points are equal\n */\n equals(other): boolean {\n return this.x === other.x && this.y === other.y;\n }\n\n /**\n * Calculate the distance from this point to another point\n * @param {Point} p the other point\n * @return {Number} distance\n */\n dist(p): number {\n return Math.sqrt(this.distSqr(p));\n }\n\n /**\n * Calculate the distance from this point to another point,\n * without the square root step. Useful if you're comparing\n * relative distances.\n * @param {Point} p the other point\n * @return {Number} distance\n */\n distSqr(p): number {\n const dx = p.x - this.x;\n const dy = p.y - this.y;\n return dx * dx + dy * dy;\n }\n\n /**\n * Get the angle from the 0, 0 coordinate to this point, in radians\n * coordinates.\n * @return {Number} angle\n */\n angle(): number {\n return Math.atan2(this.y, this.x);\n }\n\n /**\n * Get the angle from this point to another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleTo(b: Point): number {\n return Math.atan2(this.y - b.y, this.x - b.x);\n }\n\n /**\n * Get the angle between this point and another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleWith(b: Point): number {\n return this.angleWithSep(b.x, b.y);\n }\n\n /*\n * Find the angle of the two vectors, solving the formula for\n * the cross product a x b = |a||b|sin(θ) for θ.\n * @param {Number} x the x-coordinate\n * @param {Number} y the y-coordinate\n * @return {Number} the angle in radians\n */\n angleWithSep(x: number, y: number): number {\n return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y);\n }\n\n /**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<number> | Point} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\n static convert(a: Point | Array<number>) {\n if (a instanceof Point) {\n return a;\n }\n if (Array.isArray(a)) {\n return new Point(a[0], a[1]);\n }\n return a;\n }\n}\n","/**\n * Maplibre export first, then extensions can overload the exports.\n */\nexport * from \"maplibre-gl\";\n\n/**\n * To perform explicit named export so that they are included in the UMD bundle\n */\n// import * as ML from \"maplibre-gl\";\n\nimport maplibregl from \"maplibre-gl\";\n\nconst {\n // supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n} = maplibregl;\n\n// We still want to export maplibregl.Map, but as a different name\nconst MapMLGL = maplibregl.Map;\nconst MarkerMLGL = maplibregl.Marker;\nconst PopupMLGL = maplibregl.Popup;\nconst StyleMLGL = maplibregl.Style;\nconst CanvasSourceMLGL = maplibregl.CanvasSource;\nconst GeoJSONSourceMLGL = maplibregl.GeoJSONSource;\nconst ImageSourceMLGL = maplibregl.ImageSource;\nconst RasterTileSourceMLGL = maplibregl.RasterTileSource;\nconst RasterDEMTileSourceMLGL = maplibregl.RasterDEMTileSource;\nconst VectorTileSourceMLGL = maplibregl.VectorTileSource;\nconst VideoSourceMLGL = maplibregl.VideoSource;\nconst NavigationControlMLGL = maplibregl.NavigationControl;\nconst GeolocateControlMLGL = maplibregl.GeolocateControl;\nconst AttributionControlMLGL = maplibregl.AttributionControl;\nconst LogoControlMLGL = maplibregl.LogoControl;\nconst ScaleControlMLGL = maplibregl.ScaleControl;\nconst FullscreenControlMLGL = maplibregl.FullscreenControl;\nconst TerrainControlMLGL = maplibregl.TerrainControl;\n\nexport {\n // supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n PopupMLGL,\n MarkerMLGL,\n StyleMLGL,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n CanvasSourceMLGL,\n GeoJSONSourceMLGL,\n ImageSourceMLGL,\n RasterDEMTileSourceMLGL,\n RasterTileSourceMLGL,\n VectorTileSourceMLGL,\n VideoSourceMLGL,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n MapMLGL,\n};\n\n// Exporting types of class instances from MapLibre:\nexport type NavigationControlMLGL = InstanceType<typeof NavigationControlMLGL>;\nexport type GeolocateControlMLGL = InstanceType<typeof GeolocateControlMLGL>;\nexport type AttributionControlMLGL = InstanceType<\n typeof AttributionControlMLGL\n>;\nexport type LogoControlMLGL = InstanceType<typeof LogoControlMLGL>;\nexport type ScaleControlMLGL = InstanceType<typeof ScaleControlMLGL>;\nexport type FullscreenControlMLGL = InstanceType<typeof FullscreenControlMLGL>;\nexport type TerrainControlMLGL = InstanceType<typeof TerrainControlMLGL>;\nexport type MarkerMLGL = InstanceType<typeof MarkerMLGL>;\nexport type PopupMLGL = InstanceType<typeof PopupMLGL>;\nexport type StyleMLGL = InstanceType<typeof StyleMLGL>;\nexport type LngLat = InstanceType<typeof LngLat>;\nexport type LngLatBounds = InstanceType<typeof LngLatBounds>;\nexport type MercatorCoordinate = InstanceType<typeof MercatorCoordinate>;\nexport type Evented = InstanceType<typeof Evented>;\nexport type AJAXError = InstanceType<typeof AJAXError>;\nexport type CanvasSourceMLGL = InstanceType<typeof CanvasSourceMLGL>;\nexport type GeoJSONSourceMLGL = InstanceType<typeof GeoJSONSourceMLGL>;\nexport type ImageSourceMLGL = InstanceType<typeof ImageSourceMLGL>;\nexport type RasterDEMTileSourceMLGL = InstanceType<\n typeof RasterDEMTileSourceMLGL\n>;\nexport type RasterTileSourceMLGL = InstanceType<typeof RasterTileSourceMLGL>;\nexport type VectorTileSourceMLGL = InstanceType<typeof VectorTileSourceMLGL>;\nexport type VideoSourceMLGL = InstanceType<typeof VideoSourceMLGL>;\nexport type MapMLGL = InstanceType<typeof MapMLGL>;\n\n// SDK specific\nimport { Map, GeolocationType } from \"./Map\";\nimport type { MapOptions, LoadWithTerrainEvent } from \"./Map\";\n\nimport { Marker } from \"./Marker\";\nimport { Popup } from \"./Popup\";\nimport { Style } from \"./Style\";\nimport { CanvasSource } from \"./CanvasSource\";\nimport { GeoJSONSource } from \"./GeoJSONSource\";\nimport { ImageSource } from \"./ImageSource\";\nimport { RasterTileSource } from \"./RasterTileSource\";\nimport { RasterDEMTileSource } from \"./RasterDEMTileSource\";\nimport { VectorTileSource } from \"./VectorTileSource\";\nimport { VideoSource } from \"./VideoSource\";\nimport { NavigationControl } from \"./NavigationControl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { LogoControl } from \"./LogoControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\nimport { TerrainControl } from \"./TerrainControl\";\n\n// Import of modified versions of the controls\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\n\n// importing client functions to expose them as part of the SDK\nimport type {\n BBox,\n Position,\n GeocodingOptions,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n AutomaticStaticMapOptions,\n BoundedStaticMapOptions,\n} from \"@maptiler/client\";\n\nimport {\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n ServiceError,\n LanguageGeocoding,\n LanguageGeocodingString,\n ReferenceMapStyle,\n MapStyle,\n MapStyleVariant,\n} from \"@maptiler/client\";\n\nimport type { MapStyleType } from \"@maptiler/client\";\n\nimport { Point } from \"./Point\";\nimport type { Matrix2 } from \"./Point\";\n\n// Importing enums and configs\nimport { config, SdkConfig } from \"./config\";\nimport { Language, LanguageString, LanguageKey } from \"./language\";\nimport type { Unit } from \"./unit\";\n\n// Exporting types\nexport type {\n MapOptions,\n LoadWithTerrainEvent,\n GeocodingOptions,\n BBox,\n Position,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n BoundedStaticMapOptions,\n AutomaticStaticMapOptions,\n LanguageString,\n LanguageKey,\n LanguageGeocodingString,\n Unit,\n MapStyleType,\n Matrix2,\n};\n\n// Exporting classes, objects, functions, etc.\nexport {\n Map,\n Marker,\n Popup,\n Style,\n CanvasSource,\n GeoJSONSource,\n ImageSource,\n RasterTileSource,\n RasterDEMTileSource,\n VideoSource,\n NavigationControl,\n GeolocateControl,\n AttributionControl,\n LogoControl,\n ScaleControl,\n FullscreenControl,\n TerrainControl,\n VectorTileSource,\n GeolocationType,\n SdkConfig,\n config,\n ServiceError,\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n MapStyle,\n Language,\n LanguageGeocoding,\n Point,\n ReferenceMapStyle,\n MapStyleVariant,\n MaptilerGeolocateControl,\n MaptilerLogoControl,\n MaptilerTerrainControl,\n MaptilerNavigationControl,\n};\n"],"names":["uuidv4","clientConfig","maplibregl","__spreadValues","Marker","LngLat","LngLatBounds","__spreadProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"maptiler-sdk.mjs","sources":["../src/language.ts","../src/defaults.ts","../src/config.ts","../src/LogoControl.ts","../src/MaptilerLogoControl.ts","../src/tools.ts","../src/mapstyle.ts","../src/MaptilerTerrainControl.ts","../src/NavigationControl.ts","../src/MaptilerNavigationControl.ts","../src/GeolocateControl.ts","../src/MaptilerGeolocateControl.ts","../src/AttributionControl.ts","../src/ScaleControl.ts","../src/FullscreenControl.ts","../src/Minimap.ts","../src/Map.ts","../src/Marker.ts","../src/Popup.ts","../src/Style.ts","../src/CanvasSource.ts","../src/GeoJSONSource.ts","../src/ImageSource.ts","../src/RasterTileSource.ts","../src/RasterDEMTileSource.ts","../src/VectorTileSource.ts","../src/VideoSource.ts","../src/TerrainControl.ts","../src/Point.ts","../src/converters/xml.ts","../src/colorramp.ts","../src/helpers/stylehelper.ts","../src/helpers/vectorlayerhelpers.ts","../src/helpers/index.ts","../src/index.ts"],"sourcesContent":["/**\n * Languages. Note that not all the languages of this list are available but the compatibility list may be expanded in the future.\n */\nconst Language = {\n /**\n * The visitor language mode concatenates the prefered language from the user settings and the \"default name\".\n * Note: The \"default name\" is equivalent to OSM's `{name}`, which can be the most recognized names a global\n * scale or the local name.\n * This mode is helpful in the context where a user needs to access both the local names and the names in their\n * own language, for instance when traveling abroad, where signs likely to be only available in the local language.\n */\n VISITOR: \"visitor\",\n\n /**\n * The visitor language mode concatenates English and the \"default name\".\n * Note: The \"default name\" is equivalent to OSM's `{name}`, which can be the most recognized names a global\n * scale or the local name.\n * This mode is helpful in the context where a user needs to access both the local names and the names in their\n * own language, for instance when traveling abroad, where signs likely to be only available in the local language.\n */\n VISITOR_ENGLISH: \"visitor_en\",\n\n /**\n * Language as the style is designed. Not that this is the default state and one\n * the language has been changed to another than `STYLE`, then it cannot be set back to `STYLE`.\n */\n STYLE: \"style\",\n\n /**\n * AUTO mode uses the language of the browser\n */\n AUTO: \"auto\",\n\n /**\n * STYLE is a custom flag to keep the language of the map as defined into the style.\n * If STYLE is set in the constructor, then further modification of the language\n * with `.setLanguage()` is not possible.\n */\n STYLE_LOCK: \"style_lock\",\n\n /**\n * Default fallback languages that uses latin charaters\n */\n LATIN: \"name:latin\",\n\n /**\n * Default fallback languages that uses non-latin charaters\n */\n NON_LATIN: \"name:nonlatin\",\n\n /**\n * Labels are in their local language, when available\n */\n LOCAL: \"name\",\n\n /**\n * International name\n */\n INTERNATIONAL: \"name_int\",\n\n ALBANIAN: \"name:sq\",\n AMHARIC: \"name:am\",\n ARABIC: \"name:ar\",\n ARMENIAN: \"name:hy\",\n AZERBAIJANI: \"name:az\",\n BASQUE: \"name:eu\",\n BELORUSSIAN: \"name:be\",\n BENGALI: \"name:bn\",\n BOSNIAN: \"name:bs\",\n BRETON: \"name:br\",\n BULGARIAN: \"name:bg\",\n CATALAN: \"name:ca\",\n CHINESE: \"name:zh\",\n TRADITIONAL_CHINESE: \"name:zh-Hant\",\n SIMPLIFIED_CHINESE: \"name:zh-Hans\",\n CORSICAN: \"name:co\",\n CROATIAN: \"name:hr\",\n CZECH: \"name:cs\",\n DANISH: \"name:da\",\n DUTCH: \"name:nl\",\n ENGLISH: \"name:en\",\n ESPERANTO: \"name:eo\",\n ESTONIAN: \"name:et\",\n FINNISH: \"name:fi\",\n FRENCH: \"name:fr\",\n FRISIAN: \"name:fy\",\n GEORGIAN: \"name:ka\",\n GERMAN: \"name:de\",\n GREEK: \"name:el\",\n HEBREW: \"name:he\",\n HINDI: \"name:hi\",\n HUNGARIAN: \"name:hu\",\n ICELANDIC: \"name:is\",\n INDONESIAN: \"name:id\",\n IRISH: \"name:ga\",\n ITALIAN: \"name:it\",\n JAPANESE: \"name:ja\",\n JAPANESE_HIRAGANA: \"name:ja-Hira\",\n JAPANESE_KANA: \"name:ja_kana\",\n JAPANESE_LATIN: \"name:ja_rm\",\n JAPANESE_2018: \"name:ja-Latn\",\n KANNADA: \"name:kn\",\n KAZAKH: \"name:kk\",\n KOREAN: \"name:ko\",\n KOREAN_LATIN: \"name:ko-Latn\",\n KURDISH: \"name:ku\",\n ROMAN_LATIN: \"name:la\",\n LATVIAN: \"name:lv\",\n LITHUANIAN: \"name:lt\",\n LUXEMBOURGISH: \"name:lb\",\n MACEDONIAN: \"name:mk\",\n MALAYALAM: \"name:ml\",\n MALTESE: \"name:mt\",\n NORWEGIAN: \"name:no\",\n OCCITAN: \"name:oc\",\n PERSIAN: \"name:fa\",\n POLISH: \"name:pl\",\n PORTUGUESE: \"name:pt\",\n PUNJABI: \"name:pa\",\n WESTERN_PUNJABI: \"name:pnb\",\n ROMANIAN: \"name:ro\",\n ROMANSH: \"name:rm\",\n RUSSIAN: \"name:ru\",\n SCOTTISH_GAELIC: \"name:gd\",\n SERBIAN_CYRILLIC: \"name:sr\",\n SERBIAN_LATIN: \"name:sr-Latn\",\n SLOVAK: \"name:sk\",\n SLOVENE: \"name:sl\",\n SPANISH: \"name:es\",\n SWEDISH: \"name:sv\",\n TAMIL: \"name:ta\",\n TELUGU: \"name:te\",\n THAI: \"name:th\",\n TURKISH: \"name:tr\",\n UKRAINIAN: \"name:uk\",\n URDU: \"name:ur\",\n VIETNAMIAN_LATIN: \"name:vi\",\n WELSH: \"name:cy\",\n} as const;\n\nconst languagesIsoSet = new Set(Object.values(Language) as Array<string>);\n\nfunction isLanguageSupported(lang: string): boolean {\n return languagesIsoSet.has(lang);\n}\n\nconst languageCodeSet = new Set(Object.values(Language));\n\n/**\n * Type representing the key of the Language object\n */\ntype LanguageKey = keyof typeof Language;\n\ntype Values<T> = T[keyof T];\n\n/**\n * Built-in languages values as strings\n */\ntype LanguageString = Values<typeof Language>;\n\nfunction getBrowserLanguage(): LanguageString {\n if (typeof navigator === \"undefined\") {\n return `name:${\n Intl.DateTimeFormat().resolvedOptions().locale.split(\"-\")[0]\n }` as LanguageString;\n }\n\n const canditatelangs = Array.from(\n new Set(navigator.languages.map((l) => `name:${l.split(\"-\")[0]}`)),\n ).filter((l) => languageCodeSet.has(l as LanguageString));\n\n return canditatelangs.length\n ? (canditatelangs[0] as LanguageString)\n : Language.LOCAL;\n}\n\nexport {\n Language,\n LanguageString,\n LanguageKey,\n getBrowserLanguage,\n isLanguageSupported,\n};\n","import { Language } from \"./language\";\n\n/**\n * Some default settings for the SDK\n */\nconst defaults = {\n maptilerLogoURL: \"https://api.maptiler.com/resources/logo.svg\",\n maptilerURL: \"https://www.maptiler.com/\",\n maptilerApiHost: \"api.maptiler.com\",\n rtlPluginURL:\n \"https://cdn.maptiler.com/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.min.js\",\n primaryLanguage: Language.STYLE,\n secondaryLanguage: Language.LOCAL,\n terrainSourceURL: \"https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json\",\n terrainSourceId: \"maptiler-terrain\",\n};\n\nObject.freeze(defaults);\n\nexport { defaults };\n","import EventEmitter from \"events\";\nimport { LanguageString } from \"./language\";\nimport { config as clientConfig, FetchFunction } from \"@maptiler/client\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Unit } from \"./unit\";\nimport { defaults } from \"./defaults\";\n\nexport const MAPTILER_SESSION_ID = uuidv4();\n\n/**\n * Configuration class for the SDK\n */\nclass SdkConfig extends EventEmitter {\n /**\n * The primary language. By default, the language of the web browser is used.\n */\n primaryLanguage: LanguageString = defaults.primaryLanguage;\n\n /**\n * The secondary language, to overwrite the default language defined in the map style.\n * This settings is highly dependant on the style compatibility and may not work in most cases.\n */\n secondaryLanguage?: LanguageString;\n\n /**\n * Setting on whether of not the SDK runs with a session logic.\n * A \"session\" is started at the initialization of the SDK and finished when the browser\n * page is being refreshed.\n * When `session` is enabled (default: true), the extra URL param `mtsid` is added to queries\n * on the MapTiler Cloud API. This allows MapTiler to enable \"session based billing\".\n */\n session = true;\n\n /**\n * Unit to be used\n */\n private _unit: Unit = \"metric\";\n\n /**\n * MapTiler Cloud API key\n */\n private _apiKey = \"\";\n\n constructor() {\n super();\n }\n\n /**\n * Set the unit system\n */\n set unit(u: Unit) {\n this._unit = u;\n this.emit(\"unit\", u);\n }\n\n /**\n * Get the unit system\n */\n get unit(): Unit {\n return this._unit;\n }\n\n /**\n * Set the MapTiler Cloud API key\n */\n set apiKey(k: string) {\n this._apiKey = k;\n clientConfig.apiKey = k;\n this.emit(\"apiKey\", k);\n }\n\n /**\n * Get the MapTiler Cloud API key\n */\n get apiKey(): string {\n return this._apiKey;\n }\n\n /**\n * Set a the custom fetch function to replace the default one\n */\n set fetch(f: FetchFunction) {\n clientConfig.fetch = f;\n }\n\n /**\n * Get the fetch fucntion\n */\n get fetch(): FetchFunction | null {\n return clientConfig.fetch;\n }\n}\n\nconst config = new SdkConfig();\n\nexport { config, SdkConfig };\n","/**\n * This is an extension of MapLibre LogoControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class LogoControl extends maplibregl.LogoControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import type { LogoOptions as LogoOptionsML } from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { LogoControl } from \"./LogoControl\";\nimport type { Map } from \"./Map\";\n\ntype LogoOptions = LogoOptionsML & {\n logoURL?: string;\n linkURL?: string;\n};\n\n/**\n * This LogoControl extends the MapLibre LogoControl but instead can use any image URL and\n * any link URL. By default this is using MapTiler logo and URL.\n */\nexport class MaptilerLogoControl extends LogoControl {\n declare _compact: boolean;\n private logoURL = \"\";\n private linkURL = \"\";\n\n constructor(options: LogoOptions = {}) {\n super(options);\n\n this.logoURL = options.logoURL ?? defaults.maptilerLogoURL;\n this.linkURL = options.linkURL ?? defaults.maptilerURL;\n }\n\n onAdd(map: Map): HTMLElement {\n this._map = map;\n this._compact = this.options.compact ?? false;\n this._container = window.document.createElement(\"div\");\n this._container.className = \"maplibregl-ctrl\";\n const anchor = window.document.createElement(\"a\");\n anchor.style.backgroundRepeat = \"no-repeat\";\n anchor.style.cursor = \"pointer\";\n anchor.style.display = \"block\";\n anchor.style.height = \"23px\";\n anchor.style.margin = \"0 0 -4px -4px\";\n anchor.style.overflow = \"hidden\";\n anchor.style.width = \"88px\";\n anchor.style.backgroundImage = `url(${this.logoURL})`;\n anchor.style.backgroundSize = \"100px 30px\";\n anchor.style.width = \"100px\";\n anchor.style.height = \"30px\";\n\n anchor.target = \"_blank\";\n anchor.rel = \"noopener\";\n anchor.href = this.linkURL;\n anchor.setAttribute(\"aria-label\", \"MapTiler logo\");\n anchor.setAttribute(\"rel\", \"noopener\");\n this._container.appendChild(anchor);\n this._container.style.display = \"block\";\n\n this._map.on(\"resize\", this._updateCompact);\n this._updateCompact();\n\n return this._container;\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport type {\n RequestParameters,\n ResourceType,\n RequestTransformFunction,\n} from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { config } from \"./config\";\nimport { MAPTILER_SESSION_ID } from \"./config\";\n\nexport function enableRTL() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (maplibregl.getRTLTextPluginStatus() === \"unavailable\") {\n maplibregl.setRTLTextPlugin(\n defaults.rtlPluginURL,\n (err?: Error | undefined) => {\n if (err) console.error(err);\n },\n true, // Lazy load the plugin\n );\n }\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/util.ts#L223\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function bindAll(fns: Array<string>, context: any): void {\n fns.forEach((fn) => {\n if (typeof context[fn] !== \"function\") return;\n context[fn] = context[fn].bind(context);\n });\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L22\nexport function DOMcreate<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n container?: HTMLElement,\n): HTMLElementTagNameMap[K] {\n const el = window.document.createElement(tagName);\n if (className !== undefined) el.className = className;\n if (container) container.appendChild(el);\n return el;\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L111\nexport function DOMremove(node: HTMLElement) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\n\n/**\n * This function is meant to be used as transformRequest by any Map instance created.\n * It adds the session ID as well as the MapTiler Cloud key from the config to all the requests\n * performed on MapTiler Cloud servers.\n */\nexport function maptilerCloudTransformRequest(\n url: string,\n // keep incase we need it in the future\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _resourceType?: ResourceType,\n): RequestParameters {\n let reqUrl = null;\n\n try {\n // The URL is expected to be absolute.\n // Yet, if it's local we just return it without assuming a 'base' url (in the URL constructor)\n // and we let the URL be locally resolved with a potential base path.\n reqUrl = new URL(url);\n } catch (e) {\n return {\n url,\n };\n }\n\n if (reqUrl.host === defaults.maptilerApiHost) {\n if (!reqUrl.searchParams.has(\"key\")) {\n reqUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n if (config.session) {\n reqUrl.searchParams.append(\"mtsid\", MAPTILER_SESSION_ID);\n }\n }\n\n return {\n url: reqUrl.href,\n };\n}\n\n/**\n * This combines a user-defined tranformRequest function (optionnal)\n * with the MapTiler Cloud-specific one: maptilerCloudTransformRequest\n */\nexport function combineTransformRequest(\n userDefinedRTF?: RequestTransformFunction,\n): RequestTransformFunction {\n return function (\n url: string,\n resourceType?: ResourceType,\n ): RequestParameters {\n if (userDefinedRTF !== undefined) {\n const rp = userDefinedRTF(url, resourceType);\n const rp2 = maptilerCloudTransformRequest(rp?.url ?? \"\");\n\n return {\n ...rp,\n ...rp2,\n };\n } else {\n return maptilerCloudTransformRequest(url);\n }\n };\n}\n\n/**\n * Generate a random string. Handy to create random IDs\n */\nexport function generateRandomString(): string {\n return Math.random().toString(36).substring(2);\n}\n\n/**\n * Check if a given string is in a uuid format\n */\nexport function isUUID(s: string): boolean {\n // Regular expression to check if string is a valid UUID\n const regexExp =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n return regexExp.test(s);\n}\n\n/**\n * Attempt a JSON parse of a string but does not throw if the string is not valid JSON, returns `null` instead.\n */\nexport function jsonParseNoThrow<T>(doc: string): T | null {\n try {\n return JSON.parse(doc);\n } catch (e) {\n // pass\n }\n\n return null;\n}\n\n/**\n * Simple function to check if an object is a GeoJSON\n */\nexport function isValidGeoJSON<T>(obj: T & { type: string }): boolean {\n if (typeof obj !== \"object\" || Array.isArray(obj) || obj === null)\n return false;\n if (!(\"type\" in obj)) return false;\n\n const validTypes = [\n \"Feature\",\n \"FeatureCollection\",\n \"Point\",\n \"MultiPoint\",\n \"LineString\",\n \"MultiLineString\",\n \"Polygon\",\n \"MultiPolygon\",\n \"GeometryCollection\",\n ];\n\n if (validTypes.includes(obj.type)) return true;\n return false;\n}\n","import {\n MapStyle,\n ReferenceMapStyle,\n MapStyleVariant,\n mapStylePresetList,\n expandMapStyle,\n} from \"@maptiler/client\";\n\nexport function styleToStyle(\n style:\n | string\n | ReferenceMapStyle\n | MapStyleVariant\n | maplibregl.StyleSpecification\n | null\n | undefined,\n): string | maplibregl.StyleSpecification {\n if (!style) {\n return MapStyle[\n mapStylePresetList[0].referenceStyleID as keyof typeof MapStyle\n ]\n .getDefaultVariant()\n .getExpandedStyleURL();\n }\n\n // If the provided style is a shorthand (eg. \"streets-v2\") or a full style URL\n if (typeof style === \"string\" || style instanceof String) {\n if (!style.startsWith(\"http\") && style.toLowerCase().includes(\".json\")) {\n // If a style does not start by http but still contains the extension \".json\"\n // we assume it's a relative path to a style json file\n return style as string;\n } else {\n return expandMapStyle(style);\n }\n }\n\n if (style instanceof MapStyleVariant) {\n return style.getExpandedStyleURL();\n }\n\n if (style instanceof ReferenceMapStyle) {\n return (style.getDefaultVariant() as MapStyleVariant).getExpandedStyleURL();\n }\n\n return style as maplibregl.StyleSpecification;\n}\n","import { bindAll, DOMcreate, DOMremove } from \"./tools\";\n\nimport type { Map } from \"./Map\";\nimport type { IControl } from \"maplibre-gl\";\n\n/**\n * A `MaptilerTerrainControl` control adds a button to turn terrain on and off\n * by triggering the terrain logic that is already deployed in the Map object.\n */\nexport class MaptilerTerrainControl implements IControl {\n _map!: Map;\n _container!: HTMLElement;\n _terrainButton!: HTMLButtonElement;\n\n constructor() {\n bindAll([\"_toggleTerrain\", \"_updateTerrainIcon\"], this);\n }\n\n onAdd(map: Map): HTMLElement {\n this._map = map;\n this._container = DOMcreate(\"div\", \"maplibregl-ctrl maplibregl-ctrl-group\");\n this._terrainButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-terrain\",\n this._container,\n );\n DOMcreate(\"span\", \"maplibregl-ctrl-icon\", this._terrainButton).setAttribute(\n \"aria-hidden\",\n \"true\",\n );\n this._terrainButton.type = \"button\";\n this._terrainButton.addEventListener(\"click\", this._toggleTerrain);\n\n this._updateTerrainIcon();\n this._map.on(\"terrain\", this._updateTerrainIcon);\n return this._container;\n }\n\n onRemove(): void {\n DOMremove(this._container);\n this._map.off(\"terrain\", this._updateTerrainIcon);\n // @ts-expect-error: map will only be undefined on remove\n this._map = undefined;\n }\n\n _toggleTerrain(): void {\n if (this._map.hasTerrain()) {\n this._map.disableTerrain();\n } else {\n this._map.enableTerrain();\n }\n\n this._updateTerrainIcon();\n }\n\n _updateTerrainIcon(): void {\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain\");\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain-enabled\");\n // if (this._map.terrain) {\n if (this._map.hasTerrain()) {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain-enabled\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.disableTerrain\",\n );\n } else {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.enableTerrain\",\n );\n }\n }\n}\n","/**\n * This is an extension of MapLibre NavigationControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class NavigationControl extends maplibregl.NavigationControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import { NavigationControl } from \"./NavigationControl\";\n\ntype HTMLButtonElementPlus = HTMLButtonElement & {\n clickFunction: (e?: Event) => unknown;\n};\n\nexport class MaptilerNavigationControl extends NavigationControl {\n constructor() {\n super({\n showCompass: true,\n showZoom: true,\n visualizePitch: true,\n });\n\n // Removing the default click event\n this._compass.removeEventListener(\n \"click\",\n (this._compass as HTMLButtonElementPlus).clickFunction,\n );\n\n // Adding custom click event\n this._compass.addEventListener(\"click\", (e) => {\n {\n const currentPitch = this._map.getPitch();\n if (currentPitch === 0) {\n this._map.easeTo({ pitch: Math.min(this._map.getMaxPitch(), 80) });\n } else {\n if (this.options.visualizePitch) {\n this._map.resetNorthPitch({}, { originalEvent: e });\n } else {\n this._map.resetNorth({}, { originalEvent: e });\n }\n }\n }\n });\n }\n\n /**\n * Overloading: the button now stores its click callback so that we can later on delete it and replace it\n */\n _createButton(\n className: string,\n fn: (e?: Event) => unknown,\n ): HTMLButtonElementPlus {\n const button = super._createButton(className, fn) as HTMLButtonElementPlus;\n button.clickFunction = fn;\n return button;\n }\n\n /**\n * Overloading: Limit how flat the compass icon can get\n */\n _rotateCompassArrow = () => {\n const rotate = this.options.visualizePitch\n ? `scale(${Math.min(\n 1.5,\n 1 /\n Math.pow(\n Math.cos(this._map.transform.pitch * (Math.PI / 180)),\n 0.5,\n ),\n )}) rotateX(${Math.min(70, this._map.transform.pitch)}deg) rotateZ(${\n this._map.transform.angle * (180 / Math.PI)\n }deg)`\n : `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;\n\n this._compassIcon.style.transform = rotate;\n };\n}\n","/**\n * This is an extension of MapLibre GeolocateControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeolocateControl extends maplibregl.GeolocateControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import type { LngLatLike, MapLibreEvent } from \"maplibre-gl\";\nimport maplibregl from \"maplibre-gl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { DOMcreate } from \"./tools\";\n\nconst Marker = maplibregl.Marker;\nconst LngLat = maplibregl.LngLat;\nconst LngLatBounds = maplibregl.LngLatBounds;\n\ntype MoveEndEvent = MapLibreEvent<\n MouseEvent | TouchEvent | WheelEvent | undefined\n> & { geolocateSource?: boolean };\n\n/**\n * The MaptilerGeolocateControl is an extension of the original GeolocateControl\n * with a few changes. In this version, the active mode persists as long as the\n * location is still centered. This means it's robust to rotation, pitch and zoom.\n *\n */\nexport class MaptilerGeolocateControl extends GeolocateControl {\n private lastUpdatedCenter = new LngLat(0, 0);\n\n /**\n * Update the camera location to center on the current position\n *\n * @param {Position} position the Geolocation API Position\n * @private\n */\n _updateCamera = (position: GeolocationPosition) => {\n const center = new LngLat(\n position.coords.longitude,\n position.coords.latitude,\n );\n const radius = position.coords.accuracy;\n const bearing = this._map.getBearing();\n const options = {\n bearing,\n ...this.options.fitBoundsOptions,\n linear: true,\n };\n\n const currentMapZoom = this._map.getZoom();\n\n if (currentMapZoom > (this.options?.fitBoundsOptions?.maxZoom ?? 30)) {\n options.zoom = currentMapZoom;\n }\n\n this._map.fitBounds(LngLatBounds.fromLngLat(center, radius), options, {\n geolocateSource: true, // tag this camera change so it won't cause the control to change to background state\n });\n\n let hasFittingBeenDisrupted = false;\n\n const flagFittingDisruption = () => {\n hasFittingBeenDisrupted = true;\n };\n\n this._map.once(\"click\", flagFittingDisruption);\n this._map.once(\"dblclick\", flagFittingDisruption);\n this._map.once(\"dragstart\", flagFittingDisruption);\n this._map.once(\"mousedown\", flagFittingDisruption);\n this._map.once(\"touchstart\", flagFittingDisruption);\n this._map.once(\"wheel\", flagFittingDisruption);\n\n this._map.once(\"moveend\", () => {\n // Removing the events if not used\n this._map.off(\"click\", flagFittingDisruption);\n this._map.off(\"dblclick\", flagFittingDisruption);\n this._map.off(\"dragstart\", flagFittingDisruption);\n this._map.off(\"mousedown\", flagFittingDisruption);\n this._map.off(\"touchstart\", flagFittingDisruption);\n this._map.off(\"wheel\", flagFittingDisruption);\n\n if (hasFittingBeenDisrupted) {\n return;\n }\n\n this.lastUpdatedCenter = this._map.getCenter();\n });\n };\n\n _setupUI = (supported: boolean) => {\n this.lastUpdatedCenter = this._map.getCenter();\n\n this._container.addEventListener(\"contextmenu\", (e: MouseEvent) =>\n e.preventDefault(),\n );\n this._geolocateButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-geolocate\",\n this._container,\n );\n DOMcreate(\n \"span\",\n \"maplibregl-ctrl-icon\",\n this._geolocateButton,\n ).setAttribute(\"aria-hidden\", \"true\");\n this._geolocateButton.type = \"button\";\n\n if (supported === false) {\n // warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');\n const title = this._map._getUIString(\n \"GeolocateControl.LocationNotAvailable\",\n );\n this._geolocateButton.disabled = true;\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n } else {\n const title = this._map._getUIString(\"GeolocateControl.FindMyLocation\");\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n }\n\n if (this.options.trackUserLocation) {\n this._geolocateButton.setAttribute(\"aria-pressed\", \"false\");\n this._watchState = \"OFF\";\n }\n\n // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map\n if (this.options.showUserLocation) {\n this._dotElement = DOMcreate(\"div\", \"maplibregl-user-location-dot\");\n this._userLocationDotMarker = new Marker({ element: this._dotElement });\n\n this._circleElement = DOMcreate(\n \"div\",\n \"maplibregl-user-location-accuracy-circle\",\n );\n this._accuracyCircleMarker = new Marker({\n element: this._circleElement,\n pitchAlignment: \"map\",\n });\n\n if (this.options.trackUserLocation) this._watchState = \"OFF\";\n\n this._map.on(\"move\", this._onZoom);\n }\n\n this._geolocateButton.addEventListener(\"click\", this.trigger.bind(this));\n\n this._setup = true;\n\n // when the camera is changed (and it's not as a result of the Geolocation Control) change\n // the watch mode to background watch, so that the marker is updated but not the camera.\n // Addition: Yet the status change does not occur if the ditance it has moved to is less than\n // one meter from the last auto-updated position. This is to guarrantee that if the move\n // is a zoom, rotation or pitch (where the center stays the same) then we can keep the ACTIVE_LOCK\n // mode ON.\n if (this.options.trackUserLocation) {\n this._map.on(\"moveend\", (event: MoveEndEvent) => {\n const fromResize =\n event.originalEvent && event.originalEvent.type === \"resize\";\n const movingDistance = this.lastUpdatedCenter.distanceTo(\n this._map.getCenter(),\n );\n\n if (\n !event.geolocateSource &&\n this._watchState === \"ACTIVE_LOCK\" &&\n !fromResize &&\n movingDistance > 1\n ) {\n this._watchState = \"BACKGROUND\";\n this._geolocateButton.classList.add(\n \"maplibregl-ctrl-geolocate-background\",\n );\n this._geolocateButton.classList.remove(\n \"maplibregl-ctrl-geolocate-active\",\n );\n\n this.fire(new Event(\"trackuserlocationend\"));\n }\n });\n }\n };\n\n _updateCircleRadius() {\n if (\n this._watchState !== \"BACKGROUND\" &&\n this._watchState !== \"ACTIVE_LOCK\"\n ) {\n return;\n }\n\n const lastKnownLocation: LngLatLike = [\n this._lastKnownPosition.coords.longitude,\n this._lastKnownPosition.coords.latitude,\n ];\n\n const projectedLocation = this._map.project(lastKnownLocation);\n const a = this._map.unproject([projectedLocation.x, projectedLocation.y]);\n const b = this._map.unproject([\n projectedLocation.x + 20,\n projectedLocation.y,\n ]);\n const metersPerPixel = a.distanceTo(b) / 20;\n\n const circleDiameter = Math.ceil((2.0 * this._accuracy) / metersPerPixel);\n this._circleElement.style.width = `${circleDiameter}px`;\n this._circleElement.style.height = `${circleDiameter}px`;\n }\n\n _onZoom = () => {\n if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n this._updateCircleRadius();\n }\n };\n}\n","/**\n * This is an extension of MapLibre AttributionControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class AttributionControl extends maplibregl.AttributionControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ScaleControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ScaleControl extends maplibregl.ScaleControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre FullscreenControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class FullscreenControl extends maplibregl.FullscreenControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension adds support for adding a minimap to one of the map's control containers.\n */\n\nimport { Map } from \"./Map\";\nimport { DOMcreate, DOMremove } from \"./tools\";\n\nimport type {\n ControlPosition,\n CustomLayerInterface,\n FillLayerSpecification,\n FilterSpecification,\n GeoJSONSource,\n IControl,\n LayerSpecification,\n LineLayerSpecification,\n SourceSpecification,\n StyleOptions,\n StyleSetterOptions,\n StyleSpecification,\n StyleSwapOptions,\n} from \"maplibre-gl\";\nimport type { MapOptions } from \"./Map\";\nimport type { MapStyleVariant, ReferenceMapStyle } from \"@maptiler/client\";\n\nexport interface ParentRect {\n lineLayout: LineLayerSpecification[\"layout\"];\n linePaint: LineLayerSpecification[\"paint\"];\n fillPaint: FillLayerSpecification[\"paint\"];\n}\n\nexport interface MinimapOptionsInput {\n /**\n * Style of the map. Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n */\n style?: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string;\n\n /**\n * Set the zoom difference between the parent and the minimap\n * If the parent is zoomed to 10 and the minimap is zoomed to 8, the zoomAdjust should be 2\n * Default: -4\n */\n zoomAdjust?: number;\n\n /** Set a zoom of the minimap and don't allow any future changes */\n lockZoom?: number;\n\n /** Adjust the pitch only if the user requests */\n pitchAdjust?: boolean;\n\n /** Set CSS properties of the container using object key-values */\n containerStyle?: Record<string, string>;\n\n /** Set the position of the minimap at either \"top-left\", \"top-right\", \"bottom-left\", or \"bottom-right\" */\n position?: ControlPosition;\n\n /** Set the parentRect fill and/or line options */\n parentRect?: ParentRect;\n}\n\nexport interface MinimapOptions extends MapOptions {\n zoomAdjust: number;\n pitchAdjust: boolean;\n containerStyle: Record<string, string>;\n parentRect?: ParentRect;\n}\n\nexport default class Minimap implements IControl {\n #options: MinimapOptions;\n map!: Map;\n #parentMap!: Map;\n #container!: HTMLElement;\n #canvasContainer!: HTMLElement;\n #parentRect?: GeoJSON.Feature<GeoJSON.Polygon>;\n #differentStyle = false;\n #desync?: () => void;\n constructor(options: MinimapOptionsInput, mapOptions: MapOptions) {\n // check if the style is different\n if (options.style !== undefined) this.#differentStyle = true;\n // set options\n this.#options = {\n // set defaults\n zoomAdjust: -4,\n position: \"top-right\",\n // inherit map options\n ...mapOptions,\n // override any lingering control options\n forceNoAttributionControl: true,\n attributionControl: false,\n navigationControl: false,\n geolocateControl: false,\n maptilerLogo: false,\n minimap: false,\n hash: false,\n pitchAdjust: false,\n // override map options with new user defined minimap options\n ...options,\n containerStyle: {\n border: \"1px solid #000\",\n width: \"400px\",\n height: \"300px\",\n ...(options.containerStyle ?? {}),\n },\n };\n if (options.lockZoom !== undefined) {\n this.#options.minZoom = options.lockZoom;\n this.#options.maxZoom = options.lockZoom;\n }\n }\n\n setStyle(\n style:\n | null\n | ReferenceMapStyle\n | MapStyleVariant\n | StyleSpecification\n | string,\n options?: StyleSwapOptions & StyleOptions,\n ): void {\n if (!this.#differentStyle) this.map.setStyle(style, options);\n this.#setParentBounds();\n }\n\n addLayer(\n layer:\n | (LayerSpecification & {\n source?: string | SourceSpecification;\n })\n | CustomLayerInterface,\n beforeId?: string,\n ): Map {\n if (!this.#differentStyle) this.map.addLayer(layer, beforeId);\n this.#setParentBounds();\n return this.map;\n }\n\n moveLayer(id: string, beforeId?: string): Map {\n if (!this.#differentStyle) this.map.moveLayer(id, beforeId);\n this.#setParentBounds();\n return this.map;\n }\n\n removeLayer(id: string): this {\n if (!this.#differentStyle) this.map.removeLayer(id);\n this.#setParentBounds();\n return this;\n }\n\n setLayerZoomRange(layerId: string, minzoom: number, maxzoom: number): this {\n if (!this.#differentStyle)\n this.map.setLayerZoomRange(layerId, minzoom, maxzoom);\n this.#setParentBounds();\n return this;\n }\n\n setFilter(\n layerId: string,\n filter?: FilterSpecification | null,\n options?: StyleSetterOptions,\n ): this {\n if (!this.#differentStyle) this.map.setFilter(layerId, filter, options);\n this.#setParentBounds();\n return this;\n }\n\n setPaintProperty(\n layerId: string,\n name: string,\n // maplibre controlled types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n options?: StyleSetterOptions,\n ): this {\n if (!this.#differentStyle)\n this.map.setPaintProperty(layerId, name, value, options);\n this.#setParentBounds();\n return this;\n }\n\n setLayoutProperty(\n layerId: string,\n name: string,\n // maplibre controlled types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n options?: StyleSetterOptions,\n ): this {\n if (!this.#differentStyle)\n this.map.setLayoutProperty(layerId, name, value, options);\n this.#setParentBounds();\n return this;\n }\n\n setGlyphs(glyphsUrl: string | null, options?: StyleSetterOptions): this {\n if (!this.#differentStyle) this.map.setGlyphs(glyphsUrl, options);\n this.#setParentBounds();\n return this;\n }\n\n onAdd(parentMap: Map): HTMLElement {\n this.#parentMap = parentMap;\n //prep the container\n this.#container = DOMcreate(\"div\", \"maplibregl-ctrl maplibregl-ctrl-group\");\n // adjust styling\n for (const [key, value] of Object.entries(this.#options.containerStyle)) {\n this.#container.style.setProperty(key, value);\n }\n this.#options.container = this.#container;\n this.#options.zoom = parentMap.getZoom() + this.#options.zoomAdjust ?? -4;\n this.map = new Map(this.#options);\n\n // NOTE: For some reason the DOM doesn't properly update it's size in time\n // for the minimap to convey it's size to the canvas.\n this.map.once(\"style.load\", () => {\n this.map.resize();\n });\n\n // set options\n this.map.once(\"load\", () => {\n this.#addParentRect(this.#options.parentRect);\n this.#desync = this.#syncMaps();\n });\n\n return this.#container;\n }\n\n onRemove(): void {\n this.#desync?.();\n DOMremove(this.#container);\n }\n\n #addParentRect(rect?: ParentRect): void {\n if (\n rect === undefined ||\n (rect.linePaint === undefined && rect.fillPaint === undefined)\n ) {\n return;\n }\n this.#parentRect = {\n type: \"Feature\",\n properties: {\n name: \"parentRect\",\n },\n geometry: {\n type: \"Polygon\",\n coordinates: [[[], [], [], [], []]],\n },\n };\n\n this.map.addSource(\"parentRect\", {\n type: \"geojson\",\n data: this.#parentRect,\n });\n if (rect.lineLayout !== undefined || rect.linePaint !== undefined) {\n this.map.addLayer({\n id: \"parentRectOutline\",\n type: \"line\",\n source: \"parentRect\",\n layout: {\n ...rect.lineLayout,\n },\n paint: {\n \"line-color\": \"#FFF\",\n \"line-width\": 1,\n \"line-opacity\": 0.85,\n ...rect.linePaint,\n },\n });\n }\n if (rect.fillPaint !== undefined) {\n this.map.addLayer({\n id: \"parentRectFill\",\n type: \"fill\",\n source: \"parentRect\",\n layout: {},\n paint: {\n \"fill-color\": \"#08F\",\n \"fill-opacity\": 0.135,\n ...rect.fillPaint,\n },\n });\n }\n\n this.#setParentBounds();\n }\n\n #setParentBounds() {\n if (this.#parentRect === undefined) return;\n\n const { devicePixelRatio } = window;\n const canvas = this.#parentMap.getCanvas();\n const width = canvas.width / devicePixelRatio;\n const height = canvas.height / devicePixelRatio;\n\n // Get coordinates for all four corners\n const unproject = this.#parentMap.unproject.bind(this.#parentMap);\n const northWest = unproject([0, 0]);\n const northEast = unproject([width, 0]);\n const southWest = unproject([0, height]);\n const southEast = unproject([width, height]);\n\n this.#parentRect.geometry.coordinates = [\n [\n southWest.toArray(),\n southEast.toArray(),\n northEast.toArray(),\n northWest.toArray(),\n southWest.toArray(),\n ],\n ];\n\n const source = this.map.getSource(\"parentRect\") as GeoJSONSource;\n source.setData(this.#parentRect);\n }\n\n #syncMaps(): () => void {\n const { pitchAdjust } = this.#options;\n // syncing callbacks\n const parentCallback = () => {\n sync(\"parent\");\n };\n const minimapCallback = () => {\n sync(\"minimap\");\n };\n\n // on off functions\n const on = () => {\n this.#parentMap.on(\"move\", parentCallback);\n this.map.on(\"move\", minimapCallback);\n };\n const off = () => {\n this.#parentMap.off(\"move\", parentCallback);\n this.map.off(\"move\", minimapCallback);\n };\n\n // When one map moves, we turn off the movement listeners\n // on all the maps, move it, then turn the listeners on again\n const sync = (which: \"parent\" | \"minimap\") => {\n // OFF\n off();\n\n // MOVE\n const from = which === \"parent\" ? this.#parentMap : this.map;\n const to = which === \"parent\" ? this.map : this.#parentMap;\n const center = from.getCenter();\n const zoom =\n from.getZoom() +\n (this.#options.zoomAdjust ?? -4) * (which === \"parent\" ? 1 : -1);\n const bearing = from.getBearing();\n const pitch = from.getPitch();\n to.jumpTo({\n center,\n zoom,\n bearing,\n pitch: pitchAdjust ? pitch : 0,\n });\n // update parent rect\n this.#setParentBounds();\n\n // ON\n on();\n };\n\n on();\n // return a desync function\n return () => {\n off();\n };\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { Base64 } from \"js-base64\";\nimport type {\n StyleSpecification,\n MapOptions as MapOptionsML,\n ControlPosition,\n StyleSwapOptions,\n StyleOptions,\n MapDataEvent,\n Tile,\n RasterDEMSourceSpecification,\n RequestTransformFunction,\n Source,\n LayerSpecification,\n SourceSpecification,\n CustomLayerInterface,\n FilterSpecification,\n StyleSetterOptions,\n ExpressionSpecification,\n} from \"maplibre-gl\";\nimport { ReferenceMapStyle, MapStyleVariant } from \"@maptiler/client\";\nimport { config, MAPTILER_SESSION_ID, SdkConfig } from \"./config\";\nimport { defaults } from \"./defaults\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { combineTransformRequest, enableRTL } from \"./tools\";\nimport {\n getBrowserLanguage,\n isLanguageSupported,\n Language,\n LanguageString,\n} from \"./language\";\nimport { styleToStyle } from \"./mapstyle\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\nimport { geolocation } from \"@maptiler/client\";\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\n\nimport Minimap from \"./Minimap\";\nimport type { MinimapOptionsInput } from \"./Minimap\";\n\nexport type LoadWithTerrainEvent = {\n type: \"loadWithTerrain\";\n target: Map;\n terrain: {\n source: string;\n exaggeration: number;\n };\n};\n\nexport const GeolocationType: {\n POINT: \"POINT\";\n COUNTRY: \"COUNTRY\";\n} = {\n POINT: \"POINT\",\n COUNTRY: \"COUNTRY\",\n} as const;\n\ntype MapTerrainDataEvent = MapDataEvent & {\n isSourceLoaded: boolean;\n tile: Tile;\n sourceId: string;\n source: RasterDEMSourceSpecification;\n};\n\n/**\n * Options to provide to the `Map` constructor\n */\nexport type MapOptions = Omit<MapOptionsML, \"style\" | \"maplibreLogo\"> & {\n /**\n * Style of the map. Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n */\n style?: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string;\n\n /**\n * Define the language of the map. This can be done directly with a language ISO code (eg. \"en\")\n * or with a built-in shorthand (eg. Language.ENGLISH).\n * Note that this is equivalent to setting the `config.primaryLanguage` and will overwrite it.\n */\n language?: LanguageString;\n\n /**\n * Define the MapTiler Cloud API key to be used. This is strictly equivalent to setting\n * `config.apiKey` and will overwrite it.\n */\n apiKey?: string;\n\n /**\n * Shows or hides the MapTiler logo in the bottom left corner.\n *\n * For paid plans:\n * - `true` shows MapTiler logo\n * - `false` hodes MapTiler logo\n * - default: `false` (hide)\n *\n * For free plans: MapTiler logo always shows, regardless of the value.\n */\n maptilerLogo?: boolean;\n\n /**\n * Enables 3D terrain if `true`. (default: `false`)\n */\n terrain?: boolean;\n\n /**\n * Exaggeration factor of the terrain. (default: `1`, no exaggeration)\n */\n terrainExaggeration?: number;\n\n /**\n * Show the navigation control. (default: `true`, will hide if `false`)\n */\n navigationControl?: boolean | ControlPosition;\n\n /**\n * Show the terrain control. (default: `false`, will show if `true`)\n */\n terrainControl?: boolean | ControlPosition;\n\n /**\n * Show the geolocate control. (default: `true`, will hide if `false`)\n */\n geolocateControl?: boolean | ControlPosition;\n\n /**\n * Show the scale control. (default: `false`, will show if `true`)\n */\n scaleControl?: boolean | ControlPosition;\n\n /**\n * Show the full screen control. (default: `false`, will show if `true`)\n */\n fullscreenControl?: boolean | ControlPosition;\n\n /**\n * Display a minimap in a user defined corner of the map. (default: `bottom-left` corner)\n * If set to true, the map will assume it is a minimap and forego the attribution control.\n */\n minimap?: boolean | ControlPosition | MinimapOptionsInput;\n\n /**\n * attributionControl\n */\n forceNoAttributionControl?: boolean;\n\n /**\n * Method to position the map at a given geolocation. Only if:\n * - `hash` is `false`\n * - `center` is not provided\n *\n * If the value is `true` of `\"POINT\"` (given by `GeolocationType.POINT`) then the positionning uses the MapTiler Cloud\n * Geolocation to find the non-GPS location point.\n * The zoom level can be provided in the `Map` constructor with the `zoom` option or will be `13` if not provided.\n *\n * If the value is `\"COUNTRY\"` (given by `GeolocationType.COUNTRY`) then the map is centered around the bounding box of the country.\n * In this case, the `zoom` option will be ignored.\n *\n * If the value is `false`, no geolocation is performed and the map centering and zooming depends on other options or on\n * the built-in defaults.\n *\n * If this option is non-false and the options `center` is also provided, then `center` prevails.\n *\n * Default: `false`\n */\n geolocate?: (typeof GeolocationType)[keyof typeof GeolocationType] | boolean;\n};\n\n/**\n * The Map class can be instanciated to display a map in a `<div>`\n */\nexport class Map extends maplibregl.Map {\n private isTerrainEnabled = false;\n private terrainExaggeration = 1;\n private primaryLanguage: LanguageString;\n private terrainGrowing = false;\n private terrainFlattening = false;\n private minimap?: Minimap;\n private forceLanguageUpdate: boolean;\n private languageAlwaysBeenStyle: boolean;\n\n constructor(options: MapOptions) {\n if (options.apiKey) {\n config.apiKey = options.apiKey;\n }\n\n const style = styleToStyle(options.style);\n const hashPreConstructor = location.hash;\n\n if (!config.apiKey) {\n console.warn(\n \"MapTiler Cloud API key is not set. Visit https://maptiler.com and try Cloud for free!\",\n );\n }\n\n // calling the map constructor with full length style\n super({\n ...options,\n style,\n maplibreLogo: false,\n transformRequest: combineTransformRequest(options.transformRequest),\n });\n\n this.primaryLanguage = options.language ?? config.primaryLanguage;\n this.forceLanguageUpdate =\n this.primaryLanguage === Language.STYLE ||\n this.primaryLanguage === Language.STYLE_LOCK\n ? false\n : true;\n this.languageAlwaysBeenStyle = this.primaryLanguage === Language.STYLE;\n this.terrainExaggeration =\n options.terrainExaggeration ?? this.terrainExaggeration;\n\n // Map centering and geolocation\n this.once(\"styledata\", async () => {\n // Not using geolocation centering if...\n\n // the geolcoate option is not provided or is falsy\n if (!options.geolocate) {\n return;\n }\n\n // ... a center is provided in options\n if (options.center) {\n return;\n }\n\n // ... the hash option is enabled and a hash is present in the URL\n if (options.hash && !!hashPreConstructor) {\n return;\n }\n\n // If the geolocation is set to COUNTRY:\n try {\n if (options.geolocate === GeolocationType.COUNTRY) {\n await this.fitToIpBounds();\n return;\n }\n } catch (e) {\n // not raising\n console.warn((e as Error).message);\n }\n\n // As a fallback, we want to center the map on the visitor. First with IP geolocation...\n let ipLocatedCameraHash: string;\n try {\n await this.centerOnIpPoint(options.zoom);\n ipLocatedCameraHash = this.getCameraHash();\n } catch (e) {\n // not raising\n console.warn((e as Error).message);\n }\n\n // A more precise localization\n\n // This more advanced localization is commented out because the easeTo animation\n // triggers an error if the terrain grow is enabled (due to being nable to project the center while moving)\n\n // Then, the get a more precise location, we rely on the browser location, but only if it was already granted\n // before (we don't want to ask wih a popup at launch time)\n const locationResult = await navigator.permissions.query({\n name: \"geolocation\",\n });\n\n if (locationResult.state === \"granted\") {\n navigator.geolocation.getCurrentPosition(\n // success callback\n (data) => {\n // If the user has already moved since the ip location, then we no longer want to move the center\n if (ipLocatedCameraHash !== this.getCameraHash()) {\n return;\n }\n\n if (this.terrain) {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n } else {\n this.once(\"terrain\", () => {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n });\n }\n },\n\n // error callback\n null,\n\n // options\n {\n maximumAge: 24 * 3600 * 1000, // a day in millisec\n timeout: 5000, // milliseconds\n enableHighAccuracy: false,\n },\n );\n }\n });\n\n // If the config includes language changing, we must update the map language\n this.on(\"styledata\", () => {\n this.setPrimaryLanguage(this.primaryLanguage);\n });\n\n // this even is in charge of reaplying the terrain elevation after the\n // style has changed because depending on the src/tgt style,\n // the style logic is not always able to resolve the application of terrain\n this.on(\"styledata\", () => {\n // the styling resolver did no manage to reaply the terrain,\n // so let's reload it\n if (this.getTerrain() === null && this.isTerrainEnabled) {\n this.enableTerrain(this.terrainExaggeration);\n }\n });\n\n // load the Right-to-Left text plugin (will happen only once)\n this.once(\"load\", async () => {\n enableRTL();\n });\n\n // Update logo and attibution\n this.once(\"load\", async () => {\n let tileJsonContent = { logo: null };\n\n try {\n const possibleSources = Object.keys(this.style.sourceCaches)\n .map((sourceName) => this.getSource(sourceName))\n .filter(\n (s: Source | undefined) =>\n s &&\n \"url\" in s &&\n typeof s.url === \"string\" &&\n s?.url.includes(\"tiles.json\"),\n );\n\n const styleUrl = new URL(\n (possibleSources[0] as maplibregl.VectorTileSource).url,\n );\n\n if (!styleUrl.searchParams.has(\"key\")) {\n styleUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n const tileJsonRes = await fetch(styleUrl.href);\n tileJsonContent = await tileJsonRes.json();\n } catch (e) {\n // No tiles.json found (should not happen on maintained styles)\n }\n\n // The attribution and logo must show when required\n if (options.forceNoAttributionControl !== true) {\n if (\"logo\" in tileJsonContent && tileJsonContent.logo) {\n const logoURL: string = tileJsonContent.logo;\n\n this.addControl(\n new MaptilerLogoControl({ logoURL }),\n options.logoPosition,\n );\n\n // if attribution in option is `false` but the the logo shows up in the tileJson, then the attribution must show anyways\n if (options.attributionControl === false) {\n this.addControl(\n new AttributionControl({\n customAttribution: options.customAttribution,\n }),\n );\n }\n } else if (options.maptilerLogo) {\n this.addControl(new MaptilerLogoControl(), options.logoPosition);\n }\n }\n\n // the other controls at init time but be after\n // (due to the async nature of logo control)\n\n // By default, no scale control\n if (options.scaleControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.scaleControl === true || options.scaleControl === undefined\n ? \"bottom-right\"\n : options.scaleControl\n ) as ControlPosition;\n\n const scaleControl = new ScaleControl({ unit: config.unit });\n this.addControl(scaleControl, position);\n config.on(\"unit\", (unit) => {\n scaleControl.setUnit(unit);\n });\n }\n\n if (options.navigationControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.navigationControl === true ||\n options.navigationControl === undefined\n ? \"top-right\"\n : options.navigationControl\n ) as ControlPosition;\n this.addControl(new MaptilerNavigationControl(), position);\n }\n\n if (options.geolocateControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.geolocateControl === true ||\n options.geolocateControl === undefined\n ? \"top-right\"\n : options.geolocateControl\n ) as ControlPosition;\n\n this.addControl(\n // new maplibregl.GeolocateControl({\n new MaptilerGeolocateControl({\n positionOptions: {\n enableHighAccuracy: true,\n maximumAge: 0,\n timeout: 6000 /* 6 sec */,\n },\n fitBoundsOptions: {\n maxZoom: 15,\n },\n trackUserLocation: true,\n showAccuracyCircle: true,\n showUserLocation: true,\n }),\n position,\n );\n }\n\n if (options.terrainControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.terrainControl === true ||\n options.terrainControl === undefined\n ? \"top-right\"\n : options.terrainControl\n ) as ControlPosition;\n this.addControl(new MaptilerTerrainControl(), position);\n }\n\n // By default, no fullscreen control\n if (options.fullscreenControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.fullscreenControl === true ||\n options.fullscreenControl === undefined\n ? \"top-right\"\n : options.fullscreenControl\n ) as ControlPosition;\n\n this.addControl(new FullscreenControl({}), position);\n }\n });\n\n // Creating a custom event: \"loadWithTerrain\"\n // that fires only once when both:\n // - the map has full loaded (corresponds to the the \"load\" event)\n // - the terrain has loaded (corresponds to the \"terrain\" event with terrain beion non-null)\n // This custom event is necessary to wait for when the map is instanciated with `terrain: true`\n // and some animation (flyTo, easeTo) are running from the begining.\n let loadEventTriggered = false;\n let terrainEventTriggered = false;\n let terrainEventData: LoadWithTerrainEvent;\n\n this.once(\"load\", () => {\n loadEventTriggered = true;\n if (terrainEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData);\n }\n });\n\n this.once(\"style.load\", () => {\n const { minimap } = options;\n if (typeof minimap === \"object\") {\n const {\n zoom,\n center,\n style,\n language,\n apiKey,\n maptilerLogo,\n antialias,\n refreshExpiredTiles,\n maxBounds,\n scrollZoom,\n minZoom,\n maxZoom,\n boxZoom,\n locale,\n fadeDuration,\n crossSourceCollisions,\n clickTolerance,\n bounds,\n fitBoundsOptions,\n pixelRatio,\n validateStyle,\n } = options;\n this.minimap = new Minimap(minimap, {\n zoom,\n center,\n style,\n language,\n apiKey,\n container: \"null\",\n maptilerLogo,\n antialias,\n refreshExpiredTiles,\n maxBounds,\n scrollZoom,\n minZoom,\n maxZoom,\n boxZoom,\n locale,\n fadeDuration,\n crossSourceCollisions,\n clickTolerance,\n bounds,\n fitBoundsOptions,\n pixelRatio,\n validateStyle,\n });\n this.addControl(this.minimap, minimap.position ?? \"bottom-left\");\n } else if (minimap === true) {\n this.minimap = new Minimap({}, options);\n this.addControl(this.minimap, \"bottom-left\");\n } else if (minimap !== undefined && minimap !== false) {\n this.minimap = new Minimap({}, options);\n this.addControl(this.minimap, minimap);\n }\n });\n\n const terrainCallback = (evt: LoadWithTerrainEvent) => {\n if (!evt.terrain) return;\n terrainEventTriggered = true;\n terrainEventData = {\n type: \"loadWithTerrain\",\n target: this,\n terrain: evt.terrain,\n };\n this.off(\"terrain\", terrainCallback);\n\n if (loadEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData as LoadWithTerrainEvent);\n }\n };\n\n this.on(\"terrain\", terrainCallback);\n\n // enable 3D terrain if provided in options\n if (options.terrain) {\n this.enableTerrain(\n options.terrainExaggeration ?? this.terrainExaggeration,\n );\n }\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" and returns a Promise to the Map.\n * If _this_ Map instance is already loaded, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"load\" event.\n * @returns\n */\n async onLoadAsync() {\n return new Promise<Map>((resolve) => {\n if (this.loaded()) {\n return resolve(this);\n }\n\n this.once(\"load\", () => {\n resolve(this);\n });\n });\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" as well as with terrain being non-null for the first time\n * and returns a Promise to the Map.\n * If _this_ Map instance is already loaded with terrain, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"loadWithTerrain\" event.\n * @returns\n */\n async onLoadWithTerrainAsync() {\n return new Promise<Map>((resolve) => {\n if (this.loaded() && this.terrain) {\n return resolve(this);\n }\n\n this.once(\"loadWithTerrain\", () => {\n resolve(this);\n });\n });\n }\n\n /**\n * Update the style of the map.\n * Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n */\n override setStyle(\n style:\n | null\n | ReferenceMapStyle\n | MapStyleVariant\n | StyleSpecification\n | string,\n options?: StyleSwapOptions & StyleOptions,\n ): this {\n this.minimap?.setStyle(style);\n this.forceLanguageUpdate = true;\n\n this.once(\"idle\", () => {\n this.forceLanguageUpdate = false;\n });\n\n return super.setStyle(styleToStyle(style), options);\n }\n\n /**\n * Adds a [MapLibre style layer](https://maplibre.org/maplibre-style-spec/layers)\n * to the map's style.\n *\n * A layer defines how data from a specified source will be styled. Read more about layer types\n * and available paint and layout properties in the [MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/layers).\n *\n * @param layer - The layer to add,\n * conforming to either the MapLibre Style Specification's [layer definition](https://maplibre.org/maplibre-style-spec/layers) or,\n * less commonly, the {@link CustomLayerInterface} specification.\n * The MapLibre Style Specification's layer definition is appropriate for most layers.\n *\n * @param beforeId - The ID of an existing layer to insert the new layer before,\n * resulting in the new layer appearing visually beneath the existing layer.\n * If this argument is not specified, the layer will be appended to the end of the layers array\n * and appear visually above all other layers.\n *\n * @returns `this`\n */\n addLayer(\n layer:\n | (LayerSpecification & {\n source?: string | SourceSpecification;\n })\n | CustomLayerInterface,\n beforeId?: string,\n ): this {\n this.minimap?.addLayer(layer, beforeId);\n return super.addLayer(layer, beforeId);\n }\n\n /**\n * Moves a layer to a different z-position.\n *\n * @param id - The ID of the layer to move.\n * @param beforeId - The ID of an existing layer to insert the new layer before. When viewing the map, the `id` layer will appear beneath the `beforeId` layer. If `beforeId` is omitted, the layer will be appended to the end of the layers array and appear above all other layers on the map.\n * @returns `this`\n *\n * @example\n * Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map.\n * ```ts\n * map.moveLayer('polygon', 'country-label');\n * ```\n */\n moveLayer(id: string, beforeId?: string): this {\n this.minimap?.moveLayer(id, beforeId);\n return super.moveLayer(id, beforeId);\n }\n\n /**\n * Removes the layer with the given ID from the map's style.\n *\n * An {@link ErrorEvent} will be fired if the image parameter is invald.\n *\n * @param id - The ID of the layer to remove\n * @returns `this`\n *\n * @example\n * If a layer with ID 'state-data' exists, remove it.\n * ```ts\n * if (map.getLayer('state-data')) map.removeLayer('state-data');\n * ```\n */\n removeLayer(id: string): this {\n this.minimap?.removeLayer(id);\n return super.removeLayer(id);\n }\n\n /**\n * Sets the zoom extent for the specified style layer. The zoom extent includes the\n * [minimum zoom level](https://maplibre.org/maplibre-style-spec/layers/#minzoom)\n * and [maximum zoom level](https://maplibre.org/maplibre-style-spec/layers/#maxzoom))\n * at which the layer will be rendered.\n *\n * Note: For style layers using vector sources, style layers cannot be rendered at zoom levels lower than the\n * minimum zoom level of the _source layer_ because the data does not exist at those zoom levels. If the minimum\n * zoom level of the source layer is higher than the minimum zoom level defined in the style layer, the style\n * layer will not be rendered at all zoom levels in the zoom range.\n */\n setLayerZoomRange(layerId: string, minzoom: number, maxzoom: number): this {\n this.minimap?.setLayerZoomRange(layerId, minzoom, maxzoom);\n return super.setLayerZoomRange(layerId, minzoom, maxzoom);\n }\n\n /**\n * Sets the filter for the specified style layer.\n *\n * Filters control which features a style layer renders from its source.\n * Any feature for which the filter expression evaluates to `true` will be\n * rendered on the map. Those that are false will be hidden.\n *\n * Use `setFilter` to show a subset of your source data.\n *\n * To clear the filter, pass `null` or `undefined` as the second parameter.\n */\n setFilter(\n layerId: string,\n filter?: FilterSpecification | null,\n options?: StyleSetterOptions,\n ): this {\n this.minimap?.setFilter(layerId, filter, options);\n return super.setFilter(layerId, filter, options);\n }\n\n /**\n * Sets the value of a paint property in the specified style layer.\n *\n * @param layerId - The ID of the layer to set the paint property in.\n * @param name - The name of the paint property to set.\n * @param value - The value of the paint property to set.\n * Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/).\n * @param options - Options object.\n * @returns `this`\n * @example\n * ```ts\n * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n * ```\n */\n setPaintProperty(\n layerId: string,\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n options?: StyleSetterOptions,\n ): this {\n this.minimap?.setPaintProperty(layerId, name, value, options);\n return super.setPaintProperty(layerId, name, value, options);\n }\n\n /**\n * Sets the value of a layout property in the specified style layer.\n * Layout properties define how the layer is styled.\n * Layout properties for layers of the same type are documented together.\n * Layers of different types have different layout properties.\n * See the [MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/) for the complete list of layout properties.\n * @param layerId - The ID of the layer to set the layout property in.\n * @param name - The name of the layout property to set.\n * @param value - The value of the layout property to set.\n * Must be of a type appropriate for the property, as defined in the [MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/).\n * @param options - Options object.\n * @returns `this`\n */\n setLayoutProperty(\n layerId: string,\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n options?: StyleSetterOptions,\n ): this {\n this.minimap?.setLayoutProperty(layerId, name, value, options);\n return super.setLayoutProperty(layerId, name, value, options);\n }\n\n /**\n * Sets the value of the style's glyphs property.\n *\n * @param glyphsUrl - Glyph URL to set. Must conform to the [MapLibre Style Specification](https://maplibre.org/maplibre-style-spec/glyphs/).\n * @param options - Options object.\n * @returns `this`\n * @example\n * ```ts\n * map.setGlyphs('https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf');\n * ```\n */\n setGlyphs(glyphsUrl: string | null, options?: StyleSetterOptions): this {\n this.minimap?.setGlyphs(glyphsUrl, options);\n return super.setGlyphs(glyphsUrl, options);\n }\n\n private getStyleLanguage(): string | null {\n if (!this.style.stylesheet.metadata) return null;\n if (typeof this.style.stylesheet.metadata !== \"object\") return null;\n\n if (\n \"maptiler:language\" in this.style.stylesheet.metadata &&\n typeof this.style.stylesheet.metadata[\"maptiler:language\"] === \"string\"\n ) {\n return this.style.stylesheet.metadata[\"maptiler:language\"];\n } else {\n return null;\n }\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n */\n setLanguage(language: LanguageString | string): void {\n this.minimap?.map?.setLanguage(language);\n this.onStyleReady(() => {\n this.setPrimaryLanguage(language);\n });\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n */\n\n private setPrimaryLanguage(language: LanguageString | string) {\n const styleLanguage = this.getStyleLanguage();\n\n // If the language is set to `STYLE` (which is the SDK default), but the language defined in\n // the style is `auto`, we need to bypass some verification and modify the languages anyway\n if (\n !(\n language === Language.STYLE &&\n (styleLanguage === Language.AUTO || styleLanguage === Language.VISITOR)\n )\n ) {\n if (language !== Language.STYLE) {\n this.languageAlwaysBeenStyle = false;\n }\n\n if (this.languageAlwaysBeenStyle) {\n return;\n }\n\n // No need to change the language\n if (this.primaryLanguage === language && !this.forceLanguageUpdate) {\n return;\n }\n }\n\n if (!isLanguageSupported(language as string)) {\n console.warn(`The language \"${language}\" is not supported.`);\n return;\n }\n\n if (this.primaryLanguage === Language.STYLE_LOCK) {\n console.warn(\n \"The language cannot be changed because this map has been instantiated with the STYLE_LOCK language flag.\",\n );\n return;\n }\n\n this.primaryLanguage = language as LanguageString;\n let languageNonStyle: LanguageString = language as LanguageString;\n\n // STYLE needs to be translated into one of the other language,\n // this is why it's addressed first\n if (language === Language.STYLE) {\n if (!styleLanguage) {\n console.warn(\"The style has no default languages.\");\n return;\n }\n\n if (!isLanguageSupported(styleLanguage)) {\n console.warn(\"The language defined in the style is not valid.\");\n return;\n }\n\n languageNonStyle = styleLanguage as LanguageString;\n }\n\n // may be overwritten below\n let langStr: string | LanguageString = Language.LOCAL;\n\n // will be overwritten below\n let replacer: ExpressionSpecification | string = `{${langStr}}`;\n\n if (languageNonStyle == Language.VISITOR) {\n langStr = getBrowserLanguage();\n replacer = [\n \"case\",\n [\"all\", [\"has\", langStr], [\"has\", Language.LOCAL]],\n [\n \"case\",\n [\"==\", [\"get\", langStr], [\"get\", Language.LOCAL]],\n [\"get\", Language.LOCAL],\n\n [\n \"format\",\n [\"get\", langStr],\n { \"font-scale\": 0.8 },\n \"\\n\",\n [\"get\", Language.LOCAL],\n { \"font-scale\": 1.1 },\n ],\n ],\n\n [\"get\", Language.LOCAL],\n ];\n } else if (languageNonStyle == Language.VISITOR_ENGLISH) {\n langStr = Language.ENGLISH;\n replacer = [\n \"case\",\n [\"all\", [\"has\", langStr], [\"has\", Language.LOCAL]],\n [\n \"case\",\n [\"==\", [\"get\", langStr], [\"get\", Language.LOCAL]],\n [\"get\", Language.LOCAL],\n\n [\n \"format\",\n [\"get\", langStr],\n { \"font-scale\": 0.8 },\n \"\\n\",\n [\"get\", Language.LOCAL],\n { \"font-scale\": 1.1 },\n ],\n ],\n [\"get\", Language.LOCAL],\n ];\n } else if (languageNonStyle === Language.AUTO) {\n langStr = getBrowserLanguage();\n replacer = [\n \"case\",\n [\"has\", langStr],\n [\"get\", langStr],\n [\"get\", Language.LOCAL],\n ];\n }\n\n // This is for using the regular names as {name}\n else if (languageNonStyle === Language.LOCAL) {\n langStr = Language.LOCAL;\n replacer = `{${langStr}}`;\n }\n\n // This section is for the regular language ISO codes\n else {\n langStr = languageNonStyle;\n replacer = [\n \"case\",\n [\"has\", langStr],\n [\"get\", langStr],\n [\"get\", Language.LOCAL],\n ];\n }\n\n const { layers } = this.getStyle();\n\n for (const { id, layout } of layers) {\n if (!layout) {\n continue;\n }\n\n if (!(\"text-field\" in layout)) {\n continue;\n }\n\n const textFieldLayoutProp = this.getLayoutProperty(id, \"text-field\");\n\n // If the label is not about a name, then we don't translate it\n if (\n typeof textFieldLayoutProp === \"string\" &&\n (textFieldLayoutProp.toLowerCase().includes(\"ref\") ||\n textFieldLayoutProp.toLowerCase().includes(\"housenumber\"))\n ) {\n continue;\n }\n\n this.setLayoutProperty(id, \"text-field\", replacer);\n }\n }\n\n /**\n * Get the primary language\n * @returns\n */\n getPrimaryLanguage(): LanguageString {\n return this.primaryLanguage;\n }\n\n /**\n * Get the exaggeration factor applied to the terrain\n * @returns\n */\n getTerrainExaggeration(): number {\n return this.terrainExaggeration;\n }\n\n /**\n * Know if terrian is enabled or not\n * @returns\n */\n hasTerrain(): boolean {\n return this.isTerrainEnabled;\n }\n\n private growTerrain(exaggeration: number, durationMs = 1000) {\n // This method assumes the terrain is already built\n if (!this.terrain) {\n return;\n }\n\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n const deltaExaggeration = exaggeration - currentExaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the flattening animation is triggered while the growing animation\n // is running, then the flattening animation is stopped\n if (this.terrainFlattening) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop = (performance.now() - startTime) / durationMs;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = 1 - Math.pow(1 - positionInLoop, 4);\n const newExaggeration =\n currentExaggeration + exaggerationFactor * deltaExaggeration;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n this.terrain.exaggeration = exaggeration;\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = true;\n this.terrainFlattening = false;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Enables the 3D terrain visualization\n */\n enableTerrain(exaggeration = this.terrainExaggeration) {\n if (exaggeration < 0) {\n console.warn(\"Terrain exaggeration cannot be negative.\");\n return;\n }\n\n // This function is mapped to a map \"data\" event. It checks that the terrain\n // tiles are loaded and when so, it starts an animation to make the terrain grow\n const dataEventTerrainGrow = async (evt: MapTerrainDataEvent) => {\n if (!this.terrain) {\n return;\n }\n\n if (\n evt.type !== \"data\" ||\n evt.dataType !== \"source\" ||\n !(\"source\" in evt)\n ) {\n return;\n }\n\n if (evt.sourceId !== \"maptiler-terrain\") {\n return;\n }\n\n const source = evt.source;\n\n if (source.type !== \"raster-dem\") {\n return;\n }\n\n if (!evt.isSourceLoaded) {\n return;\n }\n\n // We shut this event off because we want it to happen only once.\n // Yet, we cannot use the \"once\" method because only the last event of the series\n // has `isSourceLoaded` true\n this.off(\"data\", dataEventTerrainGrow);\n\n this.growTerrain(exaggeration);\n };\n\n // This is put into a function so that it can be called regardless\n // of the loading state of _this_ the map instance\n const addTerrain = () => {\n // When style is changed,\n this.isTerrainEnabled = true;\n this.terrainExaggeration = exaggeration;\n\n // Mapping it to the \"data\" event so that we can check that the terrain\n // growing starts only when terrain tiles are loaded (to reduce glitching)\n this.on(\"data\", dataEventTerrainGrow);\n\n this.addSource(defaults.terrainSourceId, {\n type: \"raster-dem\",\n url: defaults.terrainSourceURL,\n });\n\n // Setting up the terrain with a 0 exaggeration factor\n // so it loads ~seamlessly and then can grow from there\n this.setTerrain({\n source: defaults.terrainSourceId,\n exaggeration: 0,\n });\n };\n\n // The terrain has already been loaded,\n // we just update the exaggeration.\n if (this.getTerrain()) {\n this.isTerrainEnabled = true;\n this.growTerrain(exaggeration);\n return;\n }\n\n if (this.loaded() || this.isTerrainEnabled) {\n addTerrain();\n } else {\n this.once(\"load\", () => {\n if (this.getTerrain() && this.getSource(defaults.terrainSourceId)) {\n return;\n }\n addTerrain();\n });\n }\n }\n\n /**\n * Disable the 3D terrain visualization\n */\n disableTerrain() {\n // It could be disabled already\n if (!this.terrain) {\n return;\n }\n\n this.isTerrainEnabled = false;\n // this.stopFlattening = false;\n\n // Duration of the animation in millisec\n const animationLoopDuration = 1 * 1000;\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the growing animation is triggered while flattening,\n // then we exist the flatening\n if (this.terrainGrowing) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop =\n (performance.now() - startTime) / animationLoopDuration;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = Math.pow(1 - positionInLoop, 4);\n const newExaggeration = currentExaggeration * exaggerationFactor;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrain.exaggeration = 0;\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n // @ts-expect-error - https://github.com/maplibre/maplibre-gl-js/issues/2992\n this.setTerrain();\n if (this.getSource(defaults.terrainSourceId)) {\n this.removeSource(defaults.terrainSourceId);\n }\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = false;\n this.terrainFlattening = true;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Sets the 3D terrain exageration factor.\n * If the terrain was not enabled prior to the call of this method,\n * the method `.enableTerrain()` will be called.\n * If `animate` is `true`, the terrain transformation will be animated in the span of 1 second.\n * If `animate` is `false`, no animated transition to the newly defined exaggeration.\n */\n setTerrainExaggeration(exaggeration: number, animate = true) {\n if (!animate && this.terrain) {\n this.terrainExaggeration = exaggeration;\n this.terrain.exaggeration = exaggeration;\n this.triggerRepaint();\n } else {\n this.enableTerrain(exaggeration);\n }\n }\n\n /**\n * Perform an action when the style is ready. It could be at the moment of calling this method\n * or later.\n */\n private onStyleReady(cb: () => void) {\n if (this.isStyleLoaded()) {\n cb();\n } else {\n this.once(\"styledata\", () => {\n cb();\n });\n }\n }\n\n async fitToIpBounds() {\n const ipGeolocateResult = await geolocation.info();\n this.fitBounds(\n ipGeolocateResult.country_bounds as [number, number, number, number],\n {\n duration: 0,\n padding: 100,\n },\n );\n }\n\n async centerOnIpPoint(zoom: number | undefined) {\n const ipGeolocateResult = await geolocation.info();\n this.jumpTo({\n center: [\n ipGeolocateResult?.longitude ?? 0,\n ipGeolocateResult?.latitude ?? 0,\n ],\n zoom: zoom || 11,\n });\n }\n\n getCameraHash() {\n const hashBin = new Float32Array(5);\n const center = this.getCenter();\n hashBin[0] = center.lng;\n hashBin[1] = center.lat;\n hashBin[2] = this.getZoom();\n hashBin[3] = this.getPitch();\n hashBin[4] = this.getBearing();\n return Base64.fromUint8Array(new Uint8Array(hashBin.buffer));\n }\n\n /**\n * Get the SDK config object.\n * This is convenient to dispatch the SDK configuration to externally built layers\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n */\n getSdkConfig(): SdkConfig {\n return config;\n }\n\n /**\n * Get the MapTiler session ID. Convenient to dispatch to externaly built component\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n * @returns\n */\n getMaptilerSessionId(): string {\n return MAPTILER_SESSION_ID;\n }\n\n /**\n * Updates the requestManager's transform request with a new function.\n *\n * @param transformRequest A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests.\n * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties\n *\n * @returns {Map} `this`\n *\n * @example\n * map.setTransformRequest((url: string, resourceType: string) => {});\n */\n override setTransformRequest(\n transformRequest: RequestTransformFunction,\n ): this {\n super.setTransformRequest(combineTransformRequest(transformRequest));\n return this;\n }\n\n /**\n * Loads an image. This is an async equivalent of `Map.loadImage`\n */\n async loadImageAsync(\n url: string,\n ): Promise<HTMLImageElement | ImageBitmap | null | undefined> {\n return new Promise((resolve, reject) => {\n this.loadImage(\n url,\n (\n error: Error | null | undefined,\n image: HTMLImageElement | ImageBitmap | null | undefined,\n ) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(image);\n },\n );\n });\n }\n}\n","/**\n * This is an extension of MapLibre Marker to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Marker extends maplibregl.Marker {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Popup to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Popup extends maplibregl.Popup {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Style to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL, StyleOptions } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Style extends maplibregl.Style {\n constructor(map: Map, options: StyleOptions = {}) {\n super(map as MapMLGL, options);\n }\n}\n","/**\n * This is an extension of MapLibre CanvasSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class CanvasSource extends maplibregl.CanvasSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre GeoJSONSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeoJSONSource extends maplibregl.GeoJSONSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ImageSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ImageSource extends maplibregl.ImageSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterTileSource extends maplibregl.RasterTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterDEMTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterDEMTileSource extends maplibregl.RasterDEMTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VectorTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VectorTileSource extends maplibregl.VectorTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VideoSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VideoSource extends maplibregl.VideoSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre TerrainControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class TerrainControl extends maplibregl.TerrainControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is TypeScript rewrite of the Point class to use instead of the version imported in MapLibre.\n * It also uses a class instead of prototypes.\n */\n\n/**\n * Row major 2x2 matrix\n */\nexport type Matrix2 = [number, number, number, number];\n\n/**\n * a point\n */\nexport class Point {\n public x: number;\n public y: number;\n\n constructor(x: number, y: number) {\n this.x = x;\n this.y = y;\n }\n\n private _matMult(m: Matrix2): Point {\n const x = m[0] * this.x + m[1] * this.y;\n const y = m[2] * this.x + m[3] * this.y;\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _add(p: Point): Point {\n this.x += p.x;\n this.y += p.y;\n return this;\n }\n\n private _sub(p: Point): Point {\n this.x -= p.x;\n this.y -= p.y;\n return this;\n }\n\n private _mult(k: number): Point {\n this.x *= k;\n this.y *= k;\n return this;\n }\n\n private _div(k: number): Point {\n this.x /= k;\n this.y /= k;\n return this;\n }\n\n private _multByPoint(p: Point): Point {\n this.x *= p.x;\n this.y *= p.y;\n return this;\n }\n\n private _divByPoint(p: Point): Point {\n this.x /= p.x;\n this.y /= p.y;\n return this;\n }\n\n private _unit(): Point {\n this._div(this.mag());\n return this;\n }\n\n private _perp(): Point {\n const y = this.y;\n this.y = this.x;\n this.x = -y;\n return this;\n }\n\n private _rotate(angle: number): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const x = cos * this.x - sin * this.y;\n const y = sin * this.x + cos * this.y;\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _rotateAround(angle: number, p: Point): Point {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y);\n const y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n this.x = x;\n this.y = y;\n return this;\n }\n\n private _round(): Point {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n\n /**\n * Clone this point, returning a new point that can be modified\n * without affecting the old one.\n * @return {Point} the clone\n */\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n /**\n * Add this point's x & y coordinates to another point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n add(p: Point): Point {\n return this.clone()._add(p);\n }\n\n /**\n * Subtract this point's x & y coordinates to from point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n sub(p: Point): Point {\n return this.clone()._sub(p);\n }\n\n /**\n * Multiply this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n multByPoint(p: Point): Point {\n return this.clone()._multByPoint(p);\n }\n\n /**\n * Divide this point's x & y coordinates by point,\n * yielding a new point.\n * @param {Point} p the other point\n * @return {Point} output point\n */\n divByPoint(p: Point): Point {\n return this.clone()._divByPoint(p);\n }\n\n /**\n * Multiply this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Number} k factor\n * @return {Point} output point\n */\n mult(k: number): Point {\n return this.clone()._mult(k);\n }\n\n /**\n * Divide this point's x & y coordinates by a factor,\n * yielding a new point.\n * @param {Point} k factor\n * @return {Point} output point\n */\n div(k: number): Point {\n return this.clone()._div(k);\n }\n\n /**\n * Rotate this point around the 0, 0 origin by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @return {Point} output point\n */\n rotate(a: number): Point {\n return this.clone()._rotate(a);\n }\n\n /**\n * Rotate this point around p point by an angle a,\n * given in radians\n * @param {Number} a angle to rotate around, in radians\n * @param {Point} p Point to rotate around\n * @return {Point} output point\n */\n rotateAround(a: number, p: Point): Point {\n return this.clone()._rotateAround(a, p);\n }\n\n /**\n * Multiply this point by a 4x1 transformation matrix\n * @param {Array<Number>} m transformation matrix\n * @return {Point} output point\n */\n matMult(m: Matrix2): Point {\n return this.clone()._matMult(m);\n }\n\n /**\n * Calculate this point but as a unit vector from 0, 0, meaning\n * that the distance from the resulting point to the 0, 0\n * coordinate will be equal to 1 and the angle from the resulting\n * point to the 0, 0 coordinate will be the same as before.\n * @return {Point} unit vector point\n */\n unit(): Point {\n return this.clone()._unit();\n }\n\n /**\n * Compute a perpendicular point, where the new y coordinate\n * is the old x coordinate and the new x coordinate is the old y\n * coordinate multiplied by -1\n * @return {Point} perpendicular point\n */\n perp(): Point {\n return this.clone()._perp();\n }\n\n /**\n * Return a version of this point with the x & y coordinates\n * rounded to integers.\n * @return {Point} rounded point\n */\n round(): Point {\n return this.clone()._round();\n }\n\n /**\n * Return the magnitude of this point: this is the Euclidean\n * distance from the 0, 0 coordinate to this point's x and y\n * coordinates.\n * @return {Number} magnitude\n */\n mag(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n /**\n * Judge whether this point is equal to another point, returning\n * true or false.\n * @param {Point} other the other point\n * @return {boolean} whether the points are equal\n */\n equals(other: Point): boolean {\n return this.x === other.x && this.y === other.y;\n }\n\n /**\n * Calculate the distance from this point to another point\n * @param {Point} p the other point\n * @return {Number} distance\n */\n dist(p: Point): number {\n return Math.sqrt(this.distSqr(p));\n }\n\n /**\n * Calculate the distance from this point to another point,\n * without the square root step. Useful if you're comparing\n * relative distances.\n * @param {Point} p the other point\n * @return {Number} distance\n */\n distSqr(p: Point): number {\n const dx = p.x - this.x;\n const dy = p.y - this.y;\n return dx * dx + dy * dy;\n }\n\n /**\n * Get the angle from the 0, 0 coordinate to this point, in radians\n * coordinates.\n * @return {Number} angle\n */\n angle(): number {\n return Math.atan2(this.y, this.x);\n }\n\n /**\n * Get the angle from this point to another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleTo(b: Point): number {\n return Math.atan2(this.y - b.y, this.x - b.x);\n }\n\n /**\n * Get the angle between this point and another point, in radians\n * @param {Point} b the other point\n * @return {Number} angle\n */\n angleWith(b: Point): number {\n return this.angleWithSep(b.x, b.y);\n }\n\n /*\n * Find the angle of the two vectors, solving the formula for\n * the cross product a x b = |a||b|sin(θ) for θ.\n * @param {Number} x the x-coordinate\n * @param {Number} y the y-coordinate\n * @return {Number} the angle in radians\n */\n angleWithSep(x: number, y: number): number {\n return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y);\n }\n\n /**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<number> | Point} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\n static convert(a: Point | Array<number>) {\n if (a instanceof Point) {\n return a;\n }\n if (Array.isArray(a)) {\n return new Point(a[0], a[1]);\n }\n return a;\n }\n}\n","// Typescript port of https://github.com/mapbox/togeojson/\n// This includes KML and GPX parsing to GeoJSON\n\nexport interface Link {\n href: string | null;\n}\n\nexport interface XMLProperties {\n links?: Link[];\n}\n\nexport interface PlacemarkProperties {\n name?: string;\n address?: string;\n styleUrl?: string;\n description?: string;\n styleHash?: string;\n styleMapHash?: Record<string, string | null>;\n timespan?: {\n begin: string;\n end: string;\n };\n timestamp?: string;\n stroke?: string;\n \"stroke-opacity\"?: number;\n \"stroke-width\"?: number;\n fill?: string;\n \"fill-opacity\"?: number;\n visibility?: string;\n icon?: string;\n coordTimes?: (string | null)[] | (string | null)[][];\n}\n\n/**\n * create a function that converts a string to XML\n * https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n */\nexport function str2xml(str: string): Document {\n if (typeof DOMParser !== \"undefined\") {\n const doc = new DOMParser().parseFromString(str, \"application/xml\");\n\n // If the input string was not valid XML\n if (doc.querySelector(\"parsererror\")) {\n throw new Error(\"The provided string is not valid XML\");\n }\n\n return doc;\n } else {\n throw new Error(\"No XML parser found\");\n }\n}\n\n/**\n * Check one of the top level child node is of a given type (\"gpx\", \"kml\").\n * The check is not case sensitive.\n * @param doc\n * @param nodeName\n * @returns\n */\nexport function hasChildNodeWithName(doc: Document, nodeName: string): boolean {\n if (!doc.hasChildNodes()) {\n return false;\n }\n\n for (const childNode of Array.from(doc.childNodes)) {\n const currentNodeName = childNode.nodeName;\n if (\n typeof currentNodeName === \"string\" &&\n currentNodeName.trim().toLowerCase() === nodeName.toLowerCase()\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * create a function that converts a XML to a string\n * https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer\n */\nexport function xml2str(node: Node): string {\n if (typeof XMLSerializer !== \"undefined\") {\n return new XMLSerializer().serializeToString(node);\n }\n throw new Error(\"No XML serializer found\");\n}\n\n/**\n * Given a XML document using the GPX spec, return GeoJSON\n */\nexport function gpx(doc: string | Document): GeoJSON.FeatureCollection {\n if (typeof doc === \"string\") doc = str2xml(doc);\n // doc.firstChild\n // The document is valid XML but not valid GPX (at leas the first node is not)\n if (!hasChildNodeWithName(doc, \"gpx\")) {\n throw new Error(\"The XML document is not valid GPX\");\n }\n\n const tracks = get(doc, \"trk\");\n const routes = get(doc, \"rte\");\n const waypoints = get(doc, \"wpt\");\n // a feature collection\n const gj: GeoJSON.FeatureCollection = {\n type: \"FeatureCollection\",\n features: [],\n };\n for (const track of Array.from(tracks)) {\n const feature = getTrack(track);\n if (feature) gj.features.push(feature);\n }\n for (const route of Array.from(routes)) {\n const feature = getRoute(route);\n if (feature) gj.features.push(feature);\n }\n for (const waypoint of Array.from(waypoints)) {\n gj.features.push(getPoint(waypoint));\n }\n return gj;\n}\n\n/**\n * Given a XML document using the KML spec, return GeoJSON\n */\nexport function kml(\n doc: string | Document,\n xml2string?: (node: Node) => string,\n): GeoJSON.FeatureCollection {\n if (typeof doc === \"string\") doc = str2xml(doc);\n\n // The document is valid XML but not valid KML (at leas the first node is not)\n if (!hasChildNodeWithName(doc, \"kml\")) {\n throw new Error(\"The XML document is not valid KML\");\n }\n\n const gj: GeoJSON.FeatureCollection = {\n type: \"FeatureCollection\",\n features: [],\n };\n // styleindex keeps track of hashed styles in order to match features\n const styleIndex: Record<string, string> = {};\n const styleByHash: Record<string, Element> = {};\n // stylemapindex keeps track of style maps to expose in properties\n const styleMapIndex: Record<string, Record<string, string | null>> = {};\n // all root placemarks in the file\n const placemarks = get(doc, \"Placemark\");\n const styles = get(doc, \"Style\");\n const styleMaps = get(doc, \"StyleMap\");\n\n for (const style of Array.from(styles)) {\n const hash = okhash(\n xml2string !== undefined ? xml2string(style) : xml2str(style),\n ).toString(16);\n styleIndex[\"#\" + attr(style, \"id\")] = hash;\n styleByHash[hash] = style;\n }\n for (const styleMap of Array.from(styleMaps)) {\n styleIndex[\"#\" + attr(styleMap, \"id\")] = okhash(\n xml2string !== undefined ? xml2string(styleMap) : xml2str(styleMap),\n ).toString(16);\n const pairs = get(styleMap, \"Pair\");\n const pairsMap: Record<string, string | null> = {};\n for (const pair of Array.from(pairs)) {\n pairsMap[nodeVal(get1(pair, \"key\")) ?? \"\"] = nodeVal(\n get1(pair, \"styleUrl\"),\n );\n }\n styleMapIndex[\"#\" + attr(styleMap, \"id\")] = pairsMap;\n }\n for (const placemark of Array.from(placemarks)) {\n gj.features = gj.features.concat(\n getPlacemark(placemark, styleIndex, styleByHash, styleMapIndex),\n );\n }\n return gj;\n}\n\n// parse color string to hex string with opacity. black with 100% opacity will be returned if no data found\nfunction kmlColor(v: string | null): [string, number] {\n if (v === null) return [\"#000000\", 1];\n let color = \"\";\n let opacity = 1;\n if (v.substring(0, 1) === \"#\") v = v.substring(1);\n if (v.length === 6 || v.length === 3) color = v;\n if (v.length === 8) {\n opacity = parseInt(v.substring(0, 2), 16) / 255;\n color = \"#\" + v.substring(6, 8) + v.substring(4, 6) + v.substring(2, 4);\n }\n return [color ?? \"#000000\", opacity ?? 1];\n}\n\nfunction gxCoord(v: string): number[] {\n return numarray(v.split(\" \"));\n}\n\n// grab coordinates and timestamps (when available) from the gx:Track extension\nfunction gxCoords(root: Document | Element): {\n coords: number[][];\n times: (string | null)[];\n} {\n let elems = get(root, \"coord\");\n const coords: number[][] = [];\n const times: (string | null)[] = [];\n if (elems.length === 0) elems = get(root, \"gx:coord\");\n for (const elem of Array.from(elems)) {\n coords.push(gxCoord(nodeVal(elem) ?? \"\"));\n }\n const timeElems = get(root, \"when\");\n for (const timeElem of Array.from(timeElems)) times.push(nodeVal(timeElem));\n return {\n coords: coords,\n times,\n };\n}\n\n// get the geometry data and coordinate timestamps if available\nfunction getGeometry(root: Element): {\n geoms: GeoJSON.Geometry[];\n coordTimes: (string | null)[][];\n} {\n // atomic geospatial types supported by KML - MultiGeometry is\n // handled separately\n const geotypes = [\"Polygon\", \"LineString\", \"Point\", \"Track\", \"gx:Track\"];\n // setup variables\n let geomNode, geomNodes, i, j, k;\n const geoms: GeoJSON.Geometry[] = [];\n const coordTimes: (string | null)[][] = [];\n // simple cases\n if (get1(root, \"MultiGeometry\") !== null) {\n return getGeometry(get1(root, \"MultiGeometry\") as Element);\n }\n if (get1(root, \"MultiTrack\") !== null) {\n return getGeometry(get1(root, \"MultiTrack\") as Element);\n }\n if (get1(root, \"gx:MultiTrack\") !== null) {\n return getGeometry(get1(root, \"gx:MultiTrack\") as Element);\n }\n for (i = 0; i < geotypes.length; i++) {\n geomNodes = get(root, geotypes[i]);\n if (geomNodes) {\n for (j = 0; j < geomNodes.length; j++) {\n geomNode = geomNodes[j];\n if (geotypes[i] === \"Point\") {\n geoms.push({\n type: \"Point\",\n coordinates: coord1(nodeVal(get1(geomNode, \"coordinates\")) ?? \"\"),\n });\n } else if (geotypes[i] === \"LineString\") {\n geoms.push({\n type: \"LineString\",\n coordinates: coord(nodeVal(get1(geomNode, \"coordinates\")) ?? \"\"),\n });\n } else if (geotypes[i] === \"Polygon\") {\n const rings = get(geomNode, \"LinearRing\");\n const coords = [];\n for (k = 0; k < rings.length; k++) {\n coords.push(coord(nodeVal(get1(rings[k], \"coordinates\")) ?? \"\"));\n }\n geoms.push({\n type: \"Polygon\",\n coordinates: coords,\n });\n } else if (geotypes[i] === \"Track\" || geotypes[i] === \"gx:Track\") {\n const track = gxCoords(geomNode);\n geoms.push({\n type: \"LineString\",\n coordinates: track.coords,\n });\n if (track.times.length) coordTimes.push(track.times);\n }\n }\n }\n }\n return { geoms, coordTimes };\n}\n\n// build geojson feature sets with all their attributes and property data\nfunction getPlacemark(\n root: Element,\n styleIndex: Record<string, string>,\n styleByHash: Record<string, Element>,\n styleMapIndex: Record<string, Record<string, string | null>>,\n) {\n const geomsAndTimes = getGeometry(root);\n const properties: PlacemarkProperties & Record<string, string> = {};\n const name = nodeVal(get1(root, \"name\"));\n const address = nodeVal(get1(root, \"address\"));\n const description = nodeVal(get1(root, \"description\"));\n const timeSpan = get1(root, \"TimeSpan\");\n const timeStamp = get1(root, \"TimeStamp\");\n const extendedData = get1(root, \"ExtendedData\");\n const visibility = get1(root, \"visibility\");\n\n let i: number;\n let styleUrl = nodeVal(get1(root, \"styleUrl\"));\n let lineStyle = get1(root, \"LineStyle\");\n let polyStyle = get1(root, \"PolyStyle\");\n\n if (!geomsAndTimes.geoms.length) return [];\n if (name) properties.name = name;\n if (address) properties.address = address;\n if (styleUrl) {\n if (styleUrl[0] !== \"#\") styleUrl = \"#\" + styleUrl;\n\n properties.styleUrl = styleUrl;\n if (styleIndex[styleUrl]) {\n properties.styleHash = styleIndex[styleUrl];\n }\n if (styleMapIndex[styleUrl]) {\n properties.styleMapHash = styleMapIndex[styleUrl];\n properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal ?? \"\"];\n }\n // Try to populate the lineStyle or polyStyle since we got the style hash\n const style = styleByHash[properties.styleHash ?? \"\"];\n if (style) {\n if (!lineStyle) lineStyle = get1(style, \"LineStyle\");\n if (!polyStyle) polyStyle = get1(style, \"PolyStyle\");\n const iconStyle = get1(style, \"IconStyle\");\n if (iconStyle) {\n const icon = get1(iconStyle, \"Icon\");\n if (icon) {\n const href = nodeVal(get1(icon, \"href\"));\n if (href) properties.icon = href;\n }\n }\n }\n }\n if (description) properties.description = description;\n if (timeSpan) {\n const begin = nodeVal(get1(timeSpan, \"begin\"));\n const end = nodeVal(get1(timeSpan, \"end\"));\n if (begin && end) properties.timespan = { begin, end };\n }\n if (timeStamp !== null) {\n properties.timestamp =\n nodeVal(get1(timeStamp, \"when\")) ?? new Date().toISOString();\n }\n if (lineStyle !== null) {\n const linestyles = kmlColor(nodeVal(get1(lineStyle, \"color\")));\n const color = linestyles[0];\n const opacity = linestyles[1];\n const width = parseFloat(nodeVal(get1(lineStyle, \"width\")) ?? \"\");\n if (color) properties.stroke = color;\n if (!isNaN(opacity)) properties[\"stroke-opacity\"] = opacity;\n if (!isNaN(width)) properties[\"stroke-width\"] = width;\n }\n if (polyStyle) {\n const polystyles = kmlColor(nodeVal(get1(polyStyle, \"color\")));\n const pcolor = polystyles[0];\n const popacity = polystyles[1];\n const fill = nodeVal(get1(polyStyle, \"fill\"));\n const outline = nodeVal(get1(polyStyle, \"outline\"));\n if (pcolor) properties.fill = pcolor;\n if (!isNaN(popacity)) properties[\"fill-opacity\"] = popacity;\n if (fill)\n properties[\"fill-opacity\"] =\n fill === \"1\" ? properties[\"fill-opacity\"] || 1 : 0;\n if (outline)\n properties[\"stroke-opacity\"] =\n outline === \"1\" ? properties[\"stroke-opacity\"] || 1 : 0;\n }\n if (extendedData) {\n const datas = get(extendedData, \"Data\"),\n simpleDatas = get(extendedData, \"SimpleData\");\n\n for (i = 0; i < datas.length; i++) {\n properties[datas[i].getAttribute(\"name\") ?? \"\"] =\n nodeVal(get1(datas[i], \"value\")) ?? \"\";\n }\n for (i = 0; i < simpleDatas.length; i++) {\n properties[simpleDatas[i].getAttribute(\"name\") ?? \"\"] =\n nodeVal(simpleDatas[i]) ?? \"\";\n }\n }\n if (visibility !== null) {\n properties.visibility = nodeVal(visibility) ?? \"\";\n }\n if (geomsAndTimes.coordTimes.length !== 0) {\n properties.coordTimes =\n geomsAndTimes.coordTimes.length === 1\n ? geomsAndTimes.coordTimes[0]\n : geomsAndTimes.coordTimes;\n }\n const feature: GeoJSON.Feature = {\n type: \"Feature\",\n geometry:\n geomsAndTimes.geoms.length === 1\n ? geomsAndTimes.geoms[0]\n : {\n type: \"GeometryCollection\",\n geometries: geomsAndTimes.geoms,\n },\n properties: properties,\n };\n if (attr(root, \"id\")) feature.id = attr(root, \"id\") ?? undefined;\n return [feature];\n}\n\nfunction getPoints(\n node: Element,\n pointname: string,\n):\n | undefined\n | {\n line: number[][];\n times: string[];\n heartRates: (number | null)[];\n } {\n const pts = get(node, pointname);\n const line: number[][] = [];\n const times: string[] = [];\n let heartRates: (number | null)[] = [];\n const ptsLength = pts.length;\n if (ptsLength < 2) return; // Invalid line in GeoJSON\n for (let i = 0; i < ptsLength; i++) {\n const cPair = coordPair(pts[i]);\n line.push(cPair.coordinates);\n if (cPair.time) times.push(cPair.time);\n if (cPair.heartRate || heartRates.length) {\n if (heartRates.length === 0) heartRates = new Array(i).fill(null);\n heartRates.push(cPair.heartRate);\n }\n }\n return {\n line: line,\n times: times,\n heartRates,\n };\n}\n\nfunction getTrack(node: Element): undefined | GeoJSON.Feature {\n const segments = get(node, \"trkseg\");\n const track = [];\n const times = [];\n const heartRates: (number | null)[][] = [];\n let line;\n for (let i = 0; i < segments.length; i++) {\n line = getPoints(segments[i], \"trkpt\");\n if (line !== undefined) {\n if (line.line) track.push(line.line);\n if (line.times && line.times.length) times.push(line.times);\n if (heartRates.length || (line.heartRates && line.heartRates.length)) {\n if (!heartRates.length) {\n for (let s = 0; s < i; s++) {\n heartRates.push(new Array(track[s].length).fill(null));\n }\n }\n if (line.heartRates && line.heartRates.length) {\n heartRates.push(line.heartRates);\n } else {\n heartRates.push(new Array(line.line.length).fill(null));\n }\n }\n }\n }\n if (track.length === 0) return;\n const properties: {\n coordTimes?: string[] | string[][];\n heartRates?: (number | null)[] | (number | null)[][];\n } & XMLProperties &\n Record<string, string | number> = {\n ...getProperties(node),\n ...getLineStyle(get1(node, \"extensions\")),\n };\n if (times.length !== 0)\n properties.coordTimes = track.length === 1 ? times[0] : times;\n if (heartRates.length !== 0) {\n properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;\n }\n if (track.length === 1) {\n return {\n type: \"Feature\",\n properties,\n geometry: {\n type: \"LineString\",\n coordinates: track[0],\n },\n };\n } else {\n return {\n type: \"Feature\",\n properties,\n geometry: {\n type: \"MultiLineString\",\n coordinates: track,\n },\n };\n }\n}\n\nfunction getRoute(node: Element): GeoJSON.Feature | undefined {\n const line = getPoints(node, \"rtept\");\n if (line === undefined) return;\n const prop = {\n ...getProperties(node),\n ...getLineStyle(get1(node, \"extensions\")),\n };\n return {\n type: \"Feature\",\n properties: prop,\n geometry: {\n type: \"LineString\",\n coordinates: line.line,\n },\n };\n}\n\nfunction getPoint(node: Element): GeoJSON.Feature {\n const prop = { ...getProperties(node), ...getMulti(node, [\"sym\"]) };\n return {\n type: \"Feature\",\n properties: prop,\n geometry: {\n type: \"Point\",\n coordinates: coordPair(node).coordinates,\n },\n };\n}\n\nfunction getLineStyle(\n extensions: Element | null,\n): Record<string, string | number> {\n const style: Record<string, string | number> = {};\n if (extensions) {\n const lineStyle = get1(extensions, \"line\");\n if (lineStyle) {\n const color = nodeVal(get1(lineStyle, \"color\"));\n const opacity = parseFloat(nodeVal(get1(lineStyle, \"opacity\")) ?? \"0\");\n const width = parseFloat(nodeVal(get1(lineStyle, \"width\")) ?? \"0\");\n if (color) style.stroke = color;\n if (!isNaN(opacity)) style[\"stroke-opacity\"] = opacity;\n // GPX width is in mm, convert to px with 96 px per inch\n if (!isNaN(width)) style[\"stroke-width\"] = (width * 96) / 25.4;\n }\n }\n return style;\n}\n\nfunction getProperties(node: Element): XMLProperties & Record<string, string> {\n const prop: XMLProperties & Record<string, string> = getMulti(node, [\n \"name\",\n \"cmt\",\n \"desc\",\n \"type\",\n \"time\",\n \"keywords\",\n ]);\n const links = get(node, \"link\");\n if (links.length !== 0) {\n prop.links = [];\n for (const l of Array.from(links)) {\n const link = {\n href: attr(l, \"href\"),\n ...getMulti(l, [\"text\", \"type\"]),\n };\n prop.links.push(link);\n }\n }\n return prop;\n}\n\nfunction okhash(x: string): number {\n let h = 0;\n if (!x || !x.length) return h;\n for (let i = 0; i < x.length; i++) {\n h = ((h << 5) - h + x.charCodeAt(i)) | 0;\n }\n return h;\n}\n\nfunction get(x: Document | Element, y: string): HTMLCollectionOf<Element> {\n return x.getElementsByTagName(y);\n}\n\nfunction attr(x: Element, y: string): string | null {\n return x.getAttribute(y);\n}\n\nfunction attrf(x: Element, y: string): number {\n return parseFloat(attr(x, y) ?? \"0\");\n}\n\nfunction get1(x: Element, y: string): Element | null {\n const n = get(x, y);\n return n.length ? n[0] : null;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize\nfunction norm(el: Element): Element {\n if (el.normalize) el.normalize();\n return el;\n}\n\n// cast array x into numbers\nfunction numarray(x: string[]): number[] {\n return x.map(parseFloat).map((n) => (isNaN(n) ? null : n)) as number[];\n}\n\n// get the content of a text node, if any\nfunction nodeVal(x: Element | null): string | null {\n if (x) norm(x);\n return x && x.textContent;\n}\n\n// get the contents of multiple text nodes, if present\nfunction getMulti(x: Element, ys: string[]): Record<string, string> {\n const o: Record<string, string> = {};\n let n;\n let k;\n for (k = 0; k < ys.length; k++) {\n n = get1(x, ys[k]);\n if (n) o[ys[k]] = nodeVal(n) ?? \"\";\n }\n return o;\n}\n\n// get one coordinate from a coordinate array, if any\nfunction coord1(v: string): number[] {\n return numarray(v.replace(/\\s*/g, \"\").split(\",\"));\n}\n\n// get all coordinates from a coordinate array as [[],[]]\nfunction coord(v: string): number[][] {\n const coords = v.replace(/^\\s*|\\s*$/g, \"\").split(/\\s+/);\n const out = [];\n for (const coord of coords) out.push(coord1(coord));\n return out;\n}\n\n// build a set of coordinates, timestamps, and heartrate\nfunction coordPair(x: Element): {\n coordinates: number[];\n time: string | null;\n heartRate: number | null;\n} {\n const ll = [attrf(x, \"lon\"), attrf(x, \"lat\")];\n const ele = get1(x, \"ele\");\n // handle namespaced attribute in browser\n const heartRate = get1(x, \"gpxtpx:hr\") || get1(x, \"hr\");\n const time = get1(x, \"time\");\n let e: number;\n if (ele) {\n e = parseFloat(nodeVal(ele) ?? \"0\");\n if (!isNaN(e)) ll.push(e);\n }\n return {\n coordinates: ll,\n time: time ? nodeVal(time) : null,\n heartRate:\n heartRate !== null ? parseFloat(nodeVal(heartRate) ?? \"0\") : null,\n };\n}\n\nexport function gpxOrKml(\n doc: string | Document,\n): GeoJSON.FeatureCollection | null {\n try {\n // Converting only once rather than in each converter\n if (typeof doc === \"string\") doc = str2xml(doc);\n } catch (e) {\n // The doc is a string but not valid XML\n return null;\n }\n\n try {\n const result = gpx(doc);\n return result;\n } catch (e) {\n // The doc is valid XML but not valid GPX\n }\n\n try {\n const result = kml(doc);\n return result;\n } catch (e) {\n // The doc is valid XML but not valid KML\n }\n\n // At this point, the doc is not of a compatible vector format\n return null;\n}\n","export type RgbaColor =\n | [number, number, number]\n | [number, number, number, number];\n\nexport type ColorStop = {\n /**\n * The \"value\" at which this ColorStop should be applied.\n */\n value: number;\n /**\n * RGB[A] - Array of 3-4 numbers. 0-255 per channel.\n */\n color: RgbaColor;\n};\n\n/**\n * A RGBA color as per the array definition\n */\nexport type ArrayColor = [number, number, number, number];\n\n/**\n * A color ramp stop as per array definition\n */\nexport type ArrayColorRampStop = [\n /**\n * Real world value in a real world unit\n */\n number,\n\n /**\n * Color RGBA\n */\n ArrayColor,\n];\n\n/**\n * A color ramp as per array definition\n */\nexport type ArrayColorRamp = Array<ArrayColorRampStop>;\n\nexport type ColorRampOptions = {\n /**\n * The value the colorramp starts\n */\n min?: number;\n\n /**\n * The value the colorramp ends\n */\n max?: number;\n\n /**\n * Some color stops to copy from\n */\n stops?: Array<ColorStop>;\n};\n\nfunction componentToHex(c: number): string {\n const hex = c.toString(16);\n return hex.length == 1 ? \"0\" + hex : hex;\n}\n\nfunction rgbToHex(rgb: RgbaColor): string {\n return (\n \"#\" +\n componentToHex(rgb[0]) +\n componentToHex(rgb[1]) +\n componentToHex(rgb[2]) +\n (rgb.length === 4 ? componentToHex(rgb[3]) : \"\")\n );\n}\n\nexport class ColorRamp extends Array<ColorStop> {\n /**\n * Converts a array-definition color ramp definition into a usable ColorRamp instance.\n * Note: units are not converted and may need to to be converted beforehand (eg. kelvin to centigrade)\n * @param cr\n * @returns\n */\n static fromArrayDefinition(cr: ArrayColorRamp): ColorRamp {\n return new ColorRamp({\n stops: cr.map((cs: ArrayColorRampStop) => ({\n value: cs[0],\n color: cs[1],\n })),\n });\n }\n\n private min = 0;\n private max = 1;\n\n constructor(options: ColorRampOptions = {}) {\n super();\n\n if (\"min\" in options) {\n this.min = options.min as number;\n }\n\n if (\"max\" in options) {\n this.max = options.max as number;\n }\n\n if (\"stops\" in options) {\n this.setStops(options.stops as ColorStop[], { clone: false });\n }\n }\n\n setStops(\n stops: Array<ColorStop>,\n options: { clone?: boolean } = { clone: true },\n ): ColorRamp {\n const colorRamp = options.clone ? this.clone() : this;\n\n colorRamp.length = 0;\n\n let min = +Infinity;\n let max = -Infinity;\n\n for (let i = 0; i < stops.length; i += 1) {\n min = Math.min(min, stops[i].value);\n max = Math.max(max, stops[i].value);\n\n colorRamp.push({\n value: stops[i].value,\n color: stops[i].color.slice(), // we want to make sure we do a deep copy and not a reference\n } as ColorStop);\n }\n\n colorRamp.sort((a: ColorStop, b: ColorStop) =>\n a.value < b.value ? -1 : 1,\n );\n\n this.min = min;\n this.max = max;\n\n return colorRamp;\n }\n\n scale(\n min: number,\n max: number,\n options: { clone?: boolean } = { clone: true },\n ): ColorRamp {\n const clone = options.clone;\n\n const currentMin = this[0].value;\n const currentMax = this.at(-1).value;\n const currentSpan = currentMax - currentMin;\n const newSpan = max - min;\n const stops = [];\n\n for (let i = 0; i < this.length; i += 1) {\n const currentValue = this[i].value;\n const normalizedValue = (currentValue - currentMin) / currentSpan; // putting the value in the interval [0, 1]\n const newValue = normalizedValue * newSpan + min; // putting the value in the new interval\n\n if (clone) {\n stops.push({\n value: newValue,\n color: this[i].color.slice(),\n } as ColorStop);\n } else {\n this[i].value = newValue;\n }\n }\n\n return clone ? new ColorRamp({ stops }) : this;\n }\n\n // for some reason, I had to reimplement this\n at(pos: number) {\n if (pos < 0) {\n return this[this.length + pos];\n } else {\n return this[pos];\n }\n }\n\n clone(): ColorRamp {\n return new ColorRamp({ stops: this.getRawColorStops() });\n }\n\n getRawColorStops(): Array<ColorStop> {\n const stops = [];\n\n for (let i = 0; i < this.length; i += 1) {\n stops.push({ value: this[i].value, color: this[i].color });\n }\n\n return stops;\n }\n\n reverse(options: { clone?: boolean } = { clone: true }): ColorRamp {\n const colorRamp = options.clone ? this.clone() : this;\n\n for (let i = 0; i < ~~(colorRamp.length / 2); i += 1) {\n const c = colorRamp[i].color;\n colorRamp[i].color = colorRamp.at(-(i + 1)).color;\n colorRamp.at(-(i + 1)).color = c;\n }\n return colorRamp;\n }\n\n getBounds(): { min: number; max: number } {\n return { min: this.min, max: this.max };\n }\n\n getColor(\n value: number,\n options: { smooth?: boolean } = { smooth: true },\n ): RgbaColor {\n if (value <= this[0].value) {\n return this[0].color;\n }\n\n if (value >= this.at(-1).value) {\n return this.at(-1).color;\n }\n\n for (let i = 0; i < this.length - 1; i += 1) {\n if (value > this[i + 1].value) {\n continue;\n }\n\n const colorBefore = this[i].color;\n\n if (!options.smooth) {\n return colorBefore.slice() as RgbaColor;\n }\n\n const valueBefore = this[i].value;\n const valueAfter = this[i + 1].value;\n const colorAfter = this[i + 1].color;\n\n const beforeRatio = (valueAfter - value) / (valueAfter - valueBefore);\n return colorBefore.map((chan, i) =>\n Math.round(chan * beforeRatio + colorAfter[i] * (1 - beforeRatio)),\n ) as RgbaColor;\n }\n\n return [0, 0, 0] as RgbaColor;\n }\n\n /**\n * Get the color as an hexadecimal string\n */\n getColorHex(\n value: number,\n options: { smooth?: boolean; withAlpha?: boolean } = {\n smooth: true,\n withAlpha: false,\n },\n ): string {\n return rgbToHex(this.getColor(value, options));\n }\n\n /**\n * Get the color of the color ramp at a relative position in [0, 1]\n */\n getColorRelative(\n value: number,\n options: { smooth?: boolean } = { smooth: true },\n ): RgbaColor {\n const bounds = this.getBounds();\n return this.getColor(\n bounds.min + value * (bounds.max - bounds.min),\n options,\n );\n }\n\n getCanvasStrip(\n options: { horizontal?: boolean; size?: number; smooth?: boolean } = {\n horizontal: true,\n size: 512,\n smooth: true,\n },\n ) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = options.horizontal ? (options.size as number) : 1;\n canvas.height = options.horizontal ? 1 : (options.size as number);\n\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) throw new Error(\"Canvs context is missing\");\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const imageDataArray = imageData.data;\n\n const size = options.size as number;\n const startValue = this[0].value;\n const endValue = this.at(-1).value;\n const valueSpan = endValue - startValue;\n const valueStep = valueSpan / size;\n\n for (let i = 0; i < size; i += 1) {\n const color = this.getColor(startValue + i * valueStep, {\n smooth: options.smooth,\n });\n imageDataArray[i * 4] = color[0];\n imageDataArray[i * 4 + 1] = color[1];\n imageDataArray[i * 4 + 2] = color[2];\n imageDataArray[i * 4 + 3] = color.length > 3 ? (color[3] as number) : 255;\n }\n\n ctx.putImageData(imageData, 0, 0);\n return canvas;\n }\n\n /**\n * Apply a non-linear ressampling. This will create a new instance of ColorRamp with the same bounds.\n */\n resample(\n method:\n | \"ease-in-square\"\n | \"ease-out-square\"\n | \"ease-in-sqrt\"\n | \"ease-out-sqrt\"\n | \"ease-in-exp\"\n | \"ease-out-exp\",\n samples = 15,\n ): ColorRamp {\n const inputBounds = this.getBounds();\n const inputNormalized = this.scale(0, 1);\n const step = 1 / (samples - 1);\n\n let stops;\n\n if (method === \"ease-in-square\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = Math.pow(x, 2);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else if (method === \"ease-out-square\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = 1 - Math.pow(1 - x, 2);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else if (method === \"ease-out-sqrt\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = Math.pow(x, 0.5);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else if (method === \"ease-in-sqrt\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = 1 - Math.pow(1 - x, 0.5);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else if (method === \"ease-out-exp\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = 1 - Math.pow(2, -10 * x);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else if (method === \"ease-in-exp\") {\n stops = Array.from({ length: samples }, (_, i) => {\n const x = i * step;\n const y = Math.pow(2, 10 * x - 10);\n const color = inputNormalized.getColor(y);\n return { value: x, color };\n });\n } else {\n throw new Error(\"Invalid ressampling method.\");\n }\n\n const outputNormalized = new ColorRamp({ stops });\n const output = outputNormalized.scale(inputBounds.min, inputBounds.max);\n return output;\n }\n\n /**\n * Makes a clone of this color ramp that is fully transparant at the begining of their range\n */\n transparentStart(): ColorRamp {\n const stops = this.getRawColorStops();\n stops.unshift({\n value: stops[0].value,\n color: stops[0].color.slice() as RgbaColor,\n });\n stops[1].value += 0.001;\n\n stops.forEach((s) => {\n if (s.color.length === 3) {\n s.color.push(255);\n }\n });\n\n stops[0].color[3] = 0;\n\n return new ColorRamp({ stops });\n }\n\n /**\n * Check if this color ramp has a transparent start\n */\n hasTransparentStart(): boolean {\n return this[0].color.length === 4 && this[0].color[3] === 0;\n }\n}\n\n/**\n * This is a collection of built-in color ramps. They are all defined in the range [0, 1]\n * but can be scaled or reversed to fit specific usages.\n */\nexport const ColorRampCollection = {\n /**\n * A fully transparent [0, 0, 0, 0] colorramp to hide data.\n * Defined in interval [0, 1], without unit.\n */\n NULL: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0, 0] },\n { value: 1, color: [0, 0, 0, 0] },\n ],\n }),\n\n GRAY: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 1, color: [255, 255, 255] },\n ],\n }),\n\n /**\n * Classic jet color ramp.\n * Defined in interval [0, 1], without unit.\n */\n JET: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 131] },\n { value: 0.125, color: [0, 60, 170] },\n { value: 0.375, color: [5, 255, 255] },\n { value: 0.625, color: [255, 255, 0] },\n { value: 0.875, color: [250, 0, 0] },\n { value: 1, color: [128, 0, 0] },\n ],\n }),\n\n /**\n * Classic HSV color ramp (hue, saturation, value).\n * Defined in interval [0, 1], without unit.\n */\n HSV: new ColorRamp({\n stops: [\n { value: 0, color: [255, 0, 0] },\n { value: 0.169, color: [253, 255, 2] },\n { value: 0.173, color: [247, 255, 2] },\n { value: 0.337, color: [0, 252, 4] },\n { value: 0.341, color: [0, 252, 10] },\n { value: 0.506, color: [1, 249, 255] },\n { value: 0.671, color: [2, 0, 253] },\n { value: 0.675, color: [8, 0, 253] },\n { value: 0.839, color: [255, 0, 251] },\n { value: 0.843, color: [255, 0, 245] },\n { value: 1, color: [255, 0, 6] },\n ],\n }),\n\n /**\n * Classic hot color ramp.\n * Defined in interval [0, 1], without unit.\n */\n HOT: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.3, color: [230, 0, 0] },\n { value: 0.6, color: [255, 210, 0] },\n { value: 1, color: [255, 255, 255] },\n ],\n }),\n\n /**\n * Classic spring color ramp.\n * Defined in interval [0, 1], without unit.\n */\n SPRING: new ColorRamp({\n stops: [\n { value: 0, color: [255, 0, 255] },\n { value: 1, color: [255, 255, 0] },\n ],\n }),\n\n /**\n * Classic summer color ramp.\n * Defined in interval [0, 1], without unit.\n */\n SUMMER: new ColorRamp({\n stops: [\n { value: 0, color: [0, 128, 102] },\n { value: 1, color: [255, 255, 102] },\n ],\n }),\n\n /**\n * Classic autommn color ramp.\n * Defined in interval [0, 1], without unit.\n */\n AUTOMN: new ColorRamp({\n stops: [\n { value: 0, color: [255, 0, 0] },\n { value: 1, color: [255, 255, 0] },\n ],\n }),\n\n /**\n * Classic winter color ramp.\n * Defined in interval [0, 1], without unit.\n */\n WINTER: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 255] },\n { value: 1, color: [0, 255, 128] },\n ],\n }),\n\n /**\n * Classic bone color ramp.\n * Defined in interval [0, 1], without unit.\n */\n BONE: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.376, color: [84, 84, 116] },\n { value: 0.753, color: [169, 200, 200] },\n { value: 1, color: [255, 255, 255] },\n ],\n }),\n\n /**\n * Classic copper color ramp.\n * Defined in interval [0, 1], without unit.\n */\n COPPER: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.804, color: [255, 160, 102] },\n { value: 1, color: [255, 199, 127] },\n ],\n }),\n\n /**\n * Classic greys color ramp.\n * Defined in interval [0, 1], without unit.\n */\n GREYS: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 1, color: [255, 255, 255] },\n ],\n }),\n\n /**\n * Classic yignbu color ramp (blue to light yellow).\n * Defined in interval [0, 1], without unit.\n */\n YIGNBU: new ColorRamp({\n stops: [\n { value: 0, color: [8, 29, 88] },\n { value: 0.125, color: [37, 52, 148] },\n { value: 0.25, color: [34, 94, 168] },\n { value: 0.375, color: [29, 145, 192] },\n { value: 0.5, color: [65, 182, 196] },\n { value: 0.625, color: [127, 205, 187] },\n { value: 0.75, color: [199, 233, 180] },\n { value: 0.875, color: [237, 248, 217] },\n { value: 1, color: [255, 255, 217] },\n ],\n }),\n\n /**\n * Classic greens color ramp.\n * Defined in interval [0, 1], without unit.\n */\n GREENS: new ColorRamp({\n stops: [\n { value: 0, color: [0, 68, 27] },\n { value: 0.125, color: [0, 109, 44] },\n { value: 0.25, color: [35, 139, 69] },\n { value: 0.375, color: [65, 171, 93] },\n { value: 0.5, color: [116, 196, 118] },\n { value: 0.625, color: [161, 217, 155] },\n { value: 0.75, color: [199, 233, 192] },\n { value: 0.875, color: [229, 245, 224] },\n { value: 1, color: [247, 252, 245] },\n ],\n }),\n\n /**\n * Classic yiorrd color ramp (red to light yellow).\n * Defined in interval [0, 1], without unit.\n */\n YIORRD: new ColorRamp({\n stops: [\n { value: 0, color: [128, 0, 38] },\n { value: 0.125, color: [189, 0, 38] },\n { value: 0.25, color: [227, 26, 28] },\n { value: 0.375, color: [252, 78, 42] },\n { value: 0.5, color: [253, 141, 60] },\n { value: 0.625, color: [254, 178, 76] },\n { value: 0.75, color: [254, 217, 118] },\n { value: 0.875, color: [255, 237, 160] },\n { value: 1, color: [255, 255, 204] },\n ],\n }),\n\n /**\n * Classic blue-red color ramp.\n * Defined in interval [0, 1], without unit.\n */\n BLUERED: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 255] },\n { value: 1, color: [255, 0, 0] },\n ],\n }),\n\n /**\n * Classic rdbu color ramp.\n * Defined in interval [0, 1], without unit.\n */\n RDBU: new ColorRamp({\n stops: [\n { value: 0, color: [5, 10, 172] },\n { value: 0.35, color: [106, 137, 247] },\n { value: 0.5, color: [190, 190, 190] },\n { value: 0.6, color: [220, 170, 132] },\n { value: 0.7, color: [230, 145, 90] },\n { value: 1, color: [178, 10, 28] },\n ],\n }),\n\n /**\n * Classic picnic color ramp.\n * Defined in interval [0, 1], without unit.\n */\n PICNIC: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 255] },\n { value: 0.1, color: [51, 153, 255] },\n { value: 0.2, color: [102, 204, 255] },\n { value: 0.3, color: [153, 204, 255] },\n { value: 0.4, color: [204, 204, 255] },\n { value: 0.5, color: [255, 255, 255] },\n { value: 0.6, color: [255, 204, 255] },\n { value: 0.7, color: [255, 153, 255] },\n { value: 0.8, color: [255, 102, 204] },\n { value: 0.9, color: [255, 102, 102] },\n { value: 1, color: [255, 0, 0] },\n ],\n }),\n\n /**\n * Classic rainbow color ramp.\n * Defined in interval [0, 1], without unit.\n */\n RAINBOW: new ColorRamp({\n stops: [\n { value: 0, color: [150, 0, 90] },\n { value: 0.125, color: [0, 0, 200] },\n { value: 0.25, color: [0, 25, 255] },\n { value: 0.375, color: [0, 152, 255] },\n { value: 0.5, color: [44, 255, 150] },\n { value: 0.625, color: [151, 255, 0] },\n { value: 0.75, color: [255, 234, 0] },\n { value: 0.875, color: [255, 111, 0] },\n { value: 1, color: [255, 0, 0] },\n ],\n }),\n\n /**\n * Classic Portland color ramp.\n * Defined in interval [0, 1], without unit.\n */\n PORTLAND: new ColorRamp({\n stops: [\n { value: 0, color: [12, 51, 131] },\n { value: 0.25, color: [10, 136, 186] },\n { value: 0.5, color: [242, 211, 56] },\n { value: 0.75, color: [242, 143, 56] },\n { value: 1, color: [217, 30, 30] },\n ],\n }),\n\n /**\n * Classic blackbody color ramp.\n * Defined in interval [0, 1], without unit.\n */\n BLACKBODY: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.2, color: [230, 0, 0] },\n { value: 0.4, color: [230, 210, 0] },\n { value: 0.7, color: [255, 255, 255] },\n { value: 1, color: [160, 200, 255] },\n ],\n }),\n\n /**\n * Classic earth color ramp.\n * Defined in interval [0, 1], without unit.\n */\n EARTH: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 130] },\n { value: 0.1, color: [0, 180, 180] },\n { value: 0.2, color: [40, 210, 40] },\n { value: 0.4, color: [230, 230, 50] },\n { value: 0.6, color: [120, 70, 20] },\n { value: 1, color: [255, 255, 255] },\n ],\n }),\n\n /**\n * Classic electric color ramp.\n * Defined in interval [0, 1], without unit.\n */\n ELECTRIC: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.15, color: [30, 0, 100] },\n { value: 0.4, color: [120, 0, 100] },\n { value: 0.6, color: [160, 90, 0] },\n { value: 0.8, color: [230, 200, 0] },\n { value: 1, color: [255, 250, 220] },\n ],\n }),\n\n /**\n * Classic viridis color ramp.\n * Defined in interval [0, 1], without unit.\n */\n VIRIDIS: new ColorRamp({\n stops: [\n { value: 0, color: [68, 1, 84] },\n { value: 0.13, color: [71, 44, 122] },\n { value: 0.25, color: [59, 81, 139] },\n { value: 0.38, color: [44, 113, 142] },\n { value: 0.5, color: [33, 144, 141] },\n { value: 0.63, color: [39, 173, 129] },\n { value: 0.75, color: [92, 200, 99] },\n { value: 0.88, color: [170, 220, 50] },\n { value: 1, color: [253, 231, 37] },\n ],\n }),\n\n /**\n * Classic inferno color ramp.\n * Defined in interval [0, 1], without unit.\n */\n INFERNO: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 4] },\n { value: 0.13, color: [31, 12, 72] },\n { value: 0.25, color: [85, 15, 109] },\n { value: 0.38, color: [136, 34, 106] },\n { value: 0.5, color: [186, 54, 85] },\n { value: 0.63, color: [227, 89, 51] },\n { value: 0.75, color: [249, 140, 10] },\n { value: 0.88, color: [249, 201, 50] },\n { value: 1, color: [252, 255, 164] },\n ],\n }),\n\n /**\n * Classic magma color ramp.\n * Defined in interval [0, 1], without unit.\n */\n MAGMA: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 4] },\n { value: 0.13, color: [28, 16, 68] },\n { value: 0.25, color: [79, 18, 123] },\n { value: 0.38, color: [129, 37, 129] },\n { value: 0.5, color: [181, 54, 122] },\n { value: 0.63, color: [229, 80, 100] },\n { value: 0.75, color: [251, 135, 97] },\n { value: 0.88, color: [254, 194, 135] },\n { value: 1, color: [252, 253, 191] },\n ],\n }),\n\n /**\n * Classic plasma color ramp.\n * Defined in interval [0, 1], without unit.\n */\n PLASMA: new ColorRamp({\n stops: [\n { value: 0, color: [13, 8, 135] },\n { value: 0.13, color: [75, 3, 161] },\n { value: 0.25, color: [125, 3, 168] },\n { value: 0.38, color: [168, 34, 150] },\n { value: 0.5, color: [203, 70, 121] },\n { value: 0.63, color: [229, 107, 93] },\n { value: 0.75, color: [248, 148, 65] },\n { value: 0.88, color: [253, 195, 40] },\n { value: 1, color: [240, 249, 33] },\n ],\n }),\n\n /**\n * Classic warm color ramp.\n * Defined in interval [0, 1], without unit.\n */\n WARM: new ColorRamp({\n stops: [\n { value: 0, color: [125, 0, 179] },\n { value: 0.13, color: [172, 0, 187] },\n { value: 0.25, color: [219, 0, 170] },\n { value: 0.38, color: [255, 0, 130] },\n { value: 0.5, color: [255, 63, 74] },\n { value: 0.63, color: [255, 123, 0] },\n { value: 0.75, color: [234, 176, 0] },\n { value: 0.88, color: [190, 228, 0] },\n { value: 1, color: [147, 255, 0] },\n ],\n }),\n\n /**\n * Classic cool color ramp.\n * Defined in interval [0, 1], without unit.\n */\n COOL: new ColorRamp({\n stops: [\n { value: 0, color: [125, 0, 179] },\n { value: 0.13, color: [116, 0, 218] },\n { value: 0.25, color: [98, 74, 237] },\n { value: 0.38, color: [68, 146, 231] },\n { value: 0.5, color: [0, 204, 197] },\n { value: 0.63, color: [0, 247, 146] },\n { value: 0.75, color: [0, 255, 88] },\n { value: 0.88, color: [40, 255, 8] },\n { value: 1, color: [147, 255, 0] },\n ],\n }),\n\n /**\n * Classic rainboz soft color ramp.\n * Defined in interval [0, 1], without unit.\n */\n RAINBOW_SOFT: new ColorRamp({\n stops: [\n { value: 0, color: [125, 0, 179] },\n { value: 0.1, color: [199, 0, 180] },\n { value: 0.2, color: [255, 0, 121] },\n { value: 0.3, color: [255, 108, 0] },\n { value: 0.4, color: [222, 194, 0] },\n { value: 0.5, color: [150, 255, 0] },\n { value: 0.6, color: [0, 255, 55] },\n { value: 0.7, color: [0, 246, 150] },\n { value: 0.8, color: [50, 167, 222] },\n { value: 0.9, color: [103, 51, 235] },\n { value: 1, color: [124, 0, 186] },\n ],\n }),\n\n /**\n * Classic bathymetry color ramp.\n * Defined in interval [0, 1], without unit.\n */\n BATHYMETRY: new ColorRamp({\n stops: [\n { value: 0, color: [40, 26, 44] },\n { value: 0.13, color: [59, 49, 90] },\n { value: 0.25, color: [64, 76, 139] },\n { value: 0.38, color: [63, 110, 151] },\n { value: 0.5, color: [72, 142, 158] },\n { value: 0.63, color: [85, 174, 163] },\n { value: 0.75, color: [120, 206, 163] },\n { value: 0.88, color: [187, 230, 172] },\n { value: 1, color: [253, 254, 204] },\n ],\n }),\n\n /**\n * Classic cdom color ramp.\n * Defined in interval [0, 1], without unit.\n */\n CDOM: new ColorRamp({\n stops: [\n { value: 0, color: [47, 15, 62] },\n { value: 0.13, color: [87, 23, 86] },\n { value: 0.25, color: [130, 28, 99] },\n { value: 0.38, color: [171, 41, 96] },\n { value: 0.5, color: [206, 67, 86] },\n { value: 0.63, color: [230, 106, 84] },\n { value: 0.75, color: [242, 149, 103] },\n { value: 0.88, color: [249, 193, 135] },\n { value: 1, color: [254, 237, 176] },\n ],\n }),\n\n /**\n * Classic chlorophyll color ramp.\n * Defined in interval [0, 1], without unit.\n */\n CHLOROPHYLL: new ColorRamp({\n stops: [\n { value: 0, color: [18, 36, 20] },\n { value: 0.13, color: [25, 63, 41] },\n { value: 0.25, color: [24, 91, 59] },\n { value: 0.38, color: [13, 119, 72] },\n { value: 0.5, color: [18, 148, 80] },\n { value: 0.63, color: [80, 173, 89] },\n { value: 0.75, color: [132, 196, 122] },\n { value: 0.88, color: [175, 221, 162] },\n { value: 1, color: [215, 249, 208] },\n ],\n }),\n\n /**\n * Classic density color ramp.\n * Defined in interval [0, 1], without unit.\n */\n DENSITY: new ColorRamp({\n stops: [\n { value: 0, color: [54, 14, 36] },\n { value: 0.13, color: [89, 23, 80] },\n { value: 0.25, color: [110, 45, 132] },\n { value: 0.38, color: [120, 77, 178] },\n { value: 0.5, color: [120, 113, 213] },\n { value: 0.63, color: [115, 151, 228] },\n { value: 0.75, color: [134, 185, 227] },\n { value: 0.88, color: [177, 214, 227] },\n { value: 1, color: [230, 241, 241] },\n ],\n }),\n\n /**\n * Classic freesurface blue color ramp.\n * Defined in interval [0, 1], without unit.\n */\n FREESURFACE_BLUE: new ColorRamp({\n stops: [\n { value: 0, color: [30, 4, 110] },\n { value: 0.13, color: [47, 14, 176] },\n { value: 0.25, color: [41, 45, 236] },\n { value: 0.38, color: [25, 99, 212] },\n { value: 0.5, color: [68, 131, 200] },\n { value: 0.63, color: [114, 156, 197] },\n { value: 0.75, color: [157, 181, 203] },\n { value: 0.88, color: [200, 208, 216] },\n { value: 1, color: [241, 237, 236] },\n ],\n }),\n\n /**\n * Classic freesurface red color ramp.\n * Defined in interval [0, 1], without unit.\n */\n FREESURFACE_RED: new ColorRamp({\n stops: [\n { value: 0, color: [60, 9, 18] },\n { value: 0.13, color: [100, 17, 27] },\n { value: 0.25, color: [142, 20, 29] },\n { value: 0.38, color: [177, 43, 27] },\n { value: 0.5, color: [192, 87, 63] },\n { value: 0.63, color: [205, 125, 105] },\n { value: 0.75, color: [216, 162, 148] },\n { value: 0.88, color: [227, 199, 193] },\n { value: 1, color: [241, 237, 236] },\n ],\n }),\n\n /**\n * Classic oxygen color ramp.\n * Defined in interval [0, 1], without unit.\n */\n OXYGEN: new ColorRamp({\n stops: [\n { value: 0, color: [64, 5, 5] },\n { value: 0.13, color: [106, 6, 15] },\n { value: 0.25, color: [144, 26, 7] },\n { value: 0.38, color: [168, 64, 3] },\n { value: 0.5, color: [188, 100, 4] },\n { value: 0.63, color: [206, 136, 11] },\n { value: 0.75, color: [220, 174, 25] },\n { value: 0.88, color: [231, 215, 44] },\n { value: 1, color: [248, 254, 105] },\n ],\n }),\n\n /**\n * Classic par color ramp.\n * Defined in interval [0, 1], without unit.\n */\n PAR: new ColorRamp({\n stops: [\n { value: 0, color: [51, 20, 24] },\n { value: 0.13, color: [90, 32, 35] },\n { value: 0.25, color: [129, 44, 34] },\n { value: 0.38, color: [159, 68, 25] },\n { value: 0.5, color: [182, 99, 19] },\n { value: 0.63, color: [199, 134, 22] },\n { value: 0.75, color: [212, 171, 35] },\n { value: 0.88, color: [221, 210, 54] },\n { value: 1, color: [225, 253, 75] },\n ],\n }),\n\n /**\n * Classic phase color ramp.\n * Defined in interval [0, 1], without unit.\n */\n PHASE: new ColorRamp({\n stops: [\n { value: 0, color: [145, 105, 18] },\n { value: 0.13, color: [184, 71, 38] },\n { value: 0.25, color: [186, 58, 115] },\n { value: 0.38, color: [160, 71, 185] },\n { value: 0.5, color: [110, 97, 218] },\n { value: 0.63, color: [50, 123, 164] },\n { value: 0.75, color: [31, 131, 110] },\n { value: 0.88, color: [77, 129, 34] },\n { value: 1, color: [145, 105, 18] },\n ],\n }),\n\n /**\n * Classic salinity color ramp.\n * Defined in interval [0, 1], without unit.\n */\n SALINITY: new ColorRamp({\n stops: [\n { value: 0, color: [42, 24, 108] },\n { value: 0.13, color: [33, 50, 162] },\n { value: 0.25, color: [15, 90, 145] },\n { value: 0.38, color: [40, 118, 137] },\n { value: 0.5, color: [59, 146, 135] },\n { value: 0.63, color: [79, 175, 126] },\n { value: 0.75, color: [120, 203, 104] },\n { value: 0.88, color: [193, 221, 100] },\n { value: 1, color: [253, 239, 154] },\n ],\n }),\n\n /**\n * Classic temperature color ramp.\n * Defined in interval [0, 1], without unit.\n */\n TEMPERATURE: new ColorRamp({\n stops: [\n { value: 0, color: [4, 35, 51] },\n { value: 0.13, color: [23, 51, 122] },\n { value: 0.25, color: [85, 59, 157] },\n { value: 0.38, color: [129, 79, 143] },\n { value: 0.5, color: [175, 95, 130] },\n { value: 0.63, color: [222, 112, 101] },\n { value: 0.75, color: [249, 146, 66] },\n { value: 0.88, color: [249, 196, 65] },\n { value: 1, color: [232, 250, 91] },\n ],\n }),\n\n /**\n * Classic turbidity color ramp.\n * Defined in interval [0, 1], without unit.\n */\n TURBIDITY: new ColorRamp({\n stops: [\n { value: 0, color: [34, 31, 27] },\n { value: 0.13, color: [65, 50, 41] },\n { value: 0.25, color: [98, 69, 52] },\n { value: 0.38, color: [131, 89, 57] },\n { value: 0.5, color: [161, 112, 59] },\n { value: 0.63, color: [185, 140, 66] },\n { value: 0.75, color: [202, 174, 88] },\n { value: 0.88, color: [216, 209, 126] },\n { value: 1, color: [233, 246, 171] },\n ],\n }),\n\n /**\n * Classic velocity blue color ramp.\n * Defined in interval [0, 1], without unit.\n */\n VELOCITY_BLUE: new ColorRamp({\n stops: [\n { value: 0, color: [17, 32, 64] },\n { value: 0.13, color: [35, 52, 116] },\n { value: 0.25, color: [29, 81, 156] },\n { value: 0.38, color: [31, 113, 162] },\n { value: 0.5, color: [50, 144, 169] },\n { value: 0.63, color: [87, 173, 176] },\n { value: 0.75, color: [149, 196, 189] },\n { value: 0.88, color: [203, 221, 211] },\n { value: 1, color: [254, 251, 230] },\n ],\n }),\n\n /**\n * Classic velocity green color ramp.\n * Defined in interval [0, 1], without unit.\n */\n VELOCITY_GREEN: new ColorRamp({\n stops: [\n { value: 0, color: [23, 35, 19] },\n { value: 0.13, color: [24, 64, 38] },\n { value: 0.25, color: [11, 95, 45] },\n { value: 0.38, color: [39, 123, 35] },\n { value: 0.5, color: [95, 146, 12] },\n { value: 0.63, color: [152, 165, 18] },\n { value: 0.75, color: [201, 186, 69] },\n { value: 0.88, color: [233, 216, 137] },\n { value: 1, color: [255, 253, 205] },\n ],\n }),\n\n /**\n * Classic cube helix color ramp.\n * Defined in interval [0, 1], without unit.\n */\n CUBEHELIX: new ColorRamp({\n stops: [\n { value: 0, color: [0, 0, 0] },\n { value: 0.07, color: [22, 5, 59] },\n { value: 0.13, color: [60, 4, 105] },\n { value: 0.2, color: [109, 1, 135] },\n { value: 0.27, color: [161, 0, 147] },\n { value: 0.33, color: [210, 2, 142] },\n { value: 0.4, color: [251, 11, 123] },\n { value: 0.47, color: [255, 29, 97] },\n { value: 0.53, color: [255, 54, 69] },\n { value: 0.6, color: [255, 85, 46] },\n { value: 0.67, color: [255, 120, 34] },\n { value: 0.73, color: [255, 157, 37] },\n { value: 0.8, color: [241, 191, 57] },\n { value: 0.87, color: [224, 220, 93] },\n { value: 0.93, color: [218, 241, 142] },\n { value: 1, color: [227, 253, 198] },\n ],\n }),\n\n /**\n * The cividis color ramp is color blind friendly.\n * Read more here https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0199239\n * Defined in interval [0, 1], without unit.\n */\n CIVIDIS: new ColorRamp({\n stops: [\n { value: 0, color: [0, 32, 77, 255] },\n { value: 0.125, color: [5, 54, 110, 255] },\n { value: 0.25, color: [65, 77, 108, 255] },\n { value: 0.375, color: [97, 100, 111, 255] },\n { value: 0.5, color: [125, 124, 121, 255] },\n { value: 0.625, color: [156, 149, 120, 255] },\n { value: 0.75, color: [190, 175, 111, 255] },\n { value: 0.875, color: [225, 204, 94, 255] },\n { value: 1, color: [255, 235, 70, 255] },\n ],\n }),\n\n /**\n * Classic turbo color ramp.\n * This is a luminance-constant alternative to the jet, making it more\n * clor-blind friendly.\n * Defined in interval [0, 1], without unit.\n */\n TURBO: new ColorRamp({\n stops: [\n { value: 0, color: [48, 18, 59, 255] },\n { value: 0.125, color: [70, 107, 227, 255] },\n { value: 0.25, color: [40, 187, 236, 255] },\n { value: 0.375, color: [49, 242, 153, 255] },\n { value: 0.5, color: [162, 252, 60, 255] },\n { value: 0.625, color: [237, 208, 58, 255] },\n { value: 0.75, color: [251, 128, 34, 255] },\n { value: 0.875, color: [210, 49, 5, 255] },\n { value: 1, color: [122, 4, 3, 255] },\n ],\n }),\n\n /**\n * The rocket color ramp is perceptually uniform, which makes it more\n * color bliend friendly than the classic magma color ramp.\n * Defined in interval [0, 1], without unit.\n */\n ROCKET: new ColorRamp({\n stops: [\n { value: 0, color: [250, 235, 221, 0] },\n { value: 0.133, color: [250, 235, 221, 255] },\n { value: 0.266, color: [246, 170, 130, 255] },\n { value: 0.4, color: [240, 96, 67, 255] },\n { value: 0.533, color: [203, 27, 79, 255] },\n { value: 0.666, color: [132, 30, 90, 255] },\n { value: 0.8, color: [63, 27, 68, 255] },\n { value: 1, color: [3, 5, 26, 255] },\n ],\n }),\n\n /**\n * The mako color ramp is perceptually uniform and can be seen as\n * a color blind friendly alternative to bathymetry or yignbu.\n * Defined in interval [0, 1], without unit.\n */\n MAKO: new ColorRamp({\n stops: [\n { value: 0, color: [11, 4, 5, 255] },\n { value: 0.125, color: [43, 28, 53, 255] },\n { value: 0.25, color: [62, 53, 107, 255] },\n { value: 0.375, color: [59, 86, 152, 255] },\n { value: 0.5, color: [53, 123, 162, 255] },\n { value: 0.625, color: [53, 158, 170, 255] },\n { value: 0.75, color: [73, 193, 173, 255] },\n { value: 0.875, color: [150, 221, 181, 255] },\n { value: 1, color: [222, 245, 229, 255] },\n ],\n }),\n};\n","import {\n DataDrivenPropertyValueSpecification,\n ExpressionSpecification,\n} from \"maplibre-gl\";\nimport { generateRandomString } from \"../tools\";\nimport { ColorRamp, RgbaColor } from \"../colorramp\";\nimport {\n DataDrivenStyle,\n PropertyValues,\n ZoomNumberValues,\n ZoomStringValues,\n} from \"./vectorlayerhelpers\";\n\nexport type ColorPalette = [string, string, string, string];\n\nexport const colorPalettes: Array<ColorPalette> = [\n // https://colorhunt.co/palette/1d5b79468b97ef6262f3aa60\n [\"#1D5B79\", \"#468B97\", \"#EF6262\", \"#F3AA60\"],\n\n // https://colorhunt.co/palette/614bc333bbc585e6c5c8ffe0\n [\"#614BC3\", \"#33BBC5\", \"#85E6C5\", \"#C8FFE0\"],\n\n // https://colorhunt.co/palette/4619597a316fcd6688aed8cc\n [\"#461959\", \"#7A316F\", \"#CD6688\", \"#AED8CC\"],\n\n // https://colorhunt.co/palette/0079ff00dfa2f6fa70ff0060\n [\"#0079FF\", \"#00DFA2\", \"#F6FA70\", \"#FF0060\"],\n\n //https://colorhunt.co/palette/39b5e0a31acbff78f0f5ea5a\n [\"#39B5E0\", \"#A31ACB\", \"#FF78F0\", \"#F5EA5A\"],\n\n // https://colorhunt.co/palette/37e2d5590696c70a80fbcb0a\n [\"#37E2D5\", \"#590696\", \"#C70A80\", \"#FBCB0A\"],\n\n // https://colorhunt.co/palette/ffd36efff56d99ffcd9fb4ff\n [\"#FFD36E\", \"#FFF56D\", \"#99FFCD\", \"#9FB4FF\"],\n\n // https://colorhunt.co/palette/00ead3fff5b7ff449f005f99\n [\"#00EAD3\", \"#FFF5B7\", \"#FF449F\", \"#005F99\"],\n\n // https://colorhunt.co/palette/10a19d540375ff7000ffbf00\n [\"#10A19D\", \"#540375\", \"#FF7000\", \"#FFBF00\"],\n];\n\nexport function getRandomColor(): string {\n return colorPalettes[~~(Math.random() * colorPalettes.length)][\n ~~(Math.random() * 4)\n ];\n}\n\nexport function generateRandomSourceName(): string {\n return `maptiler_source_${generateRandomString()}`;\n}\n\nexport function generateRandomLayerName(): string {\n return `maptiler_layer_${generateRandomString()}`;\n}\n\n/**\n * Linera interpolation to find a value at an arbitrary zoom level, given a list of tuple zoom-value\n */\nexport function lerpZoomNumberValues(znv: ZoomNumberValues, z: number): number {\n // before the range\n if (z <= znv[0].zoom) {\n return znv[0].value;\n }\n\n // after the range\n if (z >= znv[znv.length - 1].zoom) {\n return znv[znv.length - 1].value;\n }\n\n // somewhere within the range\n for (let i = 0; i < znv.length - 1; i += 1) {\n if (z >= znv[i].zoom && z < znv[i + 1].zoom) {\n const zoomRange = znv[i + 1].zoom - znv[i].zoom;\n const normalizedDistanceFromLowerBound = (z - znv[i].zoom) / zoomRange;\n return (\n normalizedDistanceFromLowerBound * znv[i + 1].value +\n (1 - normalizedDistanceFromLowerBound) * znv[i].value\n );\n }\n }\n\n return 0;\n}\n\nexport function paintColorOptionsToPaintSpec(\n color: ZoomStringValues,\n): DataDrivenPropertyValueSpecification<string> {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ...color.map((el) => [el.zoom, el.value]).flat(),\n ];\n}\n\nexport function rampedOptionsToLayerPaintSpec(\n ramp: ZoomNumberValues,\n): DataDrivenPropertyValueSpecification<number> {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ...ramp.map((el) => [el.zoom, el.value]).flat(),\n ];\n}\n\nexport function computeRampedOutlineWidth(\n lineWidth: number | ZoomNumberValues,\n outlineWidth: number | ZoomNumberValues,\n): number | DataDrivenPropertyValueSpecification<number> {\n // case 1: the line is fixed-width and the outline is fixed-width\n if (typeof outlineWidth === \"number\" && typeof lineWidth === \"number\") {\n return 2 * outlineWidth + lineWidth;\n }\n\n // case 2: the line is ramped-width, the outline is fixed-width\n else if (typeof outlineWidth === \"number\" && Array.isArray(lineWidth)) {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ...lineWidth.map((el) => [el.zoom, 2 * outlineWidth + el.value]).flat(),\n ];\n }\n\n // case 3: the line is fixed-width, the outline is ramped-width\n else if (typeof lineWidth === \"number\" && Array.isArray(outlineWidth)) {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ...outlineWidth.map((el) => [el.zoom, 2 * el.value + lineWidth]).flat(),\n ];\n }\n\n // case 4: the line is ramped-width, the outline is ramped-width\n if (Array.isArray(lineWidth) && Array.isArray(outlineWidth)) {\n // We must create an artificial set of zoom stops that includes all the zoom stops from both lists\n // const allStops = [...lineWidth.map(el => el.zoom), ...outlineWidth.map(el => el.zoom)].sort((a: number, b: number) => a < b ? -1 : 1);\n const allStops = Array.from(\n new Set([\n ...lineWidth.map((el) => el.zoom),\n ...outlineWidth.map((el) => el.zoom),\n ]),\n ).sort((a: number, b: number) => (a < b ? -1 : 1));\n\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ...allStops\n .map((z) => [\n z,\n 2 * lerpZoomNumberValues(outlineWidth, z) +\n lerpZoomNumberValues(lineWidth, z),\n ])\n .flat(),\n ];\n }\n\n return 0;\n}\n\nexport function rampedPropertyValueWeight(\n ramp: PropertyValues,\n property: string,\n): DataDrivenPropertyValueSpecification<number> {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...ramp.map((el) => [el.propertyValue, el.value]).flat(),\n ];\n}\n\n/**\n * Create a dash array from a string pattern that uses underscore and whitespace characters\n */\nexport function dashArrayMaker(pattern: string): Array<number> {\n // if the pattern starts with whitespaces, then move them towards the end\n const startTrimmedPattern = pattern.trimStart();\n const fixedPattern = `${startTrimmedPattern}${\" \".repeat(\n pattern.length - startTrimmedPattern.length,\n )}`;\n const patternArr = Array.from(fixedPattern);\n\n const isOnlyDashesAndSpaces = patternArr.every((c) => c === \" \" || c === \"_\");\n if (!isOnlyDashesAndSpaces) {\n throw new Error(\n \"A dash pattern must be composed only of whitespace and underscore characters.\",\n );\n }\n\n const hasBothDashesAndWhitespaces =\n patternArr.some((c) => c === \"_\") && patternArr.some((c) => c === \" \");\n if (!hasBothDashesAndWhitespaces) {\n throw new Error(\n \"A dash pattern must contain at least one underscore and one whitespace character\",\n );\n }\n\n const dashArray = [1];\n\n for (let i = 1; i < patternArr.length; i += 1) {\n const previous = patternArr[i - 1];\n const current = patternArr[i];\n\n if (previous === current) {\n dashArray[dashArray.length - 1] += 1;\n } else {\n dashArray.push(1);\n }\n }\n\n return dashArray;\n}\n\nexport function colorDrivenByProperty(\n style: DataDrivenStyle,\n property: string,\n): DataDrivenPropertyValueSpecification<string> {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.color]).flat(),\n ];\n}\n\nexport function radiusDrivenByProperty(\n style: DataDrivenStyle,\n property: string,\n zoomCompensation = true,\n): DataDrivenPropertyValueSpecification<number> {\n if (!zoomCompensation) {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius]).flat(),\n ];\n }\n\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n\n 0,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius * 0.025]).flat(),\n ],\n\n 2,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius * 0.05]).flat(),\n ],\n\n 4,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius * 0.1]).flat(),\n ],\n\n 8,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius * 0.25]).flat(),\n ],\n\n 16,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.value, el.pointRadius]).flat(),\n ],\n ];\n}\n\nexport function radiusDrivenByPropertyHeatmap(\n style: PropertyValues,\n property: string,\n zoomCompensation = true,\n): DataDrivenPropertyValueSpecification<number> {\n if (!zoomCompensation) {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value]).flat(),\n ];\n }\n\n return [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n\n 0,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value * 0.025]).flat(),\n ],\n\n 2,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value * 0.05]).flat(),\n ],\n\n 4,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value * 0.1]).flat(),\n ],\n\n 8,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value * 0.25]).flat(),\n ],\n\n 16,\n [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...style.map((el) => [el.propertyValue, el.value]).flat(),\n ],\n ];\n}\n\n/**\n * Turns a ColorRamp instance into a MapLibre style for ramping the opacity, driven by a property\n */\nexport function opacityDrivenByProperty(\n colorramp: ColorRamp,\n property: string,\n): DataDrivenPropertyValueSpecification<number> {\n // If all opacities are the same, just return the number without any ramping logic\n if (colorramp.every((el) => el.color[3] === colorramp[0].color[3])) {\n return colorramp[0].color[3] ? colorramp[0].color[3] / 255 : 1;\n }\n\n return [\n \"interpolate\",\n [\"linear\"],\n [\"get\", property],\n ...colorramp\n .getRawColorStops()\n .map((el) => {\n const value = el.value;\n const color: RgbaColor = el.color;\n return [value, color.length === 4 ? color[3] / 255 : 1];\n })\n .flat(),\n ];\n}\n\nexport function heatmapIntensityFromColorRamp(\n colorRamp: ColorRamp,\n steps = 10,\n): ExpressionSpecification {\n return [\n \"interpolate\",\n [\"linear\"],\n [\"heatmap-density\"],\n ...Array.from({ length: steps + 1 }, (_, i) => {\n const unitStep = i / steps;\n return [unitStep, colorRamp.getColorHex(unitStep)];\n }).flat(),\n ];\n}\n","import type { Geometry, FeatureCollection, GeoJsonProperties } from \"geojson\";\nimport type {\n DataDrivenPropertyValueSpecification,\n PropertyValueSpecification,\n} from \"maplibre-gl\";\nimport type { Map } from \"../Map\";\nimport { config } from \"../config\";\nimport { isUUID, jsonParseNoThrow } from \"../tools\";\nimport {\n computeRampedOutlineWidth,\n generateRandomLayerName,\n generateRandomSourceName,\n getRandomColor,\n paintColorOptionsToPaintSpec,\n rampedOptionsToLayerPaintSpec,\n dashArrayMaker,\n colorDrivenByProperty,\n radiusDrivenByProperty,\n opacityDrivenByProperty,\n heatmapIntensityFromColorRamp,\n rampedPropertyValueWeight,\n radiusDrivenByPropertyHeatmap,\n} from \"./stylehelper\";\n\nimport { gpx, gpxOrKml, kml } from \"../converters\";\nimport { ColorRampCollection, ColorRamp } from \"../colorramp\";\n\n/**\n * Array of string values that depend on zoom level\n */\nexport type ZoomStringValues = Array<{\n /**\n * Zoom level\n */\n zoom: number;\n\n /**\n * Value for the given zoom level\n */\n value: string;\n}>;\n\n/**\n *\n * Array of number values that depend on zoom level\n */\nexport type ZoomNumberValues = Array<{\n /**\n * Zoom level\n */\n zoom: number;\n\n /**\n * Value for the given zoom level\n */\n value: number;\n}>;\n\nexport type PropertyValues = Array<{\n /**\n * Value of the property (input)\n */\n propertyValue: number;\n\n /**\n * Value to associate it with (output)\n */\n value: number;\n}>;\n\n/**\n * Describes how to render a cluster of points\n */\nexport type DataDrivenStyle = Array<{\n /**\n * Numerical value to observe and apply the style upon.\n * In case of clusters, the value to observe is automatically the number of elements in a cluster.\n * In other cases, it can be a provided value.\n */\n value: number;\n\n /**\n * Radius of the cluster circle\n */\n pointRadius: number;\n\n /**\n * Color of the cluster\n */\n color: string;\n}>;\n\nexport type CommonShapeLayerOptions = {\n /**\n * ID to give to the layer.\n * If not provided, an auto-generated ID of the for \"maptiler-layer-xxxxxx\" will be auto-generated,\n * with \"xxxxxx\" being a random string.\n */\n layerId?: string;\n\n /**\n * ID to give to the geojson source.\n * If not provided, an auto-generated ID of the for \"maptiler-source-xxxxxx\" will be auto-generated,\n * with \"xxxxxx\" being a random string.\n */\n sourceId?: string;\n\n /**\n * A geojson Feature collection or a URL to a geojson or the UUID of a MapTiler Cloud dataset.\n */\n data: FeatureCollection | string;\n\n /**\n * The ID of an existing layer to insert the new layer before, resulting in the new layer appearing\n * visually beneath the existing layer. If this argument is not specified, the layer will be appended\n * to the end of the layers array and appear visually above all other layers.\n */\n beforeId?: string;\n\n /**\n * Zoom level at which it starts to show.\n * Default: `0`\n */\n minzoom?: number;\n\n /**\n * Zoom level after which it no longer show.\n * Default: `22`\n */\n maxzoom?: number;\n\n /**\n * Whether or not to add an outline.\n * Default: `false`\n */\n outline?: boolean;\n\n /**\n * Color of the outline. This is can be a constant color string or a definition based on zoom levels.\n * Applies only if `.outline` is `true`.\n * Default: `white`\n */\n outlineColor?: string | ZoomStringValues;\n\n /**\n * Width of the outline (relative to screen-space). This is can be a constant width or a definition based on zoom levels.\n * Applies only if `.outline` is `true`.\n * Default: `1`\n */\n outlineWidth?: number | ZoomNumberValues;\n\n /**\n * Opacity of the outline. This is can be a constant opacity in [0, 1] or a definition based on zoom levels\n * Applies only if `.outline` is `true`.\n * Default: `1`\n */\n outlineOpacity?: number | ZoomNumberValues;\n};\n\nexport type PolylineLayerOptions = CommonShapeLayerOptions & {\n /**\n * Color of the line (or polyline). This is can be a constant color string or a definition based on zoom levels.\n * Default: a color randomly pick from a list\n */\n lineColor?: string | ZoomStringValues;\n\n /**\n * Width of the line (relative to screen-space). This is can be a constant width or a definition based on zoom levels\n * Default: `3`\n */\n lineWidth?: number | ZoomNumberValues;\n\n /**\n * Opacity of the line. This is can be a constant opacity in [0, 1] or a definition based on zoom levels.\n * Default: `1`\n */\n lineOpacity?: number | ZoomNumberValues;\n\n /**\n * How blury the line is, with `0` being no blur and `10` and beyond being quite blurry.\n * Default: `0`\n */\n lineBlur?: number | ZoomNumberValues;\n\n /**\n * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\n * Default: `0`\n */\n lineGapWidth?: number | ZoomNumberValues;\n\n /**\n * Sequence of line and void to create a dash pattern. The unit is the line width so that\n * a dash array value of `[3, 1]` will create a segment worth 3 times the width of the line,\n * followed by a spacing worth 1 time the line width, and then repeat.\n *\n * Alternatively, this property can be a string made of underscore and whitespace characters\n * such as `\"___ _ \"` and internaly this will be translated into [3, 1, 1, 1]. Note that\n * this way of describing dash arrays with a string only works for integer values.\n *\n * Dash arrays can contain more than 2 element to create more complex patters. For instance\n * a dash array value of [3, 2, 1, 2] will create the following sequence:\n * - a segment worth 3 times the width\n * - a spacing worth 2 times the width\n * - a segment worth 1 times the width\n * - a spacing worth 2 times the width\n * - repeat\n *\n * Default: no dash pattern\n */\n lineDashArray?: Array<number> | string;\n\n /**\n * The display of line endings for both the line and the outline (if `.outline` is `true`)\n * - \"butt\": A cap with a squared-off end which is drawn to the exact endpoint of the line.\n * - \"round\": A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n * - \"square\": A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n * Default: \"round\"\n */\n lineCap?: \"butt\" | \"round\" | \"square\";\n\n /**\n * The display of lines when joining for both the line and the outline (if `.outline` is `true`)\n * - \"bevel\": A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n * - \"round\": A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n * - \"miter\": A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\n * Default: \"round\"\n */\n lineJoin?: \"bevel\" | \"round\" | \"miter\";\n\n /**\n * How blury the outline is, with `0` being no blur and `10` and beyond being quite blurry.\n * Applies only if `.outline` is `true`.\n * Default: `0`\n */\n outlineBlur?: number | ZoomNumberValues;\n};\n\nexport type PolygonLayerOptions = CommonShapeLayerOptions & {\n /**\n * Color of the polygon. This is can be a constant color string or a definition based on zoom levels.\n * Default: a color randomly pick from a list\n */\n fillColor?: string | ZoomStringValues;\n\n /**\n * Opacity of the polygon. This is can be a constant opacity in [0, 1] or a definition based on zoom levels\n * Default: `1`\n */\n fillOpacity?: ZoomNumberValues;\n\n /**\n * Position of the outline with regard to the polygon edge (when `.outline` is `true`)\n * Default: `\"center\"`\n */\n outlinePosition: \"center\" | \"inside\" | \"outside\";\n\n /**\n * Sequence of line and void to create a dash pattern. The unit is the line width so that\n * a dash array value of `[3, 1]` will create a segment worth 3 times the width of the line,\n * followed by a spacing worth 1 time the line width, and then repeat.\n *\n * Alternatively, this property can be a string made of underscore and whitespace characters\n * such as `\"___ _ \"` and internaly this will be translated into [3, 1, 1, 1]. Note that\n * this way of describing dash arrays with a string only works for integer values.\n *\n * Dash arrays can contain more than 2 element to create more complex patters. For instance\n * a dash array value of [3, 2, 1, 2] will create the following sequence:\n * - a segment worth 3 times the width\n * - a spacing worth 2 times the width\n * - a segment worth 1 times the width\n * - a spacing worth 2 times the width\n * - repeat\n *\n * Default: no dash pattern\n */\n outlineDashArray?: Array<number> | string;\n\n /**\n * The display of line endings for both the line and the outline (if `.outline` is `true`)\n * - \"butt\": A cap with a squared-off end which is drawn to the exact endpoint of the line.\n * - \"round\": A cap with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n * - \"square\": A cap with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n * Default: \"round\"\n */\n outlineCap?: \"butt\" | \"round\" | \"square\";\n\n /**\n * The display of lines when joining for both the line and the outline (if `.outline` is `true`)\n * - \"bevel\": A join with a squared-off end which is drawn beyond the endpoint of the line at a distance of one-half of the line's width.\n * - \"round\": A join with a rounded end which is drawn beyond the endpoint of the line at a radius of one-half of the line's width and centered on the endpoint of the line.\n * - \"miter\": A join with a sharp, angled corner which is drawn with the outer sides beyond the endpoint of the path until they meet.\n * Default: \"round\"\n */\n outlineJoin?: \"bevel\" | \"round\" | \"miter\";\n\n /**\n * The pattern is an image URL to be put as a repeated background pattern of the polygon.\n * Default: `null` (no pattern, `fillColor` will be used)\n */\n pattern?: string | null;\n\n /**\n * How blury the outline is, with `0` being no blur and `10` and beyond being quite blurry.\n * Applies only if `.outline` is `true`.\n * Default: `0`\n */\n outlineBlur?: number | ZoomNumberValues;\n};\n\nexport type PointLayerOptions = CommonShapeLayerOptions & {\n /**\n * Can be a unique point color as a string (CSS color such as \"#FF0000\" or \"red\").\n * Alternatively, the color can be a ColorRamp with a range.\n * In case of `.cluster` being `true`, the range of the ColorRamp will be addressed with the number of elements in\n * the cluster. If `.cluster` is `false`, the color will be addressed using the value of the `.property`.\n * If no `.property` is given but `.pointColor` is a ColorRamp, the chosen color is the one at the lower bound of the ColorRamp.\n * Default: a color randomly pick from a list\n */\n pointColor?: string | ColorRamp;\n\n /**\n * Radius of the points. Can be a fixed size or a value dependant on the zoom.\n * If `.pointRadius` is not provided, the radius will depend on the size of each cluster (if `.cluster` is `true`)\n * or on the value of each point (if `.property` is provided and `.pointColor` is a ColorRamp).\n * The radius will be between `.minPointRadius` and `.maxPointRadius`\n */\n pointRadius?: number | ZoomNumberValues;\n\n /**\n * The minimum point radius posible.\n * Default: `10`\n */\n minPointRadius?: number;\n\n /**\n * The maximum point radius posible.\n * Default: `40`\n */\n maxPointRadius?: number;\n\n /**\n * The point property to observe and apply the radius and color upon.\n * This is ignored if `.cluster` is `true` as the observed value will be fiorced to being the number\n * of elements in each cluster.\n *\n * Default: none\n */\n property?: string;\n\n /**\n * Opacity of the point or icon. This is can be a constant opacity in [0, 1] or a definition based on zoom levels.\n * Alternatively, if not provided but the `.pointColor` is a ColorRamp, the opacity will be extracted from tha alpha\n * component if present.\n * Default: `1`\n */\n pointOpacity?: number | ZoomNumberValues;\n\n /**\n * If `true`, the points will keep their circular shape align with the wiewport.\n * If `false`, the points will be like flatten on the map. This difference shows\n * when the map is tilted.\n * Default: `true`\n */\n alignOnViewport?: boolean;\n\n /**\n * Whether the points should cluster\n */\n cluster?: boolean;\n\n /**\n * Shows a label with the numerical value id `true`.\n * If `.cluster` is `true`, the value will be the numebr of elements in the cluster.\n *\n *\n * Default: `true` if `cluster` or `dataDrivenStyleProperty` are used, `false` otherwise.\n */\n showLabel?: boolean;\n\n /**\n * text color used for the number elements in each cluster.\n * Applicable only when `cluster` is `true`.\n * Default: `#000000` (black)\n */\n labelColor?: string;\n\n /**\n * text size used for the number elements in each cluster.\n * Applicable only when `cluster` is `true`.\n * Default: `12`\n */\n labelSize?: number;\n\n /**\n * Only if `.cluster` is `false`.\n * If the radius is driven by a property, then it will also scale by zoomming if `.zoomCompensation` is `true`.\n * If `false`, the radius will not adapt according to the zoom level.\n * Default: `true`\n */\n zoomCompensation?: boolean;\n};\n\nexport type HeatmapLayerOptions = {\n /**\n * ID to give to the layer.\n * If not provided, an auto-generated ID of the for \"maptiler-layer-xxxxxx\" will be auto-generated,\n * with \"xxxxxx\" being a random string.\n */\n layerId?: string;\n\n /**\n * ID to give to the geojson source.\n * If not provided, an auto-generated ID of the for \"maptiler-source-xxxxxx\" will be auto-generated,\n * with \"xxxxxx\" being a random string.\n */\n sourceId?: string;\n\n /**\n * A geojson Feature collection or a URL to a geojson or the UUID of a MapTiler Cloud dataset.\n */\n data: FeatureCollection | string;\n\n /**\n * The ID of an existing layer to insert the new layer before, resulting in the new layer appearing\n * visually beneath the existing layer. If this argument is not specified, the layer will be appended\n * to the end of the layers array and appear visually above all other layers.\n */\n beforeId?: string;\n\n /**\n * Zoom level at which it starts to show.\n * Default: `0`\n */\n minzoom?: number;\n\n /**\n * Zoom level after which it no longer show.\n * Default: `22`\n */\n maxzoom?: number;\n\n /**\n * The ColorRamp instance to use for visualization. The color ramp is expected to be defined in the\n * range `[0, 1]` or else will be forced to this range.\n * Default: `ColorRampCollection.TURBO`\n */\n colorRamp?: ColorRamp;\n\n /**\n * Use a property to apply a weight to each data point. Using a property requires also using\n * the options `.propertyValueWeight` or otherwise will be ignored.\n * Default: none, the points will all have a weight of `1`.\n */\n property?: string;\n\n /**\n * The weight to give to each data point. If of type `PropertyValueWeights`, then the options `.property`\n * must also be provided. If used a number, all data points will be weighted by the same number (which is of little interest)\n */\n weight?: PropertyValues | number;\n\n /**\n * The radius (in screenspace) can be:\n * - a fixed number that will be constant across zoom level\n * - of type `ZoomNumberValues` to be ramped accoding to zoom level (`.zoomCompensation` will then be ignored)\n * - of type `PropertyValues` to be driven by the value of a property.\n * If so, the option `.property` must be provided and will still be resized according to zoom level,\n * unless the option `.zoomCompensation` is set to `false`.\n *\n * Default:\n */\n radius?: number | ZoomNumberValues | PropertyValues;\n\n /**\n * The opacity can be a fixed value or zoom-driven.\n * Default: fades-in 0.25z after minzoom and fade-out 0.25z before maxzoom\n */\n opacity?: number | ZoomNumberValues;\n\n /**\n * The intensity is zoom-dependent. By default, the intensity is going to be scaled by zoom to preserve\n * a natural aspect or the data distribution.\n */\n intensity?: number | ZoomNumberValues;\n\n /**\n * If the radius is driven by a property, then it will also scale by zoomming if `.zoomCompensation` is `true`.\n * If `false`, the radius will not adapt according to the zoom level.\n * Default: `true`\n */\n zoomCompensation?: boolean;\n};\n\n/**\n * Add a polyline to the map from various sources and with builtin styling.\n * Compatible sources:\n * - gpx content as string\n * - gpx file from URL\n * - kml content from string\n * - kml from url\n * - geojson from url\n * - geojson content as string\n * - geojson content as JS object\n * - uuid of a MapTiler Cloud dataset\n *\n * The method also gives the possibility to add an outline layer (if `options.outline` is `true`)\n * and if so , the returned property `polylineOutlineLayerId` will be a string. As a result, two layers\n * would be added.\n *\n * The default styling creates a line layer of constant width of 3px, the color will be randomly picked\n * from a curated list of colors and the opacity will be 1.\n * If the outline is enabled, the outline width is of 1px at all zoom levels, the color is white and\n * the opacity is 1.\n *\n * Those style properties can be changed and ramped according to zoom level using an easier syntax.\n *\n */\nexport async function addPolyline(\n /**\n * Map instance to add a polyline layer to\n */\n map: Map,\n /**\n * Options related to adding a polyline layer\n */\n options: PolylineLayerOptions,\n /**\n * When the polyline data is loaded from a distant source, these options are propagated to the call of `fetch`\n */\n fetchOptions: RequestInit = {},\n): Promise<{\n polylineLayerId: string;\n polylineOutlineLayerId: string;\n polylineSourceId: string;\n}> {\n // We need to have the sourceId of the sourceData\n if (!options.sourceId && !options.data) {\n throw new Error(\n \"Creating a polyline layer requires an existing .sourceId or a valid .data property\",\n );\n }\n\n // We are going to evaluate the content of .data, if provided\n let data = options.data;\n\n if (typeof data === \"string\") {\n // if options.data exists and is a uuid string, we consider that it points to a MapTiler Dataset\n if (isUUID(data)) {\n data = `https://api.maptiler.com/data/${options.data}/features.json?key=${config.apiKey}`;\n }\n\n // options.data could be a url to a .gpx file\n else if (data.split(\".\").pop()?.toLowerCase().trim() === \"gpx\") {\n // fetch the file\n const res = await fetch(data, fetchOptions);\n const gpxStr = await res.text();\n // Convert it to geojson. Will throw is invalid GPX content\n data = gpx(gpxStr);\n }\n\n // options.data could be a url to a .kml file\n else if (data.split(\".\").pop()?.toLowerCase().trim() === \"kml\") {\n // fetch the file\n const res = await fetch(data, fetchOptions);\n const kmlStr = await res.text();\n // Convert it to geojson. Will throw is invalid GPX content\n data = kml(kmlStr);\n } else {\n // From this point, we consider that the string content provided could\n // be the string content of one of the compatible format (GeoJSON, KML, GPX)\n const tmpData =\n jsonParseNoThrow<FeatureCollection<Geometry, GeoJsonProperties>>(\n data,\n ) ?? gpxOrKml(data);\n if (tmpData) data = tmpData;\n }\n\n if (!data) {\n throw new Error(\n \"Polyline data was provided as string but is incompatible with valid formats.\",\n );\n }\n }\n\n return addGeoJSONPolyline(map, {\n ...options,\n data,\n });\n}\n\n/**\n * Add a polyline from a GeoJSON object\n */\nfunction addGeoJSONPolyline(\n map: Map,\n // The data or data source is expected to contain LineStrings or MultiLineStrings\n options: PolylineLayerOptions,\n): {\n /**\n * ID of the main line layer\n */\n polylineLayerId: string;\n\n /**\n * ID of the outline layer (will be `\"\"` if no outline)\n */\n polylineOutlineLayerId: string;\n\n /**\n * ID of the data source\n */\n polylineSourceId: string;\n} {\n if (options.layerId && map.getLayer(options.layerId)) {\n throw new Error(\n `A layer already exists with the layer id: ${options.layerId}`,\n );\n }\n\n const sourceId = options.sourceId ?? generateRandomSourceName();\n const layerId = options.layerId ?? generateRandomLayerName();\n\n const returnedInfo = {\n polylineLayerId: layerId,\n polylineOutlineLayerId: \"\",\n polylineSourceId: sourceId,\n };\n\n // A new source is added if the map does not have this sourceId and the data is provided\n if (options.data && !map.getSource(sourceId)) {\n // Adding the source\n map.addSource(sourceId, {\n type: \"geojson\",\n data: options.data,\n });\n }\n\n const lineWidth = options.lineWidth ?? 3;\n const lineColor = options.lineColor ?? getRandomColor();\n const lineOpacity = options.lineOpacity ?? 1;\n const lineBlur = options.lineBlur ?? 0;\n const lineGapWidth = options.lineGapWidth ?? 0;\n let lineDashArray = options.lineDashArray ?? null;\n const outlineWidth = options.outlineWidth ?? 1;\n const outlineColor = options.outlineColor ?? \"#FFFFFF\";\n const outlineOpacity = options.outlineOpacity ?? 1;\n const outlineBlur = options.outlineBlur ?? 0;\n\n if (typeof lineDashArray === \"string\") {\n lineDashArray = dashArrayMaker(lineDashArray);\n }\n\n // We want to create an outline for this line layer\n if (options.outline === true) {\n const outlineLayerId = `${layerId}_outline`;\n returnedInfo.polylineOutlineLayerId = outlineLayerId;\n\n map.addLayer(\n {\n id: outlineLayerId,\n type: \"line\",\n source: sourceId,\n layout: {\n \"line-join\": options.lineJoin ?? \"round\",\n \"line-cap\": options.lineCap ?? \"round\",\n },\n minzoom: options.minzoom ?? 0,\n maxzoom: options.maxzoom ?? 23,\n paint: {\n \"line-opacity\":\n typeof outlineOpacity === \"number\"\n ? outlineOpacity\n : rampedOptionsToLayerPaintSpec(outlineOpacity),\n \"line-color\":\n typeof outlineColor === \"string\"\n ? outlineColor\n : paintColorOptionsToPaintSpec(outlineColor),\n \"line-width\": computeRampedOutlineWidth(lineWidth, outlineWidth),\n \"line-blur\":\n typeof outlineBlur === \"number\"\n ? outlineBlur\n : rampedOptionsToLayerPaintSpec(outlineBlur),\n },\n },\n options.beforeId,\n );\n }\n\n map.addLayer(\n {\n id: layerId,\n type: \"line\",\n source: sourceId,\n layout: {\n \"line-join\": options.lineJoin ?? \"round\",\n \"line-cap\": options.lineCap ?? \"round\",\n },\n minzoom: options.minzoom ?? 0,\n maxzoom: options.maxzoom ?? 23,\n paint: {\n \"line-opacity\":\n typeof lineOpacity === \"number\"\n ? lineOpacity\n : rampedOptionsToLayerPaintSpec(lineOpacity),\n \"line-color\":\n typeof lineColor === \"string\"\n ? lineColor\n : paintColorOptionsToPaintSpec(lineColor),\n \"line-width\":\n typeof lineWidth === \"number\"\n ? lineWidth\n : rampedOptionsToLayerPaintSpec(lineWidth),\n\n \"line-blur\":\n typeof lineBlur === \"number\"\n ? lineBlur\n : rampedOptionsToLayerPaintSpec(lineBlur),\n\n \"line-gap-width\":\n typeof lineGapWidth === \"number\"\n ? lineGapWidth\n : rampedOptionsToLayerPaintSpec(lineGapWidth),\n\n // For some reasons passing \"line-dasharray\" with the value \"undefined\"\n // results in no showing the line while it should have the same behavior\n // of not adding the property \"line-dasharray\" as all.\n // As a workaround, we are inlining the addition of the prop with a conditional\n // which is less readable.\n ...(lineDashArray && { \"line-dasharray\": lineDashArray }),\n },\n },\n options.beforeId,\n );\n\n return returnedInfo;\n}\n\n/**\n * Add a polygon with styling options.\n */\nexport function addPolygon(\n map: Map,\n // this Feature collection is expected to contain on LineStrings and MultiLinestrings\n options: PolygonLayerOptions,\n): {\n /**\n * ID of the fill layer\n */\n polygonLayerId: string;\n\n /**\n * ID of the outline layer (will be `\"\"` if no outline)\n */\n polygonOutlineLayerId: string;\n\n /**\n * ID of the source that contains the data\n */\n polygonSourceId: string;\n} {\n if (options.layerId && map.getLayer(options.layerId)) {\n throw new Error(\n `A layer already exists with the layer id: ${options.layerId}`,\n );\n }\n\n const sourceId = options.sourceId ?? generateRandomSourceName();\n const layerId = options.layerId ?? generateRandomLayerName();\n\n const returnedInfo = {\n polygonLayerId: layerId,\n polygonOutlineLayerId: options.outline ? `${layerId}_outline` : \"\",\n polygonSourceId: sourceId,\n };\n\n // A new source is added if the map does not have this sourceId and the data is provided\n if (options.data && !map.getSource(sourceId)) {\n let data: string | FeatureCollection = options.data;\n\n // If is a UUID, we extend it to be the URL to a MapTiler Cloud hosted dataset\n if (typeof data === \"string\" && isUUID(data)) {\n data = `https://api.maptiler.com/data/${data}/features.json?key=${config.apiKey}`;\n }\n\n // Adding the source\n map.addSource(sourceId, {\n type: \"geojson\",\n data: data,\n });\n }\n\n let outlineDashArray = options.outlineDashArray ?? null;\n const outlineWidth = options.outlineWidth ?? 1;\n const outlineColor = options.outlineColor ?? \"#FFFFFF\";\n const outlineOpacity = options.outlineOpacity ?? 1;\n const outlineBlur = options.outlineBlur ?? 0;\n const fillColor = options.fillColor ?? getRandomColor();\n const fillOpacity = options.fillOpacity ?? 1;\n const outlinePosition = options.outlinePosition ?? \"center\";\n const pattern = options.pattern ?? null;\n\n if (typeof outlineDashArray === \"string\") {\n outlineDashArray = dashArrayMaker(outlineDashArray);\n }\n\n const addLayers = (patternImageId: string | null = null) => {\n map.addLayer(\n {\n id: layerId,\n type: \"fill\",\n source: sourceId,\n minzoom: options.minzoom ?? 0,\n maxzoom: options.maxzoom ?? 23,\n paint: {\n \"fill-color\":\n typeof fillColor === \"string\"\n ? fillColor\n : paintColorOptionsToPaintSpec(fillColor),\n\n \"fill-opacity\":\n typeof fillOpacity === \"number\"\n ? fillOpacity\n : rampedOptionsToLayerPaintSpec(fillOpacity),\n\n // Adding a pattern if provided\n ...(patternImageId && { \"fill-pattern\": patternImageId }),\n },\n },\n options.beforeId,\n );\n\n // We want to create an outline for this line layer\n if (options.outline === true) {\n let computedOutlineOffset:\n | DataDrivenPropertyValueSpecification<number>\n | number;\n\n if (outlinePosition === \"inside\") {\n if (typeof outlineWidth === \"number\") {\n computedOutlineOffset = 0.5 * outlineWidth;\n } else {\n computedOutlineOffset = rampedOptionsToLayerPaintSpec(\n outlineWidth.map(({ zoom, value }) => ({\n zoom,\n value: 0.5 * value,\n })),\n );\n }\n } else if (outlinePosition === \"outside\") {\n if (typeof outlineWidth === \"number\") {\n computedOutlineOffset = -0.5 * outlineWidth;\n } else {\n computedOutlineOffset = rampedOptionsToLayerPaintSpec(\n outlineWidth.map((el) => ({\n zoom: el.zoom,\n value: -0.5 * el.value,\n })),\n );\n }\n } else {\n computedOutlineOffset = 0;\n }\n\n map.addLayer(\n {\n id: returnedInfo.polygonOutlineLayerId,\n type: \"line\",\n source: sourceId,\n layout: {\n \"line-join\": options.outlineJoin ?? \"round\",\n \"line-cap\": options.outlineCap ?? \"butt\",\n },\n minzoom: options.minzoom ?? 0,\n maxzoom: options.maxzoom ?? 23,\n paint: {\n \"line-opacity\":\n typeof outlineOpacity === \"number\"\n ? outlineOpacity\n : rampedOptionsToLayerPaintSpec(outlineOpacity),\n \"line-color\":\n typeof outlineColor === \"string\"\n ? outlineColor\n : paintColorOptionsToPaintSpec(outlineColor),\n \"line-width\":\n typeof outlineWidth === \"number\"\n ? outlineWidth\n : rampedOptionsToLayerPaintSpec(outlineWidth),\n \"line-blur\":\n typeof outlineBlur === \"number\"\n ? outlineBlur\n : rampedOptionsToLayerPaintSpec(outlineBlur),\n\n \"line-offset\": computedOutlineOffset,\n\n // For some reasons passing \"line-dasharray\" with the value \"undefined\"\n // results in no showing the line while it should have the same behavior\n // of not adding the property \"line-dasharray\" as all.\n // As a workaround, we are inlining the addition of the prop with a conditional\n // which is less readable.\n ...(outlineDashArray && {\n \"line-dasharray\": outlineDashArray as PropertyValueSpecification<\n number[]\n >,\n }),\n },\n },\n options.beforeId,\n );\n }\n };\n\n if (pattern) {\n if (map.hasImage(pattern)) {\n addLayers(pattern);\n } else {\n map.loadImage(\n pattern,\n\n // (error?: Error | null, image?: HTMLImageElement | ImageBitmap | null, expiry?: ExpiryData | null)\n (\n error: Error | null | undefined,\n image: HTMLImageElement | ImageBitmap | null | undefined,\n ) => {\n // Throw an error if something goes wrong.\n if (error) {\n console.error(\"Could not load the pattern image.\", error.message);\n return addLayers();\n }\n\n if (!image) {\n console.error(\n `An image cannot be created from the pattern URL ${pattern}.`,\n );\n return addLayers();\n }\n\n // Add the image to the map style, using the image URL as an ID\n map.addImage(pattern, image);\n\n addLayers(pattern);\n },\n );\n }\n } else {\n addLayers();\n }\n\n return returnedInfo;\n}\n\n/**\n * Add a point layer from a GeoJSON source (or an existing sourceId) with many styling options\n */\nexport function addPoint(\n /**\n * The Map instance to add a point layer to\n */\n map: Map,\n // The data or data source is expected to contain LineStrings or MultiLineStrings\n options: PointLayerOptions,\n): {\n /**\n * ID of the unclustered point layer\n */\n pointLayerId: string;\n\n /**\n * ID of the clustered point layer (empty if `cluster` options id `false`)\n */\n clusterLayerId: string;\n\n /**\n * ID of the layer that shows the count of elements in each cluster (empty if `cluster` options id `false`)\n */\n labelLayerId: string;\n\n /**\n * ID of the data source\n */\n pointSourceId: string;\n} {\n if (options.layerId && map.getLayer(options.layerId)) {\n throw new Error(\n `A layer already exists with the layer id: ${options.layerId}`,\n );\n }\n\n const minPointRadius = options.minPointRadius ?? 10;\n const maxPointRadius = options.maxPointRadius ?? 50;\n const cluster = options.cluster ?? false;\n const nbDefaultDataDrivenStyleSteps = 20;\n const colorramp = Array.isArray(options.pointColor)\n ? options.pointColor\n : ColorRampCollection.TURBO.scale(\n 10,\n options.cluster ? 10000 : 1000,\n ).resample(\"ease-out-square\");\n const colorRampBounds = colorramp.getBounds();\n const sourceId = options.sourceId ?? generateRandomSourceName();\n const layerId = options.layerId ?? generateRandomLayerName();\n const showLabel = options.showLabel ?? cluster;\n const alignOnViewport = options.alignOnViewport ?? true;\n const outline = options.outline ?? false;\n const outlineOpacity = options.outlineOpacity ?? 1;\n const outlineWidth = options.outlineWidth ?? 1;\n const outlineColor = options.outlineColor ?? \"#FFFFFF\";\n let pointOpacity;\n const zoomCompensation = options.zoomCompensation ?? true;\n const minzoom = options.minzoom ?? 0;\n const maxzoom = options.maxzoom ?? 23;\n\n if (typeof options.pointOpacity === \"number\") {\n pointOpacity = options.pointOpacity;\n } else if (Array.isArray(options.pointOpacity)) {\n pointOpacity = rampedOptionsToLayerPaintSpec(options.pointOpacity);\n } else if (options.cluster) {\n pointOpacity = opacityDrivenByProperty(colorramp, \"point_count\");\n } else if (options.property) {\n pointOpacity = opacityDrivenByProperty(colorramp, options.property);\n } else {\n pointOpacity = rampedOptionsToLayerPaintSpec([\n { zoom: minzoom, value: 0 },\n { zoom: minzoom + 0.25, value: 1 },\n { zoom: maxzoom - 0.25, value: 1 },\n { zoom: maxzoom, value: 0 },\n ]);\n }\n\n const returnedInfo = {\n pointLayerId: layerId,\n clusterLayerId: \"\",\n labelLayerId: \"\",\n pointSourceId: sourceId,\n };\n\n // A new source is added if the map does not have this sourceId and the data is provided\n if (options.data && !map.getSource(sourceId)) {\n let data: string | FeatureCollection = options.data;\n\n // If is a UUID, we extend it to be the URL to a MapTiler Cloud hosted dataset\n if (typeof data === \"string\" && isUUID(data)) {\n data = `https://api.maptiler.com/data/${data}/features.json?key=${config.apiKey}`;\n }\n\n // Adding the source\n map.addSource(sourceId, {\n type: \"geojson\",\n data: data,\n cluster,\n });\n }\n\n if (cluster) {\n // If using clusters, the size and color of the circles (clusters) are driven by the\n // numbner of elements they contain and cannot be driven by the zoom level or a property\n\n returnedInfo.clusterLayerId = `${layerId}_cluster`;\n\n const clusterStyle: DataDrivenStyle = Array.from(\n { length: nbDefaultDataDrivenStyleSteps },\n (_, i) => {\n const value =\n colorRampBounds.min +\n (i * (colorRampBounds.max - colorRampBounds.min)) /\n (nbDefaultDataDrivenStyleSteps - 1);\n return {\n value,\n pointRadius:\n minPointRadius +\n (maxPointRadius - minPointRadius) *\n Math.pow(i / (nbDefaultDataDrivenStyleSteps - 1), 0.5),\n color: colorramp.getColorHex(value),\n };\n },\n );\n\n map.addLayer(\n {\n id: returnedInfo.clusterLayerId,\n type: \"circle\",\n source: sourceId,\n filter: [\"has\", \"point_count\"],\n paint: {\n // 'circle-color': options.pointColor ?? colorDrivenByProperty(clusterStyle, \"point_count\"),\n \"circle-color\":\n typeof options.pointColor === \"string\"\n ? options.pointColor\n : colorDrivenByProperty(clusterStyle, \"point_count\"),\n\n \"circle-radius\":\n typeof options.pointRadius === \"number\"\n ? options.pointRadius\n : Array.isArray(options.pointRadius)\n ? rampedOptionsToLayerPaintSpec(options.pointRadius)\n : radiusDrivenByProperty(clusterStyle, \"point_count\", false),\n\n \"circle-pitch-alignment\": alignOnViewport ? \"viewport\" : \"map\",\n \"circle-pitch-scale\": \"map\", // scale with camera distance regardless of viewport/biewport alignement\n \"circle-opacity\": pointOpacity,\n ...(outline && {\n \"circle-stroke-opacity\":\n typeof outlineOpacity === \"number\"\n ? outlineOpacity\n : rampedOptionsToLayerPaintSpec(outlineOpacity),\n\n \"circle-stroke-width\":\n typeof outlineWidth === \"number\"\n ? outlineWidth\n : rampedOptionsToLayerPaintSpec(outlineWidth),\n\n \"circle-stroke-color\":\n typeof outlineColor === \"string\"\n ? outlineColor\n : paintColorOptionsToPaintSpec(outlineColor),\n }),\n },\n minzoom,\n maxzoom,\n },\n options.beforeId,\n );\n\n // Adding the layer of unclustered point (visible only when ungrouped)\n map.addLayer(\n {\n id: returnedInfo.pointLayerId,\n type: \"circle\",\n source: sourceId,\n filter: [\"!\", [\"has\", \"point_count\"]],\n paint: {\n \"circle-pitch-alignment\": alignOnViewport ? \"viewport\" : \"map\",\n \"circle-pitch-scale\": \"map\", // scale with camera distance regardless of viewport/biewport alignement\n // 'circle-color': options.pointColor ?? clusterStyle[0].color,\n \"circle-color\":\n typeof options.pointColor === \"string\"\n ? options.pointColor\n : colorramp.getColorHex(colorramp.getBounds().min),\n \"circle-radius\":\n typeof options.pointRadius === \"number\"\n ? options.pointRadius\n : Array.isArray(options.pointRadius)\n ? rampedOptionsToLayerPaintSpec(options.pointRadius)\n : clusterStyle[0].pointRadius * 0.75,\n \"circle-opacity\": pointOpacity,\n ...(outline && {\n \"circle-stroke-opacity\":\n typeof outlineOpacity === \"number\"\n ? outlineOpacity\n : rampedOptionsToLayerPaintSpec(outlineOpacity),\n\n \"circle-stroke-width\":\n typeof outlineWidth === \"number\"\n ? outlineWidth\n : rampedOptionsToLayerPaintSpec(outlineWidth),\n\n \"circle-stroke-color\":\n typeof outlineColor === \"string\"\n ? outlineColor\n : paintColorOptionsToPaintSpec(outlineColor),\n }),\n },\n minzoom,\n maxzoom,\n },\n options.beforeId,\n );\n }\n\n // Not displaying clusters\n else {\n let pointColor: DataDrivenPropertyValueSpecification<string> =\n typeof options.pointColor === \"string\"\n ? options.pointColor\n : Array.isArray(options.pointColor)\n ? options.pointColor.getColorHex(options.pointColor.getBounds().min) // if color ramp is given, we choose the first color of it, even if the property may not be provided\n : getRandomColor();\n\n let pointRadius: DataDrivenPropertyValueSpecification<number> =\n typeof options.pointRadius === \"number\"\n ? zoomCompensation\n ? rampedOptionsToLayerPaintSpec([\n { zoom: 0, value: options.pointRadius * 0.025 },\n { zoom: 2, value: options.pointRadius * 0.05 },\n { zoom: 4, value: options.pointRadius * 0.1 },\n { zoom: 8, value: options.pointRadius * 0.25 },\n { zoom: 16, value: options.pointRadius * 1 },\n ])\n : options.pointRadius\n : Array.isArray(options.pointRadius)\n ? rampedOptionsToLayerPaintSpec(options.pointRadius)\n : zoomCompensation\n ? rampedOptionsToLayerPaintSpec([\n { zoom: 0, value: minPointRadius * 0.05 },\n { zoom: 2, value: minPointRadius * 0.1 },\n { zoom: 4, value: minPointRadius * 0.2 },\n { zoom: 8, value: minPointRadius * 0.5 },\n { zoom: 16, value: minPointRadius * 1 },\n ])\n : minPointRadius;\n\n // If the styling depends on a property, then we build a custom style\n if (options.property && Array.isArray(options.pointColor)) {\n const dataDrivenStyle: DataDrivenStyle = Array.from(\n { length: nbDefaultDataDrivenStyleSteps },\n (_, i) => {\n const value =\n colorRampBounds.min +\n (i * (colorRampBounds.max - colorRampBounds.min)) /\n (nbDefaultDataDrivenStyleSteps - 1);\n return {\n value,\n pointRadius:\n typeof options.pointRadius === \"number\"\n ? options.pointRadius\n : minPointRadius +\n (maxPointRadius - minPointRadius) *\n Math.pow(i / (nbDefaultDataDrivenStyleSteps - 1), 0.5),\n color:\n typeof options.pointColor === \"string\"\n ? options.pointColor\n : colorramp.getColorHex(value),\n };\n },\n );\n pointColor = colorDrivenByProperty(dataDrivenStyle, options.property);\n pointRadius = radiusDrivenByProperty(\n dataDrivenStyle,\n options.property,\n zoomCompensation,\n );\n }\n\n // Adding the layer of unclustered point\n map.addLayer(\n {\n id: returnedInfo.pointLayerId,\n type: \"circle\",\n source: sourceId,\n layout: {\n // Contrary to labels, we want to see the small one in front. Weirdly \"circle-sort-key\" works in the opposite direction as \"symbol-sort-key\".\n \"circle-sort-key\": options.property\n ? [\"/\", 1, [\"get\", options.property]]\n : 0,\n },\n paint: {\n \"circle-pitch-alignment\": alignOnViewport ? \"viewport\" : \"map\",\n \"circle-pitch-scale\": \"map\", // scale with camera distance regardless of viewport/biewport alignement\n \"circle-color\": pointColor,\n \"circle-opacity\": pointOpacity,\n \"circle-radius\": pointRadius,\n\n ...(outline && {\n \"circle-stroke-opacity\":\n typeof outlineOpacity === \"number\"\n ? outlineOpacity\n : rampedOptionsToLayerPaintSpec(outlineOpacity),\n\n \"circle-stroke-width\":\n typeof outlineWidth === \"number\"\n ? outlineWidth\n : rampedOptionsToLayerPaintSpec(outlineWidth),\n\n \"circle-stroke-color\":\n typeof outlineColor === \"string\"\n ? outlineColor\n : paintColorOptionsToPaintSpec(outlineColor),\n }),\n },\n minzoom,\n maxzoom,\n },\n options.beforeId,\n );\n }\n\n if (showLabel !== false && (options.cluster || options.property)) {\n returnedInfo.labelLayerId = `${layerId}_label`;\n const labelColor = options.labelColor ?? \"#fff\";\n const labelSize = options.labelSize ?? 12;\n\n // With clusters, a layer with clouster count is also added\n map.addLayer(\n {\n id: returnedInfo.labelLayerId,\n type: \"symbol\",\n source: sourceId,\n filter: [\n \"has\",\n options.cluster ? \"point_count\" : (options.property as string),\n ],\n layout: {\n \"text-field\": options.cluster\n ? \"{point_count_abbreviated}\"\n : `{${options.property as string}}`,\n \"text-font\": [\"Noto Sans Regular\"],\n \"text-size\": labelSize,\n \"text-pitch-alignment\": alignOnViewport ? \"viewport\" : \"map\",\n \"symbol-sort-key\": [\n \"/\",\n 1,\n [\n \"get\",\n options.cluster ? \"point_count\" : (options.property as string),\n ],\n ], // so that the largest value goes on top\n },\n paint: {\n \"text-color\": labelColor,\n \"text-opacity\": pointOpacity,\n },\n minzoom,\n maxzoom,\n },\n options.beforeId,\n );\n }\n return returnedInfo;\n}\n\n/**\n * Add a polyline witgh optional outline from a GeoJSON object\n */\nexport function addHeatmap(\n /**\n * Map instance to add a heatmap layer to\n */\n map: Map,\n // The data or data source is expected to contain LineStrings or MultiLineStrings\n options: HeatmapLayerOptions,\n): {\n /**\n * ID of the heatmap layer\n */\n heatmapLayerId: string;\n\n /**\n * ID of the data source\n */\n heatmapSourceId: string;\n} {\n if (options.layerId && map.getLayer(options.layerId)) {\n throw new Error(\n `A layer already exists with the layer id: ${options.layerId}`,\n );\n }\n\n const sourceId = options.sourceId ?? generateRandomSourceName();\n const layerId = options.layerId ?? generateRandomLayerName();\n const minzoom = options.minzoom ?? 0;\n const maxzoom = options.maxzoom ?? 23;\n const zoomCompensation = options.zoomCompensation ?? true;\n\n const opacity = options.opacity ?? [\n { zoom: minzoom, value: 0 },\n { zoom: minzoom + 0.25, value: 1 },\n { zoom: maxzoom - 0.25, value: 1 },\n { zoom: maxzoom, value: 0 },\n ];\n\n // const colorRamp = \"colorRamp\" in options\n let colorRamp = Array.isArray(options.colorRamp)\n ? options.colorRamp\n : ColorRampCollection.TURBO.transparentStart();\n\n // making sure the color ramp has [0, 1] bounds\n const crBounds = colorRamp.getBounds();\n if (crBounds.min !== 0 || crBounds.max !== 1) {\n colorRamp = colorRamp.scale(0, 1);\n }\n\n // making sure the color ramp has is transparent in 0\n if (!colorRamp.hasTransparentStart()) {\n colorRamp = colorRamp.transparentStart();\n }\n\n const intensity = options.intensity ?? [\n { zoom: 0, value: 0.01 },\n { zoom: 4, value: 0.2 },\n { zoom: 16, value: 1 },\n ];\n\n const property = options.property ?? null;\n const propertyValueWeight = options.weight ?? 1;\n\n let heatmapWeight: DataDrivenPropertyValueSpecification<number> = 1; // = typeof propertyValueWeights === \"number\" ? propertyValueWeights : 1;\n\n if (property) {\n if (typeof propertyValueWeight === \"number\") {\n heatmapWeight = propertyValueWeight;\n\n // In case this numerical weight was provided by the user and not be the default value:\n if (typeof options.weight === \"number\") {\n console.warn(\n \"The option `.property` is ignored when `.propertyValueWeights` is not of type `PropertyValueWeights`\",\n );\n }\n } else if (Array.isArray(propertyValueWeight)) {\n heatmapWeight = rampedPropertyValueWeight(propertyValueWeight, property);\n } else {\n console.warn(\n \"The option `.property` is ignored when `.propertyValueWeights` is not of type `PropertyValueWeights`\",\n );\n }\n } else {\n if (typeof propertyValueWeight === \"number\") {\n heatmapWeight = propertyValueWeight;\n } else if (Array.isArray(propertyValueWeight)) {\n console.warn(\n \"The options `.propertyValueWeights` can only be used when `.property` is provided.\",\n );\n }\n }\n\n const defaultRadiusZoomRamping = [\n { zoom: 0, value: 50 * 0.025 },\n { zoom: 2, value: 50 * 0.05 },\n { zoom: 4, value: 50 * 0.1 },\n { zoom: 8, value: 50 * 0.25 },\n { zoom: 16, value: 50 },\n ];\n\n const radius =\n options.radius ?? (zoomCompensation ? defaultRadiusZoomRamping : 10);\n\n let radiusHeatmap: DataDrivenPropertyValueSpecification<number> = 1;\n\n if (typeof radius === \"number\") {\n radiusHeatmap = radius;\n }\n\n // Radius is provided as a zoom-ramping array\n else if (Array.isArray(radius) && \"zoom\" in radius[0]) {\n radiusHeatmap = rampedOptionsToLayerPaintSpec(radius as ZoomNumberValues);\n }\n\n // Radius is provided as data driven\n else if (property && Array.isArray(radius) && \"propertyValue\" in radius[0]) {\n radiusHeatmap = radiusDrivenByPropertyHeatmap(\n radius as unknown as PropertyValues,\n property,\n zoomCompensation,\n );\n } else if (\n !property &&\n Array.isArray(radius) &&\n \"propertyValue\" in radius[0]\n ) {\n radiusHeatmap = rampedOptionsToLayerPaintSpec(\n defaultRadiusZoomRamping as ZoomNumberValues,\n );\n console.warn(\n \"The option `.radius` can only be property-driven if the option `.property` is provided.\",\n );\n } else {\n radiusHeatmap = rampedOptionsToLayerPaintSpec(\n defaultRadiusZoomRamping as ZoomNumberValues,\n );\n }\n\n const returnedInfo = {\n heatmapLayerId: layerId,\n heatmapSourceId: sourceId,\n };\n\n // A new source is added if the map does not have this sourceId and the data is provided\n if (options.data && !map.getSource(sourceId)) {\n let data: string | FeatureCollection = options.data;\n\n // If is a UUID, we extend it to be the URL to a MapTiler Cloud hosted dataset\n if (typeof data === \"string\" && isUUID(data)) {\n data = `https://api.maptiler.com/data/${data}/features.json?key=${config.apiKey}`;\n }\n\n // Adding the source\n map.addSource(sourceId, {\n type: \"geojson\",\n data: data,\n });\n }\n\n map.addLayer({\n id: layerId,\n type: \"heatmap\",\n source: sourceId,\n minzoom,\n maxzoom,\n paint: {\n \"heatmap-weight\": heatmapWeight,\n\n \"heatmap-intensity\":\n typeof intensity === \"number\"\n ? intensity\n : (rampedOptionsToLayerPaintSpec(\n intensity,\n ) as PropertyValueSpecification<number>),\n\n \"heatmap-color\": heatmapIntensityFromColorRamp(colorRamp),\n\n \"heatmap-radius\": radiusHeatmap,\n\n \"heatmap-opacity\":\n typeof opacity === \"number\"\n ? opacity\n : (rampedOptionsToLayerPaintSpec(\n opacity,\n ) as PropertyValueSpecification<number>),\n },\n });\n\n return returnedInfo;\n}\n","import {\n addPolyline,\n addPolygon,\n addPoint,\n addHeatmap,\n} from \"./vectorlayerhelpers\";\n\nexport type {\n ZoomStringValues,\n ZoomNumberValues,\n PropertyValues,\n CommonShapeLayerOptions,\n PolylineLayerOptions,\n PolygonLayerOptions,\n PointLayerOptions,\n HeatmapLayerOptions,\n} from \"./vectorlayerhelpers\";\n\n/**\n * Helpers are a set of functions to facilitate the creation of sources and layers\n */\nexport const helpers = {\n addPolyline,\n addPolygon,\n addPoint,\n addHeatmap,\n};\n","/**\n * Maplibre export first, then extensions can overload the exports.\n */\nexport * from \"maplibre-gl\";\n\n/**\n * To perform explicit named export so that they are included in the UMD bundle\n */\n// import * as ML from \"maplibre-gl\";\n\nimport maplibregl from \"maplibre-gl\";\n\nconst {\n // supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n} = maplibregl;\n\n// We still want to export maplibregl.Map, but as a different name\nconst MapMLGL = maplibregl.Map;\nconst MarkerMLGL = maplibregl.Marker;\nconst PopupMLGL = maplibregl.Popup;\nconst StyleMLGL = maplibregl.Style;\nconst CanvasSourceMLGL = maplibregl.CanvasSource;\nconst GeoJSONSourceMLGL = maplibregl.GeoJSONSource;\nconst ImageSourceMLGL = maplibregl.ImageSource;\nconst RasterTileSourceMLGL = maplibregl.RasterTileSource;\nconst RasterDEMTileSourceMLGL = maplibregl.RasterDEMTileSource;\nconst VectorTileSourceMLGL = maplibregl.VectorTileSource;\nconst VideoSourceMLGL = maplibregl.VideoSource;\nconst NavigationControlMLGL = maplibregl.NavigationControl;\nconst GeolocateControlMLGL = maplibregl.GeolocateControl;\nconst AttributionControlMLGL = maplibregl.AttributionControl;\nconst LogoControlMLGL = maplibregl.LogoControl;\nconst ScaleControlMLGL = maplibregl.ScaleControl;\nconst FullscreenControlMLGL = maplibregl.FullscreenControl;\nconst TerrainControlMLGL = maplibregl.TerrainControl;\n\nexport {\n // supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n PopupMLGL,\n MarkerMLGL,\n StyleMLGL,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n CanvasSourceMLGL,\n GeoJSONSourceMLGL,\n ImageSourceMLGL,\n RasterDEMTileSourceMLGL,\n RasterTileSourceMLGL,\n VectorTileSourceMLGL,\n VideoSourceMLGL,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n MapMLGL,\n};\n\n// Exporting types of class instances from MapLibre:\nexport type NavigationControlMLGL = InstanceType<typeof NavigationControlMLGL>;\nexport type GeolocateControlMLGL = InstanceType<typeof GeolocateControlMLGL>;\nexport type AttributionControlMLGL = InstanceType<\n typeof AttributionControlMLGL\n>;\nexport type LogoControlMLGL = InstanceType<typeof LogoControlMLGL>;\nexport type ScaleControlMLGL = InstanceType<typeof ScaleControlMLGL>;\nexport type FullscreenControlMLGL = InstanceType<typeof FullscreenControlMLGL>;\nexport type TerrainControlMLGL = InstanceType<typeof TerrainControlMLGL>;\nexport type MarkerMLGL = InstanceType<typeof MarkerMLGL>;\nexport type PopupMLGL = InstanceType<typeof PopupMLGL>;\nexport type StyleMLGL = InstanceType<typeof StyleMLGL>;\nexport type LngLat = InstanceType<typeof LngLat>;\nexport type LngLatBounds = InstanceType<typeof LngLatBounds>;\nexport type MercatorCoordinate = InstanceType<typeof MercatorCoordinate>;\nexport type Evented = InstanceType<typeof Evented>;\nexport type AJAXError = InstanceType<typeof AJAXError>;\nexport type CanvasSourceMLGL = InstanceType<typeof CanvasSourceMLGL>;\nexport type GeoJSONSourceMLGL = InstanceType<typeof GeoJSONSourceMLGL>;\nexport type ImageSourceMLGL = InstanceType<typeof ImageSourceMLGL>;\nexport type RasterDEMTileSourceMLGL = InstanceType<\n typeof RasterDEMTileSourceMLGL\n>;\nexport type RasterTileSourceMLGL = InstanceType<typeof RasterTileSourceMLGL>;\nexport type VectorTileSourceMLGL = InstanceType<typeof VectorTileSourceMLGL>;\nexport type VideoSourceMLGL = InstanceType<typeof VideoSourceMLGL>;\nexport type MapMLGL = InstanceType<typeof MapMLGL>;\n\n// SDK specific\nimport { Map, GeolocationType } from \"./Map\";\nimport type { MapOptions, LoadWithTerrainEvent } from \"./Map\";\n\nimport { Marker } from \"./Marker\";\nimport { Popup } from \"./Popup\";\nimport { Style } from \"./Style\";\nimport { CanvasSource } from \"./CanvasSource\";\nimport { GeoJSONSource } from \"./GeoJSONSource\";\nimport { ImageSource } from \"./ImageSource\";\nimport { RasterTileSource } from \"./RasterTileSource\";\nimport { RasterDEMTileSource } from \"./RasterDEMTileSource\";\nimport { VectorTileSource } from \"./VectorTileSource\";\nimport { VideoSource } from \"./VideoSource\";\nimport { NavigationControl } from \"./NavigationControl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { LogoControl } from \"./LogoControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\nimport { TerrainControl } from \"./TerrainControl\";\n\n// Import of modified versions of the controls\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\n\n// importing client functions to expose them as part of the SDK\nimport type {\n BBox,\n Position,\n GeocodingOptions,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n AutomaticStaticMapOptions,\n BoundedStaticMapOptions,\n} from \"@maptiler/client\";\n\nimport {\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n ServiceError,\n LanguageGeocoding,\n LanguageGeocodingString,\n ReferenceMapStyle,\n MapStyle,\n MapStyleVariant,\n} from \"@maptiler/client\";\n\nimport type { MapStyleType } from \"@maptiler/client\";\n\nimport { Point } from \"./Point\";\nimport type { Matrix2 } from \"./Point\";\n\n// Importing enums and configs\nimport { config, SdkConfig } from \"./config\";\nimport { Language, LanguageString, LanguageKey } from \"./language\";\nimport type { Unit } from \"./unit\";\nimport type { MinimapOptionsInput } from \"./Minimap\";\n\n// Exporting types\nexport type {\n MapOptions,\n MinimapOptionsInput,\n LoadWithTerrainEvent,\n GeocodingOptions,\n BBox,\n Position,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n BoundedStaticMapOptions,\n AutomaticStaticMapOptions,\n LanguageString,\n LanguageKey,\n LanguageGeocodingString,\n Unit,\n MapStyleType,\n Matrix2,\n};\n\n// Export convert functions 'str2xml', 'xml2str', 'gpx', and 'kml'\nexport * from \"./converters\";\n\n// Export the color ramp logic and all the built-in color ramps\nexport * from \"./colorramp\";\n\n// Exporting classes, objects, functions, etc.\nexport {\n Map,\n Marker,\n Popup,\n Style,\n CanvasSource,\n GeoJSONSource,\n ImageSource,\n RasterTileSource,\n RasterDEMTileSource,\n VideoSource,\n NavigationControl,\n GeolocateControl,\n AttributionControl,\n LogoControl,\n ScaleControl,\n FullscreenControl,\n TerrainControl,\n VectorTileSource,\n GeolocationType,\n SdkConfig,\n config,\n ServiceError,\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n MapStyle,\n Language,\n LanguageGeocoding,\n Point,\n ReferenceMapStyle,\n MapStyleVariant,\n MaptilerGeolocateControl,\n MaptilerLogoControl,\n MaptilerTerrainControl,\n MaptilerNavigationControl,\n};\n\nexport * from \"./helpers\";\n"],"names":["uuidv4","__publicField","clientConfig","maplibregl","__spreadValues","Marker","LngLat","LngLatBounds","__spreadProps","__async","_a","style","coord","i","_b","_c","_d","_e","_f"],"mappings":"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"}
|