You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					314 lines
				
				8.2 KiB
			
		
		
			
		
	
	
					314 lines
				
				8.2 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* Licensed to the Apache Software Foundation (ASF) under one
							 | 
						||
| 
								 | 
							
								* or more contributor license agreements.  See the NOTICE file
							 | 
						||
| 
								 | 
							
								* distributed with this work for additional information
							 | 
						||
| 
								 | 
							
								* regarding copyright ownership.  The ASF licenses this file
							 | 
						||
| 
								 | 
							
								* to you under the Apache License, Version 2.0 (the
							 | 
						||
| 
								 | 
							
								* "License"); you may not use this file except in compliance
							 | 
						||
| 
								 | 
							
								* with the License.  You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								*   http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* Unless required by applicable law or agreed to in writing,
							 | 
						||
| 
								 | 
							
								* software distributed under the License is distributed on an
							 | 
						||
| 
								 | 
							
								* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
							 | 
						||
| 
								 | 
							
								* KIND, either express or implied.  See the License for the
							 | 
						||
| 
								 | 
							
								* specific language governing permissions and limitations
							 | 
						||
| 
								 | 
							
								* under the License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var zrUtil = require("zrender/lib/core/util");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var vector = require("zrender/lib/core/vector");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var matrix = require("zrender/lib/core/matrix");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var BoundingRect = require("zrender/lib/core/BoundingRect");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Transformable = require("zrender/lib/mixin/Transformable");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* Licensed to the Apache Software Foundation (ASF) under one
							 | 
						||
| 
								 | 
							
								* or more contributor license agreements.  See the NOTICE file
							 | 
						||
| 
								 | 
							
								* distributed with this work for additional information
							 | 
						||
| 
								 | 
							
								* regarding copyright ownership.  The ASF licenses this file
							 | 
						||
| 
								 | 
							
								* to you under the Apache License, Version 2.0 (the
							 | 
						||
| 
								 | 
							
								* "License"); you may not use this file except in compliance
							 | 
						||
| 
								 | 
							
								* with the License.  You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								*   http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* Unless required by applicable law or agreed to in writing,
							 | 
						||
| 
								 | 
							
								* software distributed under the License is distributed on an
							 | 
						||
| 
								 | 
							
								* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
							 | 
						||
| 
								 | 
							
								* KIND, either express or implied.  See the License for the
							 | 
						||
| 
								 | 
							
								* specific language governing permissions and limitations
							 | 
						||
| 
								 | 
							
								* under the License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Simple view coordinate system
							 | 
						||
