maptalks.plot/dist/maptalks.plot.common.js
2017-12-12 22:42:17 +08:00

722 lines
18 KiB
JavaScript

/*!
* maptalks.plot v0.0.0
* LICENSE : MIT
* (c) 2017-2017 https://sakitam-fdd.github.io/maptalks.plot
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var maptalks = require('maptalks');
var TextArea = 'TextArea';
var ARC = 'Arc';
var CURVE = 'Curve';
var GATHERING_PLACE = 'GatheringPlace';
var POLYLINE = 'Polyline';
var FREE_LINE = 'FreeLine';
var POINT = 'Point';
var PENNANT = 'Pennant';
var RECTANGLE = 'RectAngle';
var CIRCLE = 'Circle';
var ELLIPSE = 'Ellipse';
var LUNE = 'Lune';
var SECTOR = 'Sector';
var CLOSED_CURVE = 'ClosedCurve';
var POLYGON = 'Polygon';
var FREE_POLYGON = 'FreePolygon';
var ATTACK_ARROW = 'AttackArrow';
var DOUBLE_ARROW = 'DoubleArrow';
var STRAIGHT_ARROW = 'StraightArrow';
var FINE_ARROW = 'FineArrow';
var ASSAULT_DIRECTION = 'AssaultDirection';
var TAILED_ATTACK_ARROW = 'TailedAttackArrow';
var SQUAD_COMBAT = 'SquadCombat';
var TAILED_SQUAD_COMBAT = 'TailedSquadCombat';
var RECTFLAG = 'RectFlag';
var TRIANGLEFLAG = 'TriangleFlag';
var CURVEFLAG = 'CurveFlag';
var PlotTypes = Object.freeze({
TextArea: TextArea,
ARC: ARC,
CURVE: CURVE,
GATHERING_PLACE: GATHERING_PLACE,
POLYLINE: POLYLINE,
FREE_LINE: FREE_LINE,
POINT: POINT,
PENNANT: PENNANT,
RECTANGLE: RECTANGLE,
CIRCLE: CIRCLE,
ELLIPSE: ELLIPSE,
LUNE: LUNE,
SECTOR: SECTOR,
CLOSED_CURVE: CLOSED_CURVE,
POLYGON: POLYGON,
FREE_POLYGON: FREE_POLYGON,
ATTACK_ARROW: ATTACK_ARROW,
DOUBLE_ARROW: DOUBLE_ARROW,
STRAIGHT_ARROW: STRAIGHT_ARROW,
FINE_ARROW: FINE_ARROW,
ASSAULT_DIRECTION: ASSAULT_DIRECTION,
TAILED_SQUAD_COMBAT: TAILED_SQUAD_COMBAT,
TAILED_ATTACK_ARROW: TAILED_ATTACK_ARROW,
SQUAD_COMBAT: SQUAD_COMBAT,
RECTFLAG: RECTFLAG,
TRIANGLEFLAG: TRIANGLEFLAG,
CURVEFLAG: CURVEFLAG
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
var asyncGenerator = function () {
function AwaitValue(value) {
this.value = value;
}
function AsyncGenerator(gen) {
var front, back;
function send(key, arg) {
return new Promise(function (resolve, reject) {
var request = {
key: key,
arg: arg,
resolve: resolve,
reject: reject,
next: null
};
if (back) {
back = back.next = request;
} else {
front = back = request;
resume(key, arg);
}
});
}
function resume(key, arg) {
try {
var result = gen[key](arg);
var value = result.value;
if (value instanceof AwaitValue) {
Promise.resolve(value.value).then(function (arg) {
resume("next", arg);
}, function (arg) {
resume("throw", arg);
});
} else {
settle(result.done ? "return" : "normal", result.value);
}
} catch (err) {
settle("throw", err);
}
}
function settle(type, value) {
switch (type) {
case "return":
front.resolve({
value: value,
done: true
});
break;
case "throw":
front.reject(value);
break;
default:
front.resolve({
value: value,
done: false
});
break;
}
front = front.next;
if (front) {
resume(front.key, front.arg);
} else {
back = null;
}
}
this._invoke = send;
if (typeof gen.return !== "function") {
this.return = undefined;
}
}
if (typeof Symbol === "function" && Symbol.asyncIterator) {
AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
return this;
};
}
AsyncGenerator.prototype.next = function (arg) {
return this._invoke("next", arg);
};
AsyncGenerator.prototype.throw = function (arg) {
return this._invoke("throw", arg);
};
AsyncGenerator.prototype.return = function (arg) {
return this._invoke("return", arg);
};
return {
wrap: function (fn) {
return function () {
return new AsyncGenerator(fn.apply(this, arguments));
};
},
await: function (value) {
return new AwaitValue(value);
}
};
}();
var classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var inherits = function (subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
};
var possibleConstructorReturn = function (self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call && (typeof call === "object" || typeof call === "function") ? call : self;
};
var Canvas2d = maptalks.Canvas;
var options = {
'arcDegree': 90
};
var Curve = function (_maptalks$LineString) {
inherits(Curve, _maptalks$LineString);
function Curve() {
classCallCheck(this, Curve);
return possibleConstructorReturn(this, _maptalks$LineString.apply(this, arguments));
}
Curve.prototype._arc = function _arc(ctx, points, lineOpacity) {
var degree = this.options['arcDegree'] * Math.PI / 180;
for (var i = 1, l = points.length; i < l; i++) {
Canvas2d._arcBetween(ctx, points[i - 1], points[i], degree);
Canvas2d._stroke(ctx, lineOpacity);
}
};
Curve.prototype._quadraticCurve = function _quadraticCurve(ctx, points) {
if (points.length <= 2) {
Canvas2d._path(ctx, points);
return;
}
Canvas2d.quadraticCurve(ctx, points);
};
Curve.prototype._bezierCurve = function _bezierCurve(ctx, points) {
if (points.length <= 3) {
Canvas2d._path(ctx, points);
return;
}
var i = void 0,
l = void 0;
for (i = 1, l = points.length; i + 2 < l; i += 3) {
ctx.bezierCurveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y, points[i + 2].x, points[i + 2].y);
}
if (i < l) {
for (; i < l; i++) {
ctx.lineTo(points[i].x, points[i].y);
}
}
};
Curve.prototype._toJSON = function _toJSON(options) {
return {
'feature': this.toGeoJSON(options),
'subType': 'Curve'
};
};
Curve.prototype._paintOn = function _paintOn(ctx, points, lineOpacity) {
ctx.beginPath();
this._arc(ctx, points, lineOpacity);
Canvas2d._stroke(ctx, lineOpacity);
this._paintArrow(ctx, points, lineOpacity);
};
Curve.fromJSON = function fromJSON(json) {
var feature = json['feature'];
var arc = new Curve(feature['geometry']['coordinates'], json['options']);
arc.setProperties(feature['properties']);
return arc;
};
return Curve;
}(maptalks.LineString);
Curve.registerJSONType('Curve');
Curve.mergeOptions(options);
var Coordinate$1 = maptalks.Coordinate;
var options$1 = {
'arrowStyle': null,
'arrowPlacement': 'vertex-last',
'clipToPaint': true
};
var Polyline = function (_maptalks$LineString) {
inherits(Polyline, _maptalks$LineString);
function Polyline(coordinates) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, Polyline);
var _this = possibleConstructorReturn(this, _maptalks$LineString.call(this, options));
_this.type = 'Polyline';
if (coordinates) {
_this.setCoordinates(coordinates);
}
return _this;
}
Polyline.prototype._exportGeoJSONGeometry = function _exportGeoJSONGeometry() {
var points = this.getCoordinates();
var coordinates = Coordinate$1.toNumberArrays(points);
return {
'type': 'LineString',
'coordinates': coordinates
};
};
Polyline.prototype._toJSON = function _toJSON(options) {
return {
'feature': this.toGeoJSON(options)
};
};
return Polyline;
}(maptalks.LineString);
Polyline.mergeOptions(options$1);
Polyline.registerJSONType('Polyline');
var Coordinate$2 = maptalks.Coordinate;
var options$2 = {
'arrowStyle': null,
'arrowPlacement': 'vertex-last',
'clipToPaint': true
};
var FreeLine = function (_maptalks$LineString) {
inherits(FreeLine, _maptalks$LineString);
function FreeLine(coordinates) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, FreeLine);
var _this = possibleConstructorReturn(this, _maptalks$LineString.call(this, options));
_this.type = 'FreeLine';
if (coordinates) {
_this.setCoordinates(coordinates);
}
return _this;
}
FreeLine.prototype._exportGeoJSONGeometry = function _exportGeoJSONGeometry() {
var points = this.getCoordinates();
var coordinates = Coordinate$2.toNumberArrays(points);
return {
'type': 'LineString',
'coordinates': coordinates
};
};
FreeLine.prototype._toJSON = function _toJSON(options) {
return {
'feature': this.toGeoJSON(options)
};
};
return FreeLine;
}(maptalks.LineString);
FreeLine.mergeOptions(options$2);
FreeLine.registerJSONType('FreeLine');
var RegisterModes = {};
RegisterModes[CURVE] = {
'action': 'clickDblclick',
'create': function create(path) {
return new Curve(path);
},
'update': function update(path, geometry) {
geometry.setCoordinates(path);
},
'generate': function generate(geometry) {
return geometry;
}
};
RegisterModes[POLYLINE] = {
'action': 'clickDblclick',
'create': function create(path) {
return new Polyline(path);
},
'update': function update(path, geometry) {
geometry.setCoordinates(path);
},
'generate': function generate(geometry) {
return geometry;
}
};
RegisterModes[FREE_LINE] = {
'action': 'mouseup',
'create': function create(path) {
return new FreeLine(path);
},
'update': function update(path, geometry) {
geometry.setCoordinates(path);
},
'generate': function generate(geometry) {
return geometry;
}
};
var isObject = function isObject(value) {
var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);
return value !== null && (type === 'object' || type === 'function');
};
var merge = function merge(a, b) {
for (var key in b) {
if (isObject(b[key]) && isObject(a[key])) {
merge(a[key], b[key]);
} else {
a[key] = b[key];
}
}
return a;
};
var Polygon$1 = maptalks.Polygon;
var _options = {
'symbol': {
'lineColor': '#000',
'lineWidth': 2,
'lineOpacity': 1,
'polygonFill': '#fff',
'polygonOpacity': 0.3
},
'doubleClickZoom': false,
'mode': null,
'once': false,
'ignoreMouseleave': true
};
var registeredMode = {};
var PlotDraw = function (_maptalks$DrawTool) {
inherits(PlotDraw, _maptalks$DrawTool);
function PlotDraw() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, PlotDraw);
var $options = merge(_options, options);
var _this = possibleConstructorReturn(this, _maptalks$DrawTool.call(this, $options));
_this.options = $options;
_this._checkMode();
return _this;
}
PlotDraw.prototype._getRegisterMode = function _getRegisterMode() {
var mode = this.getMode();
var registerMode = PlotDraw.getRegisterMode(mode);
if (!registerMode) {
throw new Error(mode + ' is not a valid mode of DrawTool.');
}
return registerMode;
};
PlotDraw.prototype.setSymbol = function setSymbol(symbol) {
if (!symbol) {
return this;
}
this.options['symbol'] = symbol;
if (this._geometry) {
this._geometry.setSymbol(symbol);
}
return this;
};
PlotDraw.prototype._clickForPath = function _clickForPath(param) {
var registerMode = this._getRegisterMode();
var coordinate = param['coordinate'];
var symbol = this.getSymbol();
if (!this._geometry) {
this._clickCoords = [coordinate];
this._geometry = registerMode['create'](this._clickCoords, param);
if (symbol) {
this._geometry.setSymbol(symbol);
}
this._addGeometryToStage(this._geometry);
this._fireEvent('drawstart', param);
} else {
if (!(this._historyPointer === null)) {
this._clickCoords = this._clickCoords.slice(0, this._historyPointer);
}
this._clickCoords.push(coordinate);
this._historyPointer = this._clickCoords.length;
registerMode['update'](this._clickCoords, this._geometry, param);
this._fireEvent('drawvertex', param);
}
};
PlotDraw.prototype._mousemoveForPath = function _mousemoveForPath(param) {
var map = this.getMap();
if (!this._geometry || !map || map.isInteracting()) {
return;
}
var containerPoint = this._getMouseContainerPoint(param);
if (!this._isValidContainerPoint(containerPoint)) {
return;
}
var coordinate = param['coordinate'];
var registerMode = this._getRegisterMode();
var path = this._clickCoords.slice(0, this._historyPointer);
if (path && path.length > 0 && coordinate.equals(path[path.length - 1])) {
return;
}
registerMode['update'](path.concat([coordinate]), this._geometry, param);
this._fireEvent('mousemove', param);
};
PlotDraw.prototype._dblclickForPath = function _dblclickForPath(param) {
if (!this._geometry) {
return;
}
var containerPoint = this._getMouseContainerPoint(param);
if (!this._isValidContainerPoint(containerPoint)) {
return;
}
var registerMode = this._getRegisterMode();
var coordinate = param['coordinate'];
var path = this._clickCoords;
path.push(coordinate);
if (path.length < 2) {
return;
}
var nIndexes = [];
for (var i = 1, len = path.length; i < len; i++) {
if (path[i].x === path[i - 1].x && path[i].y === path[i - 1].y) {
nIndexes.push(i);
}
}
for (var _i = nIndexes.length - 1; _i >= 0; _i--) {
path.splice(nIndexes[_i], 1);
}
if (path.length < 2 || this._geometry && this._geometry instanceof Polygon$1 && path.length < 3) {
return;
}
registerMode['update'](path, this._geometry, param);
this.endDraw(param);
};
PlotDraw.prototype._mousedownToDraw = function _mousedownToDraw(param) {
var map = this._map;
var registerMode = this._getRegisterMode();
var me = this;
var firstPoint = this._getMouseContainerPoint(param);
if (!this._isValidContainerPoint(firstPoint)) {
return false;
}
function genGeometry(evt) {
var symbol = me.getSymbol();
var geometry = me._geometry;
if (!geometry) {
geometry = registerMode['create'](evt.coordinate, evt);
geometry.setSymbol(symbol);
me._addGeometryToStage(geometry);
me._geometry = geometry;
} else {
registerMode['update'](evt.coordinate, geometry, evt);
}
}
var onMouseMove = function onMouseMove(evt) {
if (!this._geometry) {
return false;
}
var current = this._getMouseContainerPoint(evt);
if (!this._isValidContainerPoint(current)) {
return false;
}
genGeometry(evt);
this._fireEvent('mousemove', param);
return false;
};
var onMouseUp = function onMouseUp(evt) {
map.off('mousemove', onMouseMove, this);
map.off('mouseup', onMouseUp, this);
if (!this.options['ignoreMouseleave']) {
map.off('mouseleave', onMouseUp, this);
}
if (!this._geometry) {
return false;
}
var current = this._getMouseContainerPoint(evt);
if (this._isValidContainerPoint(current)) {
genGeometry(evt);
}
this.endDraw(param);
return false;
};
this._fireEvent('drawstart', param);
genGeometry(param);
map.on('mousemove', onMouseMove, this);
map.on('mouseup', onMouseUp, this);
if (!this.options['ignoreMouseleave']) {
map.on('mouseleave', onMouseUp, this);
}
return false;
};
PlotDraw.prototype.getEvents = function getEvents() {
var action = this._getRegisterMode()['action'];
if (action === 'clickDblclick') {
return {
'click': this._clickForPath,
'mousemove': this._mousemoveForPath,
'dblclick': this._dblclickForPath
};
} else if (action === 'click') {
return {
'click': this._clickForPoint
};
} else if (action === 'drag') {
return {
'mousedown': this._mousedownToDraw
};
} else if (action === 'mouseup') {
return {
'mousedown': this._mousedownToDraw
};
}
return null;
};
PlotDraw.registerMode = function registerMode(name, modeAction) {
registeredMode[name.toLowerCase()] = modeAction;
};
PlotDraw.getRegisterMode = function getRegisterMode(name) {
return registeredMode[name.toLowerCase()];
};
PlotDraw.registeredModes = function registeredModes(modes) {
if (modes) {
for (var _iterator = Reflect.ownKeys(modes), _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i2 >= _iterator.length) break;
_ref = _iterator[_i2++];
} else {
_i2 = _iterator.next();
if (_i2.done) break;
_ref = _i2.value;
}
var key = _ref;
if (!key.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {
var desc = Object.getOwnPropertyDescriptor(modes, key);
var _key = key.toLowerCase();
Object.defineProperty(registeredMode, _key, desc);
console.log(registeredMode);
}
}
}
};
return PlotDraw;
}(maptalks.DrawTool);
PlotDraw.registeredModes(RegisterModes);
exports.PlotDraw = PlotDraw;
exports.PlotTypes = PlotTypes;