Source: Layers/MapControl.js

import Layer from './Layer.js';

/**
 * 地图控制类
 * @class
 * @extends Layer
 */
class MapControl extends Layer {

	defaultParams = {
		zoomBase: 600,
		moveSpeed: 1,
		pitchSpeed: 0.1,
		rotateSpeed: 0.15,
	}

	/**
	 * 构造函数
	 * @param {Object} config - config
	 * @param {number} config.moveSpeed - 移动速度
	 * @param {number} config.pitchSpeed - 角度改变速度
	 * @param {number} config.rotateSpeed - 旋转速度
	 */
	constructor(config) {
		super(config);
		for (var x in this.defaultParams) {
			if (typeof (this[x]) == "undefined") {
				this[x] = this.defaultParams[x];
			}
		}
	}

	onAdd(map) {
		var _this = this;
		this.pigeonMap = map;
		this.map = this.pigeonMap.map;//用户配置或真实地图
		this.cameraControl = this.pigeonMap.cameraControl;
		this.initConfig();
		this.listenEvents();
		//添加相机更新函数
		this.on("change", function () {
			_this.pigeonMap.fire("change")
			_this.cameraControl.update();//更新用户参数为相机参数
		})
	}

	initConfig() {

	};

    /**
     * 监听事件
     */
	listenEvents() {
		this.onDown = (event) => {
			if (event.button == 0) {//左键
				this.mouseStatus = 'left'
			} else if (event.button == 2) {//右键
				this.mouseStatus = 'right'
			}
			this.mouseDownPosition = {
				x: event.clientX,
				y: event.clientY
			}
			this.map.container.addEventListener('mousemove', this.onMove)
		}
		this.onUp = (event) => {
			this.mouseStatus = false;
			this.map.container.removeEventListener('mousemove', this.onMove)
		}
		this.onMove = (event) => {
			if (!this.mouseStatus) {
				return;
			}
			if (this.mouseStatus == 'left') {
				let yDis = event.clientY - this.mouseDownPosition.y;
				let xDis = event.clientX - this.mouseDownPosition.x;
				let distance = Math.sqrt(Math.pow(xDis, 2) + Math.pow(yDis, 2));
				if (distance < 0.1) return false;
				let rotation = (xDis > 0 ? -1 : 1) * Math.asin(yDis / distance) + this.map.transform.angle;
				let ratio = this.moveSpeed * (this.map.zoom / (this.zoomBase + this.map.zoom));
				this.map.center[0] += (xDis > 0 ? -1 : 1) * (distance * Math.cos(rotation)) * ratio;
				this.map.center[1] += (xDis > 0 ? -1 : 1) * (distance * Math.sin(rotation)) * ratio;
				this.cameraControl.update();
                /**
                 * 地图移动
                 * @event MapControl#move 
                 * @property {Object} event
                 */
				this.fire("move", event)//地图移动
				this.fire("change", event)

			} else if (this.mouseStatus == 'right') {
				this.map.pitch += this.pitchSpeed * (event.clientY - this.mouseDownPosition.y);
				if (this.map.pitch > 90) {
					this.map.pitch = 90;
				} else if (this.map.pitch < 0) {
					this.map.pitch = 0;
				}
				this.map.rotation -= this.rotateSpeed * (event.clientX - this.mouseDownPosition.x);
				this.cameraControl.update();
                /**
                 * 地图旋转
                 * @event MapControl#rotate
                 * @property {Object} event 
                 */
				this.fire("rotate", event)//地图x旋转
				this.fire("change", event)

			}

			this.mouseDownPosition = {
				x: event.clientX,
				y: event.clientY
			}
		}
		this.onWheel = (event) => {
			this.map.zoom -= event.deltaY * this.map.zoom / this.zoomBase;
			if (this.map.zoom < 5) return this.map.zoom = 5;
			this.cameraControl.update();
			event.preventDefault();
            /**
             * 地图缩放
             * @event MapControl#zoom
             * @property {Object} event - 原生event对象
             */
			this.fire("zoom", event)//地图缩放

            /**
             * 地图状态发生改变,发生操作时触发
             * @event MapControl#change
             * @property {Object} event - 原生event对象
             */
			this.fire("change", event)
		}
		this.onContextmenu = function onContextmenu(e) {
			e.preventDefault();
			e.stopPropagation();
		}
		this.map.container.addEventListener('mousedown', this.onDown)
		this.map.container.addEventListener('mouseup', this.onUp)
		this.map.container.addEventListener('mousemove', this.onMove)
		this.map.container.addEventListener('wheel', this.onWheel)
		this.map.container.addEventListener('contextmenu', this.onContextmenu)

	};

    /**
     * 移除所有监听事件
     */
	removeListenr() {
		this.map.container.removeEventListener('mousedown', this.onDown)
		this.map.container.removeEventListener('mouseup', this.onUp)
		this.map.container.removeEventListener('mousemove', this.onMove)
		this.map.container.removeEventListener('wheel', this.onWheel)
		this.map.container.removeEventListener('contextmenu', this.onContextmenu)
	}

}
export default MapControl;