| 
								 | 
							
								 * Mapping given x, y to transformd view x, y
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var v2ApplyTransform = vector.applyTransform; // Dummy transform node
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function TransformDummy() {
							 | 
						||
| 
								 | 
							
								  Transformable.call(this);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								zrUtil.mixin(TransformDummy, Transformable);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function View(name) {
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @type {string}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  this.name = name;
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @type {Object}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.zoomLimit;
							 | 
						||
| 
								 | 
							
								  Transformable.call(this);
							 | 
						||
| 
								 | 
							
								  this._roamTransformable = new TransformDummy();
							 | 
						||
| 
								 | 
							
								  this._rawTransformable = new TransformDummy();
							 | 
						||
| 
								 | 
							
								  this._center;
							 | 
						||
| 
								 | 
							
								  this._zoom;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								View.prototype = {
							 | 
						||
| 
								 | 
							
								  constructor: View,
							 | 
						||
| 
								 | 
							
								  type: 'view',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @param {Array.<string>}
							 | 
						||
| 
								 | 
							
								   * @readOnly
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  dimensions: ['x', 'y'],
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Set bounding rect
							 | 
						||
| 
								 | 
							
								   * @param {number} x
							 | 
						||
| 
								 | 
							
								   * @param {number} y
							 | 
						||
| 
								 | 
							
								   * @param {number} width
							 | 
						||
| 
								 | 
							
								   * @param {number} height
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  // PENDING to getRect
							 | 
						||
| 
								 | 
							
								  setBoundingRect: function (x, y, width, height) {
							 | 
						||
| 
								 | 
							
								    this._rect = new BoundingRect(x, y, width, height);
							 | 
						||
| 
								 | 
							
								    return this._rect;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @return {module:zrender/core/BoundingRect}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  // PENDING to getRect
							 | 
						||
| 
								 | 
							
								  getBoundingRect: function () {
							 | 
						||
| 
								 | 
							
								    return this._rect;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @param {number} x
							 | 
						||
| 
								 | 
							
								   * @param {number} y
							 | 
						||
| 
								 | 
							
								   * @param {number} width
							 | 
						||
| 
								 | 
							
								   * @param {number} height
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  setViewRect: function (x, y, width, height) {
							 | 
						||
| 
								 | 
							
								    this.transformTo(x, y, width, height);
							 | 
						||
| 
								 | 
							
								    this._viewRect = new BoundingRect(x, y, width, height);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Transformed to particular position and size
							 | 
						||
| 
								 | 
							
								   * @param {number} x
							 | 
						||
| 
								 | 
							
								   * @param {number} y
							 | 
						||
| 
								 | 
							
								   * @param {number} width
							 | 
						||
| 
								 | 
							
								   * @param {number} height
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  transformTo: function (x, y, width, height) {
							 | 
						||
| 
								 | 
							
								    var rect = this.getBoundingRect();
							 | 
						||
| 
								 | 
							
								    var rawTransform = this._rawTransformable;
							 | 
						||
| 
								 | 
							
								    rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));
							 | 
						||
| 
								 | 
							
								    rawTransform.decomposeTransform();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._updateTransform();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Set center of view
							 | 
						||
| 
								 | 
							
								   * @param {Array.<number>} [centerCoord]
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  setCenter: function (centerCoord) {
							 | 
						||
| 
								 | 
							
								    if (!centerCoord) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._center = centerCoord;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._updateCenterAndZoom();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @param {number} zoom
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  setZoom: function (zoom) {
							 | 
						||
| 
								 | 
							
								    zoom = zoom || 1;
							 | 
						||
| 
								 | 
							
								    var zoomLimit = this.zoomLimit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (zoomLimit) {
							 | 
						||
| 
								 | 
							
								      if (zoomLimit.max != null) {
							 | 
						||
| 
								 | 
							
								        zoom = Math.min(zoomLimit.max, zoom);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (zoomLimit.min != null) {
							 | 
						||
| 
								 | 
							
								        zoom = Math.max(zoomLimit.min, zoom);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._zoom = zoom;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._updateCenterAndZoom();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Get default center without roam
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  getDefaultCenter: function () {
							 | 
						||
| 
								 | 
							
								    // Rect before any transform
							 | 
						||
| 
								 | 
							
								    var rawRect = this.getBoundingRect();
							 | 
						||
| 
								 | 
							
								    var cx = rawRect.x + rawRect.width / 2;
							 | 
						||
| 
								 | 
							
								    var cy = rawRect.y + rawRect.height / 2;
							 | 
						||
| 
								 | 
							
								    return [cx, cy];
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  getCenter: function () {
							 | 
						||
| 
								 | 
							
								    return this._center || this.getDefaultCenter();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  getZoom: function () {
							 | 
						||
| 
								 | 
							
								    return this._zoom || 1;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @return {Array.<number}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  getRoamTransform: function () {
							 | 
						||
| 
								 | 
							
								    return this._roamTransformable.getLocalTransform();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Remove roam
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  _updateCenterAndZoom: function () {
							 | 
						||
| 
								 | 
							
								    // Must update after view transform updated
							 | 
						||
| 
								 | 
							
								    var rawTransformMatrix = this._rawTransformable.getLocalTransform();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var roamTransform = this._roamTransformable;
							 | 
						||
| 
								 | 
							
								    var defaultCenter = this.getDefaultCenter();
							 | 
						||
| 
								 | 
							
								    var center = this.getCenter();
							 | 
						||
| 
								 | 
							
								    var zoom = this.getZoom();
							 | 
						||
| 
								 | 
							
								    center = vector.applyTransform([], center, rawTransformMatrix);
							 | 
						||
| 
								 | 
							
								    defaultCenter = vector.applyTransform([], defaultCenter, rawTransformMatrix);
							 | 
						||
| 
								 | 
							
								    roamTransform.origin = center;
							 | 
						||
| 
								 | 
							
								    roamTransform.position = [defaultCenter[0] - center[0], defaultCenter[1] - center[1]];
							 | 
						||
| 
								 | 
							
								    roamTransform.scale = [zoom, zoom];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._updateTransform();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Update transform from roam and mapLocation
							 | 
						||
| 
								 | 
							
								   * @private
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  _updateTransform: function () {
							 | 
						||
| 
								 | 
							
								    var roamTransformable = this._roamTransformable;
							 | 
						||
| 
								 | 
							
								    var rawTransformable = this._rawTransformable;
							 | 
						||
| 
								 | 
							
								    rawTransformable.parent = roamTransformable;
							 | 
						||
| 
								 | 
							
								    roamTransformable.updateTransform();
							 | 
						||
| 
								 | 
							
								    rawTransformable.updateTransform();
							 | 
						||
| 
								 | 
							
								    matrix.copy(this.transform || (this.transform = []), rawTransformable.transform || matrix.create());
							 | 
						||
| 
								 | 
							
								    this._rawTransform = rawTransformable.getLocalTransform();
							 | 
						||
| 
								 | 
							
								    this.invTransform = this.invTransform || [];
							 | 
						||
| 
								 | 
							
								    matrix.invert(this.invTransform, this.transform);
							 | 
						||
| 
								 | 
							
								    this.decomposeTransform();
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @return {module:zrender/core/BoundingRect}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  getViewRect: function () {
							 | 
						||
| 
								 | 
							
								    return this._viewRect;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Get view rect after roam transform
							 | 
						||
| 
								 | 
							
								   * @return {module:zrender/core/BoundingRect}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  getViewRectAfterRoam: function () {
							 | 
						||
| 
								 | 
							
								    var rect = this.getBoundingRect().clone();
							 | 
						||
| 
								 | 
							
								    rect.applyTransform(this.transform);
							 | 
						||
| 
								 | 
							
								    return rect;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Convert a single (lon, lat) data item to (x, y) point.
							 | 
						||
| 
								 | 
							
								   * @param {Array.<number>} data
							 | 
						||
| 
								 | 
							
								   * @param {boolean} noRoam
							 | 
						||
| 
								 | 
							
								   * @param {Array.<number>} [out]
							 | 
						||
| 
								 | 
							
								   * @return {Array.<number>}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  dataToPoint: function (data, noRoam, out) {
							 | 
						||
| 
								 | 
							
								    var transform = noRoam ? this._rawTransform : this.transform;
							 | 
						||
| 
								 | 
							
								    out = out || [];
							 | 
						||
| 
								 | 
							
								    return transform ? v2ApplyTransform(out, data, transform) : vector.copy(out, data);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Convert a (x, y) point to (lon, lat) data
							 | 
						||
| 
								 | 
							
								   * @param {Array.<number>} point
							 | 
						||
| 
								 | 
							
								   * @return {Array.<number>}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  pointToData: function (point) {
							 | 
						||
| 
								 | 
							
								    var invTransform = this.invTransform;
							 | 
						||
| 
								 | 
							
								    return invTransform ? v2ApplyTransform([], point, invTransform) : [point[0], point[1]];
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @implements
							 | 
						||
| 
								 | 
							
								   * see {module:echarts/CoodinateSystem}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  convertToPixel: zrUtil.curry(doConvert, 'dataToPoint'),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @implements
							 | 
						||
| 
								 | 
							
								   * see {module:echarts/CoodinateSystem}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  convertFromPixel: zrUtil.curry(doConvert, 'pointToData'),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @implements
							 | 
						||
| 
								 | 
							
								   * see {module:echarts/CoodinateSystem}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  containPoint: function (point) {
							 | 
						||
| 
								 | 
							
								    return this.getViewRectAfterRoam().contain(point[0], point[1]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @return {number}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  // getScalarScale: function () {
							 | 
						||
| 
								 | 
							
								  //     // Use determinant square root of transform to mutiply scalar
							 | 
						||
| 
								 | 
							
								  //     var m = this.transform;
							 | 
						||
| 
								 | 
							
								  //     var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1]));
							 | 
						||
| 
								 | 
							
								  //     return det;
							 | 
						||
| 
								 | 
							
								  // }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								zrUtil.mixin(View, Transformable);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function doConvert(methodName, ecModel, finder, value) {
							 | 
						||
| 
								 | 
							
								  var seriesModel = finder.seriesModel;
							 | 
						||
| 
								 | 
							
								  var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return coordSys === this ? coordSys[methodName](value) : null;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _default = View;
							 | 
						||
| 
								 | 
							
								module.exports = _default;
							 |