323 lines
8.6 KiB
JavaScript
323 lines
8.6 KiB
JavaScript
|
|
/*
|
|
* 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();
|
|
},
|
|
getTransformInfo: function () {
|
|
var roamTransform = this._roamTransformable.transform;
|
|
var rawTransformable = this._rawTransformable;
|
|
return {
|
|
roamTransform: roamTransform ? zrUtil.slice(roamTransform) : matrix.create(),
|
|
rawScale: zrUtil.slice(rawTransformable.scale),
|
|
rawPosition: zrUtil.slice(rawTransformable.position)
|
|
};
|
|
},
|
|
|
|
/**
|
|
* @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; |