UNPKG

maplibre-gl

Version:

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

100 lines (96 loc) • 4.3 kB
import {warnOnce} from '../../util/util.ts'; import {MercatorProjection} from './mercator_projection.ts'; import {createMercatorTransform} from './mercator_transform.ts'; import {MercatorCameraHelper} from './mercator_camera_helper.ts'; import {GlobeProjection} from './globe_projection.ts'; import {createGlobeTransform} from './globe_transform.ts'; import {GlobeCameraHelper} from './globe_camera_helper.ts'; import {VerticalPerspectiveCameraHelper} from './vertical_perspective_camera_helper.ts'; import {createVerticalPerspectiveTransform} from './vertical_perspective_transform.ts'; import {VerticalPerspectiveProjection} from './vertical_perspective_projection.ts'; import {CRSWorldCoordinateHelper} from './crs.ts'; import {getRegisteredProjection} from './projection_crud.ts'; import type {ProjectionSpecification} from '@maplibre/maplibre-gl-style-spec'; import type {Projection} from './projection.ts'; import type {ITransform, TransformConstrainFunction} from '../transform_interface.ts'; import type {ICameraHelper} from './camera_helper.ts'; export function createProjectionFromName(name: ProjectionSpecification['type'], transformConstrain: TransformConstrainFunction | undefined, globalState: Record<string, any>): { projection: Projection; transform: ITransform; cameraHelper: ICameraHelper; } { const transformOptions = {constrainOverride: transformConstrain}; if (Array.isArray(name)) { const registeredName = findRegisteredProjectionName(name); if (registeredName) { warnOnce(`Projection expressions cannot use the registered projection "${registeredName}", which only works as a plain name. Falling back to the globe projection.`); } const globeProjection = new GlobeProjection({type: name}, globalState); return { projection: globeProjection, transform: createGlobeTransform(transformOptions), cameraHelper: new GlobeCameraHelper(globeProjection), }; } const registered = getRegisteredProjection(name); if (registered) { const worldCoordinateHelper = new CRSWorldCoordinateHelper(registered); const transform = createMercatorTransform(transformOptions); transform.setWorldCoordinateHelper(worldCoordinateHelper); return { projection: new MercatorProjection(worldCoordinateHelper), transform, cameraHelper: new MercatorCameraHelper(), }; } switch (name) { case 'mercator': { return { projection: new MercatorProjection(), transform: createMercatorTransform(transformOptions), cameraHelper: new MercatorCameraHelper(), }; } case 'globe': { const globeProjection = new GlobeProjection({type: [ 'interpolate', ['linear'], ['zoom'], 11, 'vertical-perspective', 12, 'mercator' ]}, {}); return { projection: globeProjection, transform: createGlobeTransform(transformOptions), cameraHelper: new GlobeCameraHelper(globeProjection), }; } case 'vertical-perspective': { return { projection: new VerticalPerspectiveProjection(), transform: createVerticalPerspectiveTransform(transformOptions), cameraHelper: new VerticalPerspectiveCameraHelper(), }; } default: { warnOnce(`Unknown projection name: ${name}. Falling back to mercator projection.`); return { projection: new MercatorProjection(), transform: createMercatorTransform(transformOptions), cameraHelper: new MercatorCameraHelper(), }; } } } /** * The first registered projection named anywhere in a projection expression, or `undefined` if it names none. */ function findRegisteredProjectionName(expression: unknown[]): string | undefined { return expression.flat(Infinity).find((item): item is string => typeof item === 'string' && getRegisteredProjection(item) !== undefined); }