UNPKG

maplibre-gl

Version:

BSD licensed community fork of mapbox-gl, a WebGL interactive maps library

48 lines (42 loc) 1.79 kB
import {pick, extend, type TileJSON} from '../util/util'; import {getJSON} from '../util/ajax'; import {ResourceType} from '../util/request_manager'; import {browser} from '../util/browser'; import type {RequestManager} from '../util/request_manager'; import type {RasterDEMSourceSpecification, RasterSourceSpecification, VectorSourceSpecification} from '@maplibre/maplibre-gl-style-spec'; export type LoadTileJsonResponse = { tiles: Array<string>; minzoom: number; maxzoom: number; attribution: string; bounds: RasterSourceSpecification['bounds']; scheme: RasterSourceSpecification['scheme']; tileSize: number; encoding: RasterDEMSourceSpecification['encoding']; vectorLayerIds?: Array<string>; }; export async function loadTileJson( options: RasterSourceSpecification | RasterDEMSourceSpecification | VectorSourceSpecification, requestManager: RequestManager, abortController: AbortController, ): Promise<LoadTileJsonResponse | null> { let tileJSON: TileJSON | typeof options = options; if (options.url) { const response = await getJSON<TileJSON>(requestManager.transformRequest(options.url, ResourceType.Source), abortController); tileJSON = response.data; } else { await browser.frameAsync(abortController); } if (!tileJSON) { return null; } const result = pick( // explicit source options take precedence over TileJSON extend(tileJSON, options), ['tiles', 'minzoom', 'maxzoom', 'attribution', 'bounds', 'scheme', 'tileSize', 'encoding'] ) as LoadTileJsonResponse; if ('vector_layers' in tileJSON && tileJSON.vector_layers) { result.vectorLayerIds = tileJSON.vector_layers.map((layer) => { return layer.id; }); } return result; }