@deck.gl/core
Version:
deck.gl core library
49 lines (37 loc) • 1.42 kB
text/typescript
// deck.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import {clamp} from '@math.gl/core';
import Controller, {ControllerProps} from './controller';
import {MapState, MapStateProps} from './map-controller';
import {mod} from '../utils/math-utils';
import LinearInterpolator from '../transitions/linear-interpolator';
import {MAX_LATITUDE} from '@math.gl/web-mercator';
class GlobeState extends MapState {
// Apply any constraints (mathematical or defined by _viewportProps) to map state
applyConstraints(props: Required<MapStateProps>): Required<MapStateProps> {
// Ensure zoom is within specified range
const {maxZoom, minZoom, zoom} = props;
props.zoom = clamp(zoom, minZoom, maxZoom);
const {longitude, latitude} = props;
if (longitude < -180 || longitude > 180) {
props.longitude = mod(longitude + 180, 360) - 180;
}
props.latitude = clamp(latitude, -MAX_LATITUDE, MAX_LATITUDE);
return props;
}
}
export default class GlobeController extends Controller<MapState> {
ControllerState = GlobeState;
transition = {
transitionDuration: 300,
transitionInterpolator: new LinearInterpolator(['longitude', 'latitude', 'zoom'])
};
dragMode: 'pan' | 'rotate' = 'pan';
setProps(props: ControllerProps) {
super.setProps(props);
// TODO - support pitching?
this.dragRotate = false;
this.touchRotate = false;
}
}