diff --git a/dist/maptalks.plot.js b/dist/maptalks.plot.js index 82fbbff..5090bdb 100644 --- a/dist/maptalks.plot.js +++ b/dist/maptalks.plot.js @@ -68,8 +68,268 @@ var PlotTypes = Object.freeze({ CURVEFLAG: CURVEFLAG }); +var FITTING_COUNT = 100; + +var ZERO_TOLERANCE = 0.0001; + var BASE_LAYERNAME = 'maptalks-plot-vector-layer'; +var MathDistance = function MathDistance(pnt1, pnt2) { + return Math.sqrt(Math.pow(pnt1[0] - pnt2[0], 2) + Math.pow(pnt1[1] - pnt2[1], 2)); +}; + + + + + +var Mid = function Mid(point1, point2) { + return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]; +}; + +var getCircleCenterOfThreePoints = function getCircleCenterOfThreePoints(point1, point2, point3) { + var pntA = [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]; + var pntB = [pntA[0] - point1[1] + point2[1], pntA[1] + point1[0] - point2[0]]; + var pntC = [(point1[0] + point3[0]) / 2, (point1[1] + point3[1]) / 2]; + var pntD = [pntC[0] - point1[1] + point3[1], pntC[1] + point1[0] - point3[0]]; + return getIntersectPoint(pntA, pntB, pntC, pntD); +}; + +var getIntersectPoint = function getIntersectPoint(pntA, pntB, pntC, pntD) { + if (pntA[1] === pntB[1]) { + var _f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1]); + var _x = _f * (pntA[1] - pntC[1]) + pntC[0]; + var _y = pntA[1]; + return [_x, _y]; + } + if (pntC[1] === pntD[1]) { + var _e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1]); + var _x2 = _e * (pntC[1] - pntA[1]) + pntA[0]; + var _y2 = pntC[1]; + return [_x2, _y2]; + } + var e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1]); + var f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1]); + var y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f); + var x = e * y - e * pntA[1] + pntA[0]; + return [x, y]; +}; + +var getAzimuth = function getAzimuth(startPoint, endPoint) { + var azimuth = void 0; + var angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / MathDistance(startPoint, endPoint)); + if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) { + azimuth = angle + Math.PI; + } else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) { + azimuth = Math.PI * 2 - angle; + } else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) { + azimuth = angle; + } else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) { + azimuth = Math.PI - angle; + } + return azimuth; +}; + + + +var isClockWise = function isClockWise(pnt1, pnt2, pnt3) { + return (pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]); +}; + + + +var getCubicValue = function getCubicValue(t, startPnt, cPnt1, cPnt2, endPnt) { + t = Math.max(Math.min(t, 1), 0); + var tp = 1 - t, + t2 = t * t; + + var t3 = t2 * t; + var tp2 = tp * tp; + var tp3 = tp2 * tp; + var x = tp3 * startPnt[0] + 3 * tp2 * t * cPnt1[0] + 3 * tp * t2 * cPnt2[0] + t3 * endPnt[0]; + var y = tp3 * startPnt[1] + 3 * tp2 * t * cPnt1[1] + 3 * tp * t2 * cPnt2[1] + t3 * endPnt[1]; + return [x, y]; +}; + + + +var getArcPoints = function getArcPoints(center, radius, startAngle, endAngle) { + var x = null, + y = null, + pnts = [], + angleDiff = endAngle - startAngle; + + angleDiff = angleDiff < 0 ? angleDiff + Math.PI * 2 : angleDiff; + for (var i = 0; i < 100; i++) { + var angle = startAngle + angleDiff * i / 100; + x = center[0] + radius * Math.cos(angle); + y = center[1] + radius * Math.sin(angle); + pnts.push([x, y]); + } + return pnts; +}; + +var getBisectorNormals = function getBisectorNormals(t, pnt1, pnt2, pnt3) { + var normal = getNormal(pnt1, pnt2, pnt3); + var bisectorNormalRight = null, + bisectorNormalLeft = null, + dt = null, + x = null, + y = null; + + var dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]); + var uX = normal[0] / dist; + var uY = normal[1] / dist; + var d1 = MathDistance(pnt1, pnt2); + var d2 = MathDistance(pnt2, pnt3); + if (dist > ZERO_TOLERANCE) { + if (isClockWise(pnt1, pnt2, pnt3)) { + dt = t * d1; + x = pnt2[0] - dt * uY; + y = pnt2[1] + dt * uX; + bisectorNormalRight = [x, y]; + dt = t * d2; + x = pnt2[0] + dt * uY; + y = pnt2[1] - dt * uX; + bisectorNormalLeft = [x, y]; + } else { + dt = t * d1; + x = pnt2[0] + dt * uY; + y = pnt2[1] - dt * uX; + bisectorNormalRight = [x, y]; + dt = t * d2; + x = pnt2[0] - dt * uY; + y = pnt2[1] + dt * uX; + bisectorNormalLeft = [x, y]; + } + } else { + x = pnt2[0] + t * (pnt1[0] - pnt2[0]); + y = pnt2[1] + t * (pnt1[1] - pnt2[1]); + bisectorNormalRight = [x, y]; + x = pnt2[0] + t * (pnt3[0] - pnt2[0]); + y = pnt2[1] + t * (pnt3[1] - pnt2[1]); + bisectorNormalLeft = [x, y]; + } + return [bisectorNormalRight, bisectorNormalLeft]; +}; + +var getNormal = function getNormal(pnt1, pnt2, pnt3) { + var dX1 = pnt1[0] - pnt2[0]; + var dY1 = pnt1[1] - pnt2[1]; + var d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1); + dX1 /= d1; + dY1 /= d1; + var dX2 = pnt3[0] - pnt2[0]; + var dY2 = pnt3[1] - pnt2[1]; + var d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2); + dX2 /= d2; + dY2 /= d2; + var uX = dX1 + dX2; + var uY = dY1 + dY2; + return [uX, uY]; +}; + +var getLeftMostControlPoint = function getLeftMostControlPoint(controlPoints, t) { + var _ref = [controlPoints[0], controlPoints[1], controlPoints[2], null, null], + pnt1 = _ref[0], + pnt2 = _ref[1], + pnt3 = _ref[2], + controlX = _ref[3], + controlY = _ref[4]; + + var pnts = getBisectorNormals(0, pnt1, pnt2, pnt3); + var normalRight = pnts[0]; + var normal = getNormal(pnt1, pnt2, pnt3); + var dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]); + if (dist > ZERO_TOLERANCE) { + var mid = Mid(pnt1, pnt2); + var pX = pnt1[0] - mid[0]; + var pY = pnt1[1] - mid[1]; + var d1 = MathDistance(pnt1, pnt2); + var n = 2.0 / d1; + var nX = -n * pY; + var nY = n * pX; + var a11 = nX * nX - nY * nY; + var a12 = 2 * nX * nY; + var a22 = nY * nY - nX * nX; + var dX = normalRight[0] - mid[0]; + var dY = normalRight[1] - mid[1]; + controlX = mid[0] + a11 * dX + a12 * dY; + controlY = mid[1] + a12 * dX + a22 * dY; + } else { + controlX = pnt1[0] + t * (pnt2[0] - pnt1[0]); + controlY = pnt1[1] + t * (pnt2[1] - pnt1[1]); + } + return [controlX, controlY]; +}; + +var getRightMostControlPoint = function getRightMostControlPoint(controlPoints, t) { + var count = controlPoints.length; + var pnt1 = controlPoints[count - 3]; + var pnt2 = controlPoints[count - 2]; + var pnt3 = controlPoints[count - 1]; + var pnts = getBisectorNormals(0, pnt1, pnt2, pnt3); + var normalLeft = pnts[1]; + var normal = getNormal(pnt1, pnt2, pnt3); + var dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]); + var controlX = null, + controlY = null; + + if (dist > ZERO_TOLERANCE) { + var mid = Mid(pnt2, pnt3); + var pX = pnt3[0] - mid[0]; + var pY = pnt3[1] - mid[1]; + var d1 = MathDistance(pnt2, pnt3); + var n = 2.0 / d1; + var nX = -n * pY; + var nY = n * pX; + var a11 = nX * nX - nY * nY; + var a12 = 2 * nX * nY; + var a22 = nY * nY - nX * nX; + var dX = normalLeft[0] - mid[0]; + var dY = normalLeft[1] - mid[1]; + controlX = mid[0] + a11 * dX + a12 * dY; + controlY = mid[1] + a12 * dX + a22 * dY; + } else { + controlX = pnt3[0] + t * (pnt2[0] - pnt3[0]); + controlY = pnt3[1] + t * (pnt2[1] - pnt3[1]); + } + return [controlX, controlY]; +}; + +var getCurvePoints = function getCurvePoints(t, controlPoints) { + var leftControl = getLeftMostControlPoint(controlPoints, t); + var pnt1 = null, + pnt2 = null, + pnt3 = null, + normals = [leftControl], + points = []; + + for (var i = 0; i < controlPoints.length - 2; i++) { + var _ref2 = [controlPoints[i], controlPoints[i + 1], controlPoints[i + 2]]; + pnt1 = _ref2[0]; + pnt2 = _ref2[1]; + pnt3 = _ref2[2]; + + var normalPoints = getBisectorNormals(t, pnt1, pnt2, pnt3); + normals = normals.concat(normalPoints); + } + var rightControl = getRightMostControlPoint(controlPoints, t); + if (rightControl) { + normals.push(rightControl); + } + for (var _i = 0; _i < controlPoints.length - 1; _i++) { + pnt1 = controlPoints[_i]; + pnt2 = controlPoints[_i + 1]; + points.push(pnt1); + for (var _t = 0; _t < FITTING_COUNT; _t++) { + var pnt = getCubicValue(_t / FITTING_COUNT, pnt1, normals[_i * 2], normals[_i * 2 + 1], pnt2); + points.push(pnt); + } + points.push(pnt2); + } + return points; +}; + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { @@ -247,52 +507,158 @@ var possibleConstructorReturn = function (self, call) { return call && (typeof call === "object" || typeof call === "function") ? call : self; }; -var Canvas2d = maptalks.Canvas; +var Coordinate$1 = maptalks.Coordinate; var options = { - 'arcDegree': 90 + 'arrowStyle': null, + 'arrowPlacement': 'vertex-last', + 'clipToPaint': true +}; + +var Arc = function (_maptalks$LineString) { + inherits(Arc, _maptalks$LineString); + + function Arc(coordinates) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, Arc); + + var _this = possibleConstructorReturn(this, _maptalks$LineString.call(this, options)); + + _this.type = 'Arc'; + _this._coordinates = []; + if (coordinates) { + _this.setPoints(coordinates); + } + return _this; + } + + Arc.prototype._generate = function _generate() { + var count = this._coordinates.length; + if (count < 2) return; + if (count === 2) { + this.setCoordinates(this._coordinates); + } else { + var _ref = [this._coordinates[0], this._coordinates[1], this._coordinates[2], null, null], + pnt1 = _ref[0], + pnt2 = _ref[1], + pnt3 = _ref[2], + startAngle = _ref[3], + endAngle = _ref[4]; + + var center = getCircleCenterOfThreePoints([pnt1['x'], pnt1['y']], [pnt2['x'], pnt2['y']], [pnt3['x'], pnt3['y']]); + var radius = MathDistance([pnt1['x'], pnt1['y']], center); + var angle1 = getAzimuth([pnt1['x'], pnt1['y']], center); + var angle2 = getAzimuth([pnt2['x'], pnt2['y']], center); + if (isClockWise([pnt1['x'], pnt1['y']], [pnt2['x'], pnt2['y']], [pnt3['x'], pnt3['y']])) { + startAngle = angle2; + endAngle = angle1; + } else { + startAngle = angle1; + endAngle = angle2; + } + var points = getArcPoints(center, radius, startAngle, endAngle); + if (Array.isArray(points)) { + var _points = points.map(function (_item) { + if (Array.isArray(_item)) { + if (!isNaN(_item[0]) && !isNaN(_item[1])) { + return new Coordinate$1(_item[0], _item[1]); + } + } else { + return _item; + } + }); + this.setCoordinates(_points); + } + } + }; + + Arc.prototype.setPoints = function setPoints(coordinates) { + this._coordinates = !coordinates ? [] : coordinates; + if (this._coordinates.length >= 1) { + this._generate(); + } + }; + + Arc.prototype._exportGeoJSONGeometry = function _exportGeoJSONGeometry() { + var points = this.getCoordinates(); + var coordinates = Coordinate$1.toNumberArrays(points); + return { + 'type': 'LineString', + 'coordinates': coordinates + }; + }; + + Arc.prototype._toJSON = function _toJSON(options) { + return { + 'feature': this.toGeoJSON(options) + }; + }; + + return Arc; +}(maptalks.LineString); + +Arc.mergeOptions(options); + +Arc.registerJSONType('Arc'); + +var Coordinate$2 = maptalks.Coordinate; +var options$1 = { + 'arrowStyle': null, + 'arrowPlacement': 'vertex-last', + 'clipToPaint': true }; var Curve = function (_maptalks$LineString) { inherits(Curve, _maptalks$LineString); - function Curve() { + function Curve(coordinates) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; classCallCheck(this, Curve); - return possibleConstructorReturn(this, _maptalks$LineString.apply(this, arguments)); + + var _this = possibleConstructorReturn(this, _maptalks$LineString.call(this, options)); + + _this.type = 'Curve'; + _this._coordinates = []; + if (coordinates) { + _this.setPoints(coordinates); + } + return _this; } - 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._generate = function _generate() { + var count = this._coordinates.length; + if (count < 2) { + return false; + } else if (count === 2) { + this.setCoordinates(this._coordinates); + } else { + var _coordinates = this._coordinates.map(function (_item) { + if (_item && _item.hasOwnProperty('x')) { + return [_item['x'], _item['y']]; + } else if (Array.isArray(_item)) { + return _item; + } + }); + var points = getCurvePoints(0.3, _coordinates); + if (Array.isArray(points)) { + var _points = points.map(function (_item) { + if (Array.isArray(_item)) { + return new Coordinate$2(_item[0], _item[1]); + } else { + return _item; + } + }); + this.setCoordinates(_points); } } }; + Curve.prototype.setPoints = function setPoints(coordinates) { + this._coordinates = !coordinates ? [] : coordinates; + if (this._coordinates.length >= 1) { + this._generate(); + } + }; + Curve.prototype._toJSON = function _toJSON(options) { return { 'feature': this.toGeoJSON(options), @@ -300,13 +666,6 @@ var Curve = function (_maptalks$LineString) { }; }; - 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']); @@ -318,10 +677,10 @@ var Curve = function (_maptalks$LineString) { }(maptalks.LineString); Curve.registerJSONType('Curve'); -Curve.mergeOptions(options); +Curve.mergeOptions(options$1); -var Coordinate$1 = maptalks.Coordinate; -var options$1 = { +var Coordinate$3 = maptalks.Coordinate; +var options$2 = { 'arrowStyle': null, 'arrowPlacement': 'vertex-last', 'clipToPaint': true @@ -343,9 +702,15 @@ var Polyline = function (_maptalks$LineString) { return _this; } + Polyline.prototype.setPoints = function setPoints(coordinates) { + if (coordinates) { + this.setCoordinates(coordinates); + } + }; + Polyline.prototype._exportGeoJSONGeometry = function _exportGeoJSONGeometry() { var points = this.getCoordinates(); - var coordinates = Coordinate$1.toNumberArrays(points); + var coordinates = Coordinate$3.toNumberArrays(points); return { 'type': 'LineString', 'coordinates': coordinates @@ -361,12 +726,12 @@ var Polyline = function (_maptalks$LineString) { return Polyline; }(maptalks.LineString); -Polyline.mergeOptions(options$1); +Polyline.mergeOptions(options$2); Polyline.registerJSONType('Polyline'); -var Coordinate$2 = maptalks.Coordinate; -var options$2 = { +var Coordinate$4 = maptalks.Coordinate; +var options$3 = { 'arrowStyle': null, 'arrowPlacement': 'vertex-last', 'clipToPaint': true @@ -388,9 +753,15 @@ var FreeLine = function (_maptalks$LineString) { return _this; } + FreeLine.prototype.setPoints = function setPoints(coordinates) { + if (coordinates) { + this.setCoordinates(coordinates); + } + }; + FreeLine.prototype._exportGeoJSONGeometry = function _exportGeoJSONGeometry() { var points = this.getCoordinates(); - var coordinates = Coordinate$2.toNumberArrays(points); + var coordinates = Coordinate$4.toNumberArrays(points); return { 'type': 'LineString', 'coordinates': coordinates @@ -406,42 +777,59 @@ var FreeLine = function (_maptalks$LineString) { return FreeLine; }(maptalks.LineString); -FreeLine.mergeOptions(options$2); +FreeLine.mergeOptions(options$3); FreeLine.registerJSONType('FreeLine'); var RegisterModes = {}; +RegisterModes[ARC] = { + 'freehand': false, + 'limitClickCount': 3, + 'action': ['click', 'mousemove'], + 'create': function create(path) { + return new Arc(path); + }, + 'update': function update(path, geometry) { + geometry.setPoints(path); + }, + 'generate': function generate(geometry) { + return geometry; + } +}; RegisterModes[CURVE] = { - 'action': ['click', 'click', 'dbclick'], + 'freehand': false, + 'action': ['click', 'mousemove', 'dblclick'], 'create': function create(path) { return new Curve(path); }, 'update': function update(path, geometry) { - geometry.setCoordinates(path); + geometry.setPoints(path); }, 'generate': function generate(geometry) { return geometry; } }; RegisterModes[POLYLINE] = { - 'action': ['click', 'mousemove', 'dbclick'], + 'freehand': false, + 'action': ['click', 'mousemove', 'dblclick'], 'create': function create(path) { return new Polyline(path); }, 'update': function update(path, geometry) { - geometry.setCoordinates(path); + geometry.setPoints(path); }, 'generate': function generate(geometry) { return geometry; } }; RegisterModes[FREE_LINE] = { + 'freehand': true, 'action': ['mousedown', 'drag', 'mouseup'], 'create': function create(path) { return new FreeLine(path); }, 'update': function update(path, geometry) { - geometry.setCoordinates(path); + geometry.setPoints(path); }, 'generate': function generate(geometry) { return geometry; @@ -504,6 +892,15 @@ var PlotDraw = function (_maptalks$MapTool) { _this.layerName = _this.options && _this.options['layerName'] ? _this.options['layerName'] : BASE_LAYERNAME; _this.drawLayer = null; + + _this.events = { + 'click': _this._firstClickHandler, + 'mousemove': _this._mouseMoveHandler, + 'dblclick': _this._doubleClickHandler, + 'mousedown': _this._mouseDownHandler, + 'mouseup': _this._mouseUpHandler, + 'drag': _this._mouseMoveHandler + }; return _this; } @@ -565,17 +962,49 @@ var PlotDraw = function (_maptalks$MapTool) { PlotDraw.prototype.getEvents = function getEvents() { var action = this._getRegisterMode()['action']; + var _events = {}; if (Array.isArray(action)) { - return { - 'click': this._firstClickHandler, - 'mousemove': this._mouseMoveHandler, - 'dblclick': this._doubleClickHandler - }; + for (var i = 0; i < action.length; i++) { + if (action[i] === 'drag') { + _events['mousemove'] = this.events[action[i]]; + } else { + _events[action[i]] = this.events[action[i]]; + } + } + return _events; } return null; }; + PlotDraw.prototype._mouseDownHandler = function _mouseDownHandler(event) { + this._createGeometry(event); + }; + + PlotDraw.prototype._mouseUpHandler = function _mouseUpHandler(event) { + this.endDraw(event); + }; + PlotDraw.prototype._firstClickHandler = function _firstClickHandler(event) { + this._createGeometry(event); + var registerMode = this._getRegisterMode(); + var coordinate = event['coordinate']; + if (this._geometry) { + if (!(this._historyPointer === null)) { + this._clickCoords = this._clickCoords.slice(0, this._historyPointer); + } + this._clickCoords.push(coordinate); + this._historyPointer = this._clickCoords.length; + if (registerMode['limitClickCount'] && registerMode['limitClickCount'] === this._historyPointer) { + registerMode['update'](this._clickCoords, this._geometry, event); + this.endDraw(event); + } else { + registerMode['update'](this._clickCoords, this._geometry, event); + } + this._fireEvent('drawvertex', event); + } + }; + + PlotDraw.prototype._createGeometry = function _createGeometry(event) { var registerMode = this._getRegisterMode(); var coordinate = event['coordinate']; var symbol = this.getSymbol(); @@ -587,14 +1016,6 @@ var PlotDraw = function (_maptalks$MapTool) { } this._addGeometryToStage(this._geometry); this._fireEvent('drawstart', event); - } 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, event); - this._fireEvent('drawvertex', event); } }; @@ -613,7 +1034,16 @@ var PlotDraw = function (_maptalks$MapTool) { if (path && path.length > 0 && coordinate.equals(path[path.length - 1])) { return; } - registerMode['update'](path.concat([coordinate]), this._geometry, event); + if (!registerMode.freehand) { + registerMode['update'](path.concat([coordinate]), this._geometry, event); + } 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, event); + } this._fireEvent('mousemove', event); }; @@ -771,7 +1201,6 @@ var PlotDraw = function (_maptalks$MapTool) { var desc = Object.getOwnPropertyDescriptor(modes, key); var _key = key.toLowerCase(); Object.defineProperty(registeredMode, _key, desc); - console.log(registeredMode); } } } diff --git a/dist/maptalks.plot.js.map b/dist/maptalks.plot.js.map index 7a46550..b455871 100644 --- a/dist/maptalks.plot.js.map +++ b/dist/maptalks.plot.js.map @@ -1 +1 @@ -{"version":3,"file":"maptalks.plot.js","sources":["../src/core/PlotTypes.js","../src/Constants.js","../src/geometry/Polyline/Curve.js","../src/geometry/Polyline/Polyline.js","../src/geometry/Polyline/FreeLine.js","../src/geometry/index.js","../src/utils/utils.js","../src/core/PlotDraw.js"],"sourcesContent":["/**\n * Created by FDD on 2017/5/20.\n */\nconst TextArea = 'TextArea' // 文本标绘(特殊)\nconst ARC = 'Arc'\nconst CURVE = 'Curve'\nconst GATHERING_PLACE = 'GatheringPlace'\nconst POLYLINE = 'Polyline'\nconst FREE_LINE = 'FreeLine'\nconst POINT = 'Point'\nconst PENNANT = 'Pennant'\nconst RECTANGLE = 'RectAngle'\nconst CIRCLE = 'Circle'\nconst ELLIPSE = 'Ellipse'\nconst LUNE = 'Lune'\nconst SECTOR = 'Sector'\nconst CLOSED_CURVE = 'ClosedCurve'\nconst POLYGON = 'Polygon'\nconst FREE_POLYGON = 'FreePolygon'\nconst ATTACK_ARROW = 'AttackArrow'\nconst DOUBLE_ARROW = 'DoubleArrow'\nconst STRAIGHT_ARROW = 'StraightArrow'\nconst FINE_ARROW = 'FineArrow'\nconst ASSAULT_DIRECTION = 'AssaultDirection'\nconst TAILED_ATTACK_ARROW = 'TailedAttackArrow'\nconst SQUAD_COMBAT = 'SquadCombat'\nconst TAILED_SQUAD_COMBAT = 'TailedSquadCombat'\nconst RECTFLAG = 'RectFlag'\nconst TRIANGLEFLAG = 'TriangleFlag'\nconst CURVEFLAG = 'CurveFlag'\nexport {\n TextArea,\n ARC,\n CURVE,\n GATHERING_PLACE,\n POLYLINE,\n FREE_LINE,\n POINT,\n PENNANT,\n RECTANGLE,\n CIRCLE,\n ELLIPSE,\n LUNE,\n SECTOR,\n CLOSED_CURVE,\n POLYGON,\n FREE_POLYGON,\n ATTACK_ARROW,\n DOUBLE_ARROW,\n STRAIGHT_ARROW,\n FINE_ARROW,\n ASSAULT_DIRECTION,\n TAILED_SQUAD_COMBAT,\n TAILED_ATTACK_ARROW,\n SQUAD_COMBAT,\n RECTFLAG,\n TRIANGLEFLAG,\n CURVEFLAG\n}\n","/**\n * Created by FDD on 2017/5/22.\n * @desc 常用变量\n */\nexport const FITTING_COUNT = 100\nexport const HALF_PI = Math.PI / 2\nexport const ZERO_TOLERANCE = 0.0001\nexport const TWO_PI = Math.PI * 2\nexport const BASE_LAYERNAME = 'maptalks-plot-vector-layer' // 矢量图层名,(唯一标识)\nexport const BASE_HELP_CONTROL_POINT_ID = 'plot-helper-control-point-div' // 控制点要素的基类id\nexport const BASE_HELP_HIDDEN = 'plot-helper-hidden-div' // 父类隐藏容器\nexport const INTERNAL_LAYER_PREFIX = '_maptalks__internal_layer_'\nexport const DEF_TEXT_STYEL = { // 默认文本框样式\n backgroundColor: '#fff',\n borderRadius: '2px',\n boxSizing: 'border-box',\n border: '3px solid rgba(255, 0, 0, 1)',\n fontFamily: 'Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Noto Sans CJK SC,WenQuanYi Micro Hei,Arial,sans-serif',\n color: '#010500',\n fontWeight: 400,\n padding: '10px',\n fontStretch: 'normal'\n}\n","/**\n * Created by FDD on 2017/12/10.\n * @desc 标绘曲线算法\n */\n\nimport * as maptalks from 'maptalks'\nconst Canvas2d = maptalks.Canvas\nconst options = {\n 'arcDegree': 90\n}\nclass Curve extends maptalks.LineString {\n _arc (ctx, points, lineOpacity) {\n const degree = this.options['arcDegree'] * Math.PI / 180\n for (let i = 1, l = points.length; i < l; i++) {\n Canvas2d._arcBetween(ctx, points[i - 1], points[i], degree)\n Canvas2d._stroke(ctx, lineOpacity)\n }\n }\n\n _quadraticCurve (ctx, points) {\n if (points.length <= 2) {\n Canvas2d._path(ctx, points)\n return\n }\n Canvas2d.quadraticCurve(ctx, points)\n }\n\n _bezierCurve (ctx, points) {\n if (points.length <= 3) {\n Canvas2d._path(ctx, points)\n return\n }\n let i, l\n for (i = 1, l = points.length; i + 2 < l; i += 3) {\n ctx.bezierCurveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y, points[i + 2].x, points[i + 2].y)\n }\n if (i < l) {\n for (; i < l; i++) {\n ctx.lineTo(points[i].x, points[i].y)\n }\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options),\n 'subType': 'Curve'\n }\n }\n\n // paint method on canvas\n _paintOn (ctx, points, lineOpacity) {\n ctx.beginPath()\n this._arc(ctx, points, lineOpacity)\n Canvas2d._stroke(ctx, lineOpacity)\n this._paintArrow(ctx, points, lineOpacity)\n }\n\n static fromJSON (json) {\n const feature = json['feature']\n const arc = new Curve(feature['geometry']['coordinates'], json['options'])\n arc.setProperties(feature['properties'])\n return arc\n }\n}\nCurve.registerJSONType('Curve')\nCurve.mergeOptions(options)\n\nexport default Curve\n","import * as maptalks from 'maptalks'\nconst Coordinate = maptalks.Coordinate\nconst options = {\n 'arrowStyle': null,\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\n 'clipToPaint': true\n}\n\nclass Polyline extends maptalks.LineString {\n constructor (coordinates, options = {}) {\n super(options)\n this.type = 'Polyline'\n if (coordinates) {\n this.setCoordinates(coordinates)\n }\n }\n\n _exportGeoJSONGeometry () {\n const points = this.getCoordinates()\n const coordinates = Coordinate.toNumberArrays(points)\n return {\n 'type': 'LineString',\n 'coordinates': coordinates\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options)\n }\n }\n}\n\nPolyline.mergeOptions(options)\n\nPolyline.registerJSONType('Polyline')\n\nexport default Polyline\n","/**\r\n * Created by FDD on 2017/12/12.\r\n * @desc 自由线\r\n * @Inherits maptalks.LineString\r\n */\r\nimport * as maptalks from 'maptalks'\r\nconst Coordinate = maptalks.Coordinate\r\nconst options = {\r\n 'arrowStyle': null,\r\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\r\n 'clipToPaint': true\r\n}\r\n\r\nclass FreeLine extends maptalks.LineString {\r\n constructor (coordinates, options = {}) {\r\n super(options)\r\n this.type = 'FreeLine'\r\n if (coordinates) {\r\n this.setCoordinates(coordinates)\r\n }\r\n }\r\n\r\n _exportGeoJSONGeometry () {\r\n const points = this.getCoordinates()\r\n const coordinates = Coordinate.toNumberArrays(points)\r\n return {\r\n 'type': 'LineString',\r\n 'coordinates': coordinates\r\n }\r\n }\r\n\r\n _toJSON (options) {\r\n return {\r\n 'feature': this.toGeoJSON(options)\r\n }\r\n }\r\n}\r\n\r\nFreeLine.mergeOptions(options)\r\n\r\nFreeLine.registerJSONType('FreeLine')\r\n\r\nexport default FreeLine\r\n","/**\n * Created by FDD on 2017/5/20.\n * @desc 标绘图形构造类\n */\n\nimport Curve from './Polyline/Curve'\nimport Polyline from './Polyline/Polyline'\nimport FreeLine from './Polyline/FreeLine'\nimport * as PlotTypes from '../core/PlotTypes'\nconst RegisterModes = {}\nRegisterModes[PlotTypes.CURVE] = {\n 'action': ['click', 'click', 'dbclick'],\n 'create': function (path) {\n return new Curve(path)\n },\n 'update': function (path, geometry) {\n geometry.setCoordinates(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\nRegisterModes[PlotTypes.POLYLINE] = {\n 'action': ['click', 'mousemove', 'dbclick'],\n 'create': function (path) {\n return new Polyline(path)\n },\n 'update': function (path, geometry) {\n geometry.setCoordinates(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\nRegisterModes[PlotTypes.FREE_LINE] = {\n 'action': ['mousedown', 'drag', 'mouseup'],\n 'create': function (path) {\n return new FreeLine(path)\n },\n 'update': function (path, geometry) {\n geometry.setCoordinates(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\n\nexport default RegisterModes\n","import * as Constants from '../Constants'\n/**\n * 计算两个坐标之间的距离\n * @param pnt1\n * @param pnt2\n * @returns {number}\n * @constructor\n */\nexport const MathDistance = (pnt1, pnt2) => {\n return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))\n}\n\n/**\n * 计算点集合的总距离\n * @param points\n * @returns {number}\n */\nexport const wholeDistance = (points) => {\n let distance = 0\n if (points && Array.isArray(points) && points.length > 0) {\n points.forEach((item, index) => {\n if (index < points.length - 1) {\n distance += (MathDistance(item, points[index + 1]))\n }\n })\n }\n return distance\n}\n/**\n * 获取基础长度\n * @param points\n * @returns {number}\n */\nexport const getBaseLength = (points) => {\n return Math.pow(wholeDistance(points), 0.99)\n}\n\n/**\n * 求取两个坐标的中间值\n * @param point1\n * @param point2\n * @returns {[*,*]}\n * @constructor\n */\nexport const Mid = (point1, point2) => {\n return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]\n}\n\n/**\n * 通过三个点确定一个圆的中心点\n * @param point1\n * @param point2\n * @param point3\n */\nexport const getCircleCenterOfThreePoints = (point1, point2, point3) => {\n let pntA = [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]\n let pntB = [pntA[0] - point1[1] + point2[1], pntA[1] + point1[0] - point2[0]]\n let pntC = [(point1[0] + point3[0]) / 2, (point1[1] + point3[1]) / 2]\n let pntD = [pntC[0] - point1[1] + point3[1], pntC[1] + point1[0] - point3[0]]\n return getIntersectPoint(pntA, pntB, pntC, pntD)\n}\n\n/**\n * 获取交集的点\n * @param pntA\n * @param pntB\n * @param pntC\n * @param pntD\n * @returns {[*,*]}\n */\nexport const getIntersectPoint = (pntA, pntB, pntC, pntD) => {\n if (pntA[1] === pntB[1]) {\n let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])\n let x = f * (pntA[1] - pntC[1]) + pntC[0]\n let y = pntA[1]\n return [x, y]\n }\n if (pntC[1] === pntD[1]) {\n let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])\n let x = e * (pntC[1] - pntA[1]) + pntA[0]\n let y = pntC[1]\n return [x, y]\n }\n let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])\n let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])\n let y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f)\n let x = e * y - e * pntA[1] + pntA[0]\n return [x, y]\n}\n\n/**\n * 获取方位角(地平经度)\n * @param startPoint\n * @param endPoint\n * @returns {*}\n */\nexport const getAzimuth = (startPoint, endPoint) => {\n let azimuth\n let angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / (MathDistance(startPoint, endPoint)))\n if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) {\n azimuth = angle + Math.PI\n } else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) {\n azimuth = Math.PI * 2 - angle\n } else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) {\n azimuth = angle\n } else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) {\n azimuth = Math.PI - angle\n }\n return azimuth\n}\n\n/**\n * 通过三个点获取方位角\n * @param pntA\n * @param pntB\n * @param pntC\n * @returns {number}\n */\nexport const getAngleOfThreePoints = (pntA, pntB, pntC) => {\n let angle = getAzimuth(pntB, pntA) - getAzimuth(pntB, pntC)\n return ((angle < 0) ? (angle + Math.PI * 2) : angle)\n}\n\n/**\n * 判断是否是顺时针\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {boolean}\n */\nexport const isClockWise = (pnt1, pnt2, pnt3) => {\n return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))\n}\n\n/**\n * 获取线上的点\n * @param t\n * @param startPnt\n * @param endPnt\n * @returns {[*,*]}\n */\nexport const getPointOnLine = (t, startPnt, endPnt) => {\n let x = startPnt[0] + (t * (endPnt[0] - startPnt[0]))\n let y = startPnt[1] + (t * (endPnt[1] - startPnt[1]))\n return [x, y]\n}\n\n/**\n * 获取立方值\n * @param t\n * @param startPnt\n * @param cPnt1\n * @param cPnt2\n * @param endPnt\n * @returns {[*,*]}\n */\nexport const getCubicValue = (t, startPnt, cPnt1, cPnt2, endPnt) => {\n t = Math.max(Math.min(t, 1), 0)\n let [tp, t2] = [(1 - t), (t * t)]\n let t3 = t2 * t\n let tp2 = tp * tp\n let tp3 = tp2 * tp\n let x = (tp3 * startPnt[0]) + (3 * tp2 * t * cPnt1[0]) + (3 * tp * t2 * cPnt2[0]) + (t3 * endPnt[0])\n let y = (tp3 * startPnt[1]) + (3 * tp2 * t * cPnt1[1]) + (3 * tp * t2 * cPnt2[1]) + (t3 * endPnt[1])\n return [x, y]\n}\n\n/**\n * 根据起止点和旋转方向求取第三个点\n * @param startPnt\n * @param endPnt\n * @param angle\n * @param distance\n * @param clockWise\n * @returns {[*,*]}\n */\nexport const getThirdPoint = (startPnt, endPnt, angle, distance, clockWise) => {\n let azimuth = getAzimuth(startPnt, endPnt)\n let alpha = clockWise ? (azimuth + angle) : (azimuth - angle)\n let dx = distance * Math.cos(alpha)\n let dy = distance * Math.sin(alpha)\n return ([endPnt[0] + dx, endPnt[1] + dy])\n}\n\n/**\n * 插值弓形线段点\n * @param center\n * @param radius\n * @param startAngle\n * @param endAngle\n * @returns {null}\n */\nexport const getArcPoints = (center, radius, startAngle, endAngle) => {\n let [x, y, pnts, angleDiff] = [null, null, [], (endAngle - startAngle)]\n angleDiff = ((angleDiff < 0) ? (angleDiff + (Math.PI * 2)) : angleDiff)\n for (let i = 0; i <= 100; i++) {\n let angle = startAngle + angleDiff * i / 100\n x = center[0] + radius * Math.cos(angle)\n y = center[1] + radius * Math.sin(angle)\n pnts.push([x, y])\n }\n return pnts\n}\n\n/**\n * getBisectorNormals\n * @param t\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {[*,*]}\n */\nexport const getBisectorNormals = (t, pnt1, pnt2, pnt3) => {\n let normal = getNormal(pnt1, pnt2, pnt3)\n let [bisectorNormalRight, bisectorNormalLeft, dt, x, y] = [null, null, null, null, null]\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n let uX = normal[0] / dist\n let uY = normal[1] / dist\n let d1 = MathDistance(pnt1, pnt2)\n let d2 = MathDistance(pnt2, pnt3)\n if (dist > Constants.ZERO_TOLERANCE) {\n if (isClockWise(pnt1, pnt2, pnt3)) {\n dt = t * d1\n x = pnt2[0] - dt * uY\n y = pnt2[1] + dt * uX\n bisectorNormalRight = [x, y]\n dt = t * d2\n x = pnt2[0] + dt * uY\n y = pnt2[1] - dt * uX\n bisectorNormalLeft = [x, y]\n } else {\n dt = t * d1\n x = pnt2[0] + dt * uY\n y = pnt2[1] - dt * uX\n bisectorNormalRight = [x, y]\n dt = t * d2\n x = pnt2[0] - dt * uY\n y = pnt2[1] + dt * uX\n bisectorNormalLeft = [x, y]\n }\n } else {\n x = pnt2[0] + t * (pnt1[0] - pnt2[0])\n y = pnt2[1] + t * (pnt1[1] - pnt2[1])\n bisectorNormalRight = [x, y]\n x = pnt2[0] + t * (pnt3[0] - pnt2[0])\n y = pnt2[1] + t * (pnt3[1] - pnt2[1])\n bisectorNormalLeft = [x, y]\n }\n return [bisectorNormalRight, bisectorNormalLeft]\n}\n\n/**\n * 获取默认三点的内切圆\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {[*,*]}\n */\nexport const getNormal = (pnt1, pnt2, pnt3) => {\n let dX1 = pnt1[0] - pnt2[0]\n let dY1 = pnt1[1] - pnt2[1]\n let d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1)\n dX1 /= d1\n dY1 /= d1\n let dX2 = pnt3[0] - pnt2[0]\n let dY2 = pnt3[1] - pnt2[1]\n let d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2)\n dX2 /= d2\n dY2 /= d2\n let uX = dX1 + dX2\n let uY = dY1 + dY2\n return [uX, uY]\n}\n\n/**\n * 获取左边控制点\n * @param controlPoints\n * @returns {[*,*]}\n */\nexport const getLeftMostControlPoint = (controlPoints, t) => {\n let [pnt1, pnt2, pnt3, controlX, controlY] = [controlPoints[0], controlPoints[1], controlPoints[2], null, null]\n let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3)\n let normalRight = pnts[0]\n let normal = getNormal(pnt1, pnt2, pnt3)\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n if (dist > Constants.ZERO_TOLERANCE) {\n let mid = Mid(pnt1, pnt2)\n let pX = pnt1[0] - mid[0]\n let pY = pnt1[1] - mid[1]\n let d1 = MathDistance(pnt1, pnt2)\n let n = 2.0 / d1\n let nX = -n * pY\n let nY = n * pX\n let a11 = nX * nX - nY * nY\n let a12 = 2 * nX * nY\n let a22 = nY * nY - nX * nX\n let dX = normalRight[0] - mid[0]\n let dY = normalRight[1] - mid[1]\n controlX = mid[0] + a11 * dX + a12 * dY\n controlY = mid[1] + a12 * dX + a22 * dY\n } else {\n controlX = pnt1[0] + t * (pnt2[0] - pnt1[0])\n controlY = pnt1[1] + t * (pnt2[1] - pnt1[1])\n }\n return [controlX, controlY]\n}\n\n/**\n * 获取右边控制点\n * @param controlPoints\n * @param t\n * @returns {[*,*]}\n */\nexport const getRightMostControlPoint = (controlPoints, t) => {\n let count = controlPoints.length\n let pnt1 = controlPoints[count - 3]\n let pnt2 = controlPoints[count - 2]\n let pnt3 = controlPoints[count - 1]\n let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3)\n let normalLeft = pnts[1]\n let normal = getNormal(pnt1, pnt2, pnt3)\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n let [controlX, controlY] = [null, null]\n if (dist > Constants.ZERO_TOLERANCE) {\n let mid = Mid(pnt2, pnt3)\n let pX = pnt3[0] - mid[0]\n let pY = pnt3[1] - mid[1]\n let d1 = MathDistance(pnt2, pnt3)\n let n = 2.0 / d1\n let nX = -n * pY\n let nY = n * pX\n let a11 = nX * nX - nY * nY\n let a12 = 2 * nX * nY\n let a22 = nY * nY - nX * nX\n let dX = normalLeft[0] - mid[0]\n let dY = normalLeft[1] - mid[1]\n controlX = mid[0] + a11 * dX + a12 * dY\n controlY = mid[1] + a12 * dX + a22 * dY\n } else {\n controlX = pnt3[0] + t * (pnt2[0] - pnt3[0])\n controlY = pnt3[1] + t * (pnt2[1] - pnt3[1])\n }\n return [controlX, controlY]\n}\n\n/**\n * 插值曲线点\n * @param t\n * @param controlPoints\n * @returns {null}\n */\nexport const getCurvePoints = (t, controlPoints) => {\n let leftControl = getLeftMostControlPoint(controlPoints, t)\n let [pnt1, pnt2, pnt3, normals, points] = [null, null, null, [leftControl], []]\n for (let i = 0; i < controlPoints.length - 2; i++) {\n [pnt1, pnt2, pnt3] = [controlPoints[i], controlPoints[i + 1], controlPoints[i + 2]]\n let normalPoints = getBisectorNormals(t, pnt1, pnt2, pnt3)\n normals = normals.concat(normalPoints)\n }\n let rightControl = getRightMostControlPoint(controlPoints, t)\n if (rightControl) {\n normals.push(rightControl)\n }\n for (let i = 0; i < controlPoints.length - 1; i++) {\n pnt1 = controlPoints[i]\n pnt2 = controlPoints[i + 1]\n points.push(pnt1)\n for (let t = 0; t < Constants.FITTING_COUNT; t++) {\n let pnt = getCubicValue(t / Constants.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)\n points.push(pnt)\n }\n points.push(pnt2)\n }\n return points\n}\n\n/**\n * 贝塞尔曲线\n * @param points\n * @returns {*}\n */\nexport const getBezierPoints = function (points) {\n if (points.length <= 2) {\n return points\n } else {\n let bezierPoints = []\n let n = points.length - 1\n for (let t = 0; t <= 1; t += 0.01) {\n let [x, y] = [0, 0]\n for (let index = 0; index <= n; index++) {\n let factor = getBinomialFactor(n, index)\n let a = Math.pow(t, index)\n let b = Math.pow((1 - t), (n - index))\n x += factor * a * b * points[index][0]\n y += factor * a * b * points[index][1]\n }\n bezierPoints.push([x, y])\n }\n bezierPoints.push(points[n])\n return bezierPoints\n }\n}\n\n/**\n * 获取阶乘数据\n * @param n\n * @returns {number}\n */\nexport const getFactorial = (n) => {\n let result = 1\n switch (n) {\n case (n <= 1):\n result = 1\n break\n case (n === 2):\n result = 2\n break\n case (n === 3):\n result = 6\n break\n case (n === 24):\n result = 24\n break\n case (n === 5):\n result = 120\n break\n default:\n for (let i = 1; i <= n; i++) {\n result *= i\n }\n break\n }\n return result\n}\n\n/**\n * 获取二项分布\n * @param n\n * @param index\n * @returns {number}\n */\nexport const getBinomialFactor = (n, index) => {\n return (getFactorial(n) / (getFactorial(index) * getFactorial(n - index)))\n}\n\n/**\n * 插值线性点\n * @param points\n * @returns {*}\n */\nexport const getQBSplinePoints = points => {\n if (points.length <= 2) {\n return points\n } else {\n let [n, bSplinePoints] = [2, []]\n let m = points.length - n - 1\n bSplinePoints.push(points[0])\n for (let i = 0; i <= m; i++) {\n for (let t = 0; t <= 1; t += 0.05) {\n let [x, y] = [0, 0]\n for (let k = 0; k <= n; k++) {\n let factor = getQuadricBSplineFactor(k, t)\n x += factor * points[i + k][0]\n y += factor * points[i + k][1]\n }\n bSplinePoints.push([x, y])\n }\n }\n bSplinePoints.push(points[points.length - 1])\n return bSplinePoints\n }\n}\n\n/**\n * 得到二次线性因子\n * @param k\n * @param t\n * @returns {number}\n */\nexport const getQuadricBSplineFactor = (k, t) => {\n let res = 0\n if (k === 0) {\n res = Math.pow(t - 1, 2) / 2\n } else if (k === 1) {\n res = (-2 * Math.pow(t, 2) + 2 * t + 1) / 2\n } else if (k === 2) {\n res = Math.pow(t, 2) / 2\n }\n return res\n}\n\n/**\n * 判断是否为对象\n * @param value\n * @returns {boolean}\n */\nexport const isObject = value => {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nexport const merge = (a, b) => {\n for (const key in b) {\n if (isObject(b[key]) && isObject(a[key])) {\n merge(a[key], b[key])\n } else {\n a[key] = b[key]\n }\n }\n return a\n}\n","/**\n * Created by FDD on 2017/12/10.\n * @desc PlotDraw\n */\n\nimport * as maptalks from 'maptalks'\nimport {BASE_LAYERNAME} from '../Constants'\nimport RegisterModes from '../geometry'\nimport { merge } from '../utils/utils'\nconst _options = {\n 'symbol': {\n 'lineColor': '#000',\n 'lineWidth': 2,\n 'lineOpacity': 1,\n 'polygonFill': '#fff',\n 'polygonOpacity': 0.3\n },\n 'doubleClickZoom': false,\n 'mode': null,\n 'once': false,\n 'ignoreMouseleave': true\n}\nconst registeredMode = {}\nconst stopPropagation = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.cancelBubble = true\n }\n return this\n}\nclass PlotDraw extends maptalks.MapTool {\n constructor (options = {}) {\n const $options = merge(_options, options)\n super($options)\n this.options = $options\n if (this.options['mode']) this._getRegisterMode()\n\n /**\n * 创建图层名称\n * @type {string}\n */\n this.layerName = ((this.options && this.options['layerName']) ? this.options['layerName'] : BASE_LAYERNAME)\n\n /**\n * 创建标绘要素图层\n * @type {*}\n */\n this.drawLayer = null\n }\n\n /**\n * 获取注册过的标绘类型\n * @returns {Object}\n * @private\n */\n _getRegisterMode () {\n const mode = this.getMode()\n const registerMode = PlotDraw.getRegisterMode(mode)\n if (!registerMode) {\n throw new Error(mode + ' is not a valid type of PlotDraw.')\n }\n return registerMode\n }\n\n /**\n * 激活对应工具\n * @param mode\n * @returns {PlotDraw}\n */\n setMode (mode) {\n this._clearStage()\n this._switchEvents('off') // _prototype\n this.options['mode'] = mode\n this._getRegisterMode() // cheack type\n if (this.isEnabled()) {\n this._switchEvents('on')\n this._deactiveMapInteractions()\n }\n return this\n }\n\n /**\n * 获取当前激活的标绘工具\n * @return {String} mode\n */\n getMode () {\n if (this.options['mode']) {\n return this.options['mode'].toLowerCase()\n }\n return null\n }\n\n /**\n * 取消激活地图交互并保存\n */\n _deactiveMapInteractions () {\n const map = this.getMap()\n this._mapDoubleClickZoom = map.options['doubleClickZoom']\n map.config({\n 'doubleClickZoom': this.options['doubleClickZoom']\n })\n const action = this._getRegisterMode()['action']\n if (action.indexOf('drag') > -1) {\n const map = this.getMap()\n this._mapDraggable = map.options['draggable']\n map.config({\n 'draggable': false\n })\n }\n }\n\n /**\n * 激活地图原有交互\n * @private\n */\n _activateMapInteractions () {\n const map = this.getMap()\n map.config({\n 'doubleClickZoom': this._mapDoubleClickZoom\n })\n if (this._mapDraggable) {\n map.config('draggable', this._mapDraggable)\n }\n delete this._mapDraggable\n delete this._mapDoubleClickZoom\n }\n\n /**\n * get register events\n * @returns {*}\n */\n getEvents () {\n const action = this._getRegisterMode()['action']\n if (Array.isArray(action)) {\n return {\n 'click': this._firstClickHandler,\n 'mousemove': this._mouseMoveHandler,\n 'dblclick': this._doubleClickHandler\n }\n }\n return null\n }\n\n _firstClickHandler (event) {\n const registerMode = this._getRegisterMode()\n const coordinate = event['coordinate']\n const symbol = this.getSymbol()\n if (!this._geometry) {\n this._clickCoords = [coordinate]\n this._geometry = registerMode['create'](this._clickCoords, event)\n if (symbol) {\n this._geometry.setSymbol(symbol)\n }\n this._addGeometryToStage(this._geometry)\n this._fireEvent('drawstart', event)\n } else {\n if (!(this._historyPointer === null)) {\n this._clickCoords = this._clickCoords.slice(0, this._historyPointer)\n }\n this._clickCoords.push(coordinate)\n this._historyPointer = this._clickCoords.length\n registerMode['update'](this._clickCoords, this._geometry, event)\n this._fireEvent('drawvertex', event)\n }\n }\n\n /**\n * 鼠标移动事件处理\n * @param event\n * @private\n */\n _mouseMoveHandler (event) {\n const map = this.getMap()\n if (!this._geometry || !map || map.isInteracting()) {\n return\n }\n const containerPoint = this._getMouseContainerPoint(event)\n if (!this._isValidContainerPoint(containerPoint)) {\n return\n }\n const coordinate = event['coordinate']\n const registerMode = this._getRegisterMode()\n const path = this._clickCoords.slice(0, this._historyPointer)\n if (path && path.length > 0 && coordinate.equals(path[path.length - 1])) {\n return\n }\n registerMode['update'](path.concat([coordinate]), this._geometry, event)\n this._fireEvent('mousemove', event)\n }\n\n /**\n * 双击事件处理\n * @param event\n * @private\n */\n _doubleClickHandler (event) {\n this.endDraw(event)\n }\n\n _getMouseContainerPoint (event) {\n const action = this._getRegisterMode()['action']\n if (action.indexOf('drag') > -1) {\n stopPropagation(event['domEvent'])\n }\n return event['containerPoint']\n }\n\n _isValidContainerPoint (containerPoint) {\n const mapSize = this._map.getSize()\n const w = mapSize['width']\n const h = mapSize['height']\n if (containerPoint.x < 0 || containerPoint.y < 0) {\n return false\n } else if (containerPoint.x > w || containerPoint.y > h) {\n return false\n }\n return true\n }\n\n /**\n * 清空缓存\n * @private\n */\n _clearStage () {\n this._getDrawLayer(this.layerName).clear()\n if (this._geometry) {\n this._geometry.remove()\n delete this._geometry\n }\n delete this._clickCoords\n }\n\n /**\n * 添加geometry到图层\n * @param geometry\n * @private\n */\n _addGeometryToStage (geometry) {\n this._getDrawLayer(this.layerName).addGeometry(geometry)\n }\n\n /**\n * Set draw tool's symbol\n * @param {Object} symbol - symbol set\n * @returns {DrawTool} this\n */\n setSymbol (symbol) {\n if (!symbol) {\n return this\n }\n this.options['symbol'] = symbol\n if (this._geometry) {\n this._geometry.setSymbol(symbol)\n }\n return this\n }\n\n /**\n * Get symbol of the draw tool\n * @return {Object} symbol\n */\n getSymbol () {\n const symbol = this.options['symbol']\n if (symbol) {\n return maptalks.Util.extendSymbol(symbol)\n } else {\n return maptalks.Util.extendSymbol(this.options['symbol'])\n }\n }\n\n /**\n * 创建矢量图层\n * @param layerName\n * @returns {*}\n * @private\n */\n _getDrawLayer (layerName) {\n let drawToolLayer = this._map.getLayer(layerName)\n if (!drawToolLayer) {\n drawToolLayer = new maptalks.VectorLayer(layerName, {\n 'enableSimplify': false\n })\n this._map.addLayer(drawToolLayer)\n }\n return drawToolLayer\n }\n\n /**\n * fire event\n * @param eventName\n * @param param\n * @private\n */\n _fireEvent (eventName, param = {}) {\n if (this._geometry) {\n param['geometry'] = this._getRegisterMode()['generate'](this._geometry).copy()\n }\n maptalks.MapTool.prototype._fireEvent.call(this, eventName, param)\n }\n\n /**\n * when layer add, check register mode\n */\n onAdd () {\n this._getRegisterMode()\n }\n\n /**\n * handle enAble event\n * @returns {PlotDraw}\n */\n onEnable () {\n this._deactiveMapInteractions()\n this.drawLayer = this._getDrawLayer(this.layerName)\n this._clearStage()\n this._loadResources()\n return this\n }\n\n /**\n * handle disable event\n * @returns {PlotDraw}\n */\n onDisable () {\n const map = this.getMap()\n this._activateMapInteractions()\n this.endDraw()\n if (this._map) {\n map.removeLayer(this._getDrawLayer(this.layerName))\n }\n return this\n }\n\n /**\n * 结束当前绘制\n * @param param\n * @returns {PlotDraw}\n */\n endDraw (param = {}) {\n if (!this._geometry || this._ending) {\n return this\n }\n this._ending = true\n const geometry = this._geometry\n this._clearStage()\n this._geometry = geometry\n this._fireEvent('drawend', param)\n delete this._geometry\n if (this.options['once']) {\n this.disable()\n }\n delete this._ending\n return this\n }\n\n _loadResources () {\n const symbol = this.getSymbol()\n const resources = maptalks.Util.getExternalResources(symbol)\n if (resources.length > 0) {\n this.drawLayer._getRenderer().loadResources(resources)\n }\n }\n\n /**\n * Register a new mode for DrawTool\n * @param name\n * @param modeAction\n */\n static registerMode (name, modeAction) {\n registeredMode[name.toLowerCase()] = modeAction\n }\n\n /**\n * Get mode actions by mode name\n * @param {String} name DrawTool mode name\n * @return {Object} mode actions\n */\n static getRegisterMode (name) {\n return registeredMode[name.toLowerCase()]\n }\n\n /**\n * Register modes for DrawTool\n * @param modes\n */\n static registeredModes (modes) {\n if (modes) {\n for (let key of Reflect.ownKeys(modes)) {\n if (!key.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n let desc = Object.getOwnPropertyDescriptor(modes, key)\n let _key = key.toLowerCase()\n Object.defineProperty(registeredMode, _key, desc)\n console.log(registeredMode)\n }\n }\n }\n }\n}\n\nPlotDraw.registeredModes(RegisterModes)\n\nexport default PlotDraw\n"],"names":["TextArea","ARC","CURVE","GATHERING_PLACE","POLYLINE","FREE_LINE","POINT","PENNANT","RECTANGLE","CIRCLE","ELLIPSE","LUNE","SECTOR","CLOSED_CURVE","POLYGON","FREE_POLYGON","ATTACK_ARROW","DOUBLE_ARROW","STRAIGHT_ARROW","FINE_ARROW","ASSAULT_DIRECTION","TAILED_ATTACK_ARROW","SQUAD_COMBAT","TAILED_SQUAD_COMBAT","RECTFLAG","TRIANGLEFLAG","CURVEFLAG","BASE_LAYERNAME","Canvas2d","maptalks","options","Curve","_arc","ctx","points","lineOpacity","degree","Math","PI","i","l","length","_arcBetween","_stroke","_quadraticCurve","_path","quadraticCurve","_bezierCurve","bezierCurveTo","x","y","lineTo","_toJSON","toGeoJSON","_paintOn","beginPath","_paintArrow","fromJSON","json","feature","arc","setProperties","registerJSONType","mergeOptions","Coordinate","Polyline","coordinates","type","setCoordinates","_exportGeoJSONGeometry","getCoordinates","toNumberArrays","FreeLine","RegisterModes","PlotTypes","path","geometry","isObject","value","merge","a","b","key","_options","registeredMode","stopPropagation","e","cancelBubble","PlotDraw","$options","_getRegisterMode","layerName","drawLayer","mode","getMode","registerMode","getRegisterMode","Error","setMode","_clearStage","_switchEvents","isEnabled","_deactiveMapInteractions","toLowerCase","map","getMap","_mapDoubleClickZoom","config","action","indexOf","_mapDraggable","_activateMapInteractions","getEvents","Array","isArray","_firstClickHandler","_mouseMoveHandler","_doubleClickHandler","event","coordinate","symbol","getSymbol","_geometry","_clickCoords","setSymbol","_addGeometryToStage","_fireEvent","_historyPointer","slice","push","isInteracting","containerPoint","_getMouseContainerPoint","_isValidContainerPoint","equals","concat","endDraw","mapSize","_map","getSize","w","h","_getDrawLayer","clear","remove","addGeometry","extendSymbol","drawToolLayer","getLayer","addLayer","eventName","param","copy","prototype","call","onAdd","onEnable","_loadResources","onDisable","removeLayer","_ending","disable","resources","getExternalResources","_getRenderer","loadResources","name","modeAction","registeredModes","modes","Reflect","ownKeys","match","desc","Object","getOwnPropertyDescriptor","_key","defineProperty","log"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"maptalks.plot.js","sources":["../src/core/PlotTypes.js","../src/Constants.js","../src/geometry/helper/index.js","../src/geometry/Polyline/Arc.js","../src/geometry/Polyline/Curve.js","../src/geometry/Polyline/Polyline.js","../src/geometry/Polyline/FreeLine.js","../src/geometry/index.js","../src/utils/utils.js","../src/core/PlotDraw.js"],"sourcesContent":["/**\n * Created by FDD on 2017/5/20.\n */\nconst TextArea = 'TextArea' // 文本标绘(特殊)\nconst ARC = 'Arc'\nconst CURVE = 'Curve'\nconst GATHERING_PLACE = 'GatheringPlace'\nconst POLYLINE = 'Polyline'\nconst FREE_LINE = 'FreeLine'\nconst POINT = 'Point'\nconst PENNANT = 'Pennant'\nconst RECTANGLE = 'RectAngle'\nconst CIRCLE = 'Circle'\nconst ELLIPSE = 'Ellipse'\nconst LUNE = 'Lune'\nconst SECTOR = 'Sector'\nconst CLOSED_CURVE = 'ClosedCurve'\nconst POLYGON = 'Polygon'\nconst FREE_POLYGON = 'FreePolygon'\nconst ATTACK_ARROW = 'AttackArrow'\nconst DOUBLE_ARROW = 'DoubleArrow'\nconst STRAIGHT_ARROW = 'StraightArrow'\nconst FINE_ARROW = 'FineArrow'\nconst ASSAULT_DIRECTION = 'AssaultDirection'\nconst TAILED_ATTACK_ARROW = 'TailedAttackArrow'\nconst SQUAD_COMBAT = 'SquadCombat'\nconst TAILED_SQUAD_COMBAT = 'TailedSquadCombat'\nconst RECTFLAG = 'RectFlag'\nconst TRIANGLEFLAG = 'TriangleFlag'\nconst CURVEFLAG = 'CurveFlag'\nexport {\n TextArea,\n ARC,\n CURVE,\n GATHERING_PLACE,\n POLYLINE,\n FREE_LINE,\n POINT,\n PENNANT,\n RECTANGLE,\n CIRCLE,\n ELLIPSE,\n LUNE,\n SECTOR,\n CLOSED_CURVE,\n POLYGON,\n FREE_POLYGON,\n ATTACK_ARROW,\n DOUBLE_ARROW,\n STRAIGHT_ARROW,\n FINE_ARROW,\n ASSAULT_DIRECTION,\n TAILED_SQUAD_COMBAT,\n TAILED_ATTACK_ARROW,\n SQUAD_COMBAT,\n RECTFLAG,\n TRIANGLEFLAG,\n CURVEFLAG\n}\n","/**\n * Created by FDD on 2017/5/22.\n * @desc 常用变量\n */\nexport const FITTING_COUNT = 100\nexport const HALF_PI = Math.PI / 2\nexport const ZERO_TOLERANCE = 0.0001\nexport const TWO_PI = Math.PI * 2\nexport const BASE_LAYERNAME = 'maptalks-plot-vector-layer' // 矢量图层名,(唯一标识)\nexport const BASE_HELP_CONTROL_POINT_ID = 'plot-helper-control-point-div' // 控制点要素的基类id\nexport const BASE_HELP_HIDDEN = 'plot-helper-hidden-div' // 父类隐藏容器\nexport const INTERNAL_LAYER_PREFIX = '_maptalks__internal_layer_'\nexport const DEF_TEXT_STYEL = { // 默认文本框样式\n backgroundColor: '#fff',\n borderRadius: '2px',\n boxSizing: 'border-box',\n border: '3px solid rgba(255, 0, 0, 1)',\n fontFamily: 'Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Noto Sans CJK SC,WenQuanYi Micro Hei,Arial,sans-serif',\n color: '#010500',\n fontWeight: 400,\n padding: '10px',\n fontStretch: 'normal'\n}\n","import * as Constants from '../../Constants'\n/**\n * 计算两个坐标之间的距离\n * @param pnt1\n * @param pnt2\n * @returns {number}\n * @constructor\n */\nexport const MathDistance = (pnt1, pnt2) => {\n return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))\n}\n\n/**\n * 计算点集合的总距离\n * @param points\n * @returns {number}\n */\nexport const wholeDistance = (points) => {\n let distance = 0\n if (points && Array.isArray(points) && points.length > 0) {\n points.forEach((item, index) => {\n if (index < points.length - 1) {\n distance += (MathDistance(item, points[index + 1]))\n }\n })\n }\n return distance\n}\n/**\n * 获取基础长度\n * @param points\n * @returns {number}\n */\nexport const getBaseLength = (points) => {\n return Math.pow(wholeDistance(points), 0.99)\n}\n\n/**\n * 求取两个坐标的中间值\n * @param point1\n * @param point2\n * @returns {[*,*]}\n * @constructor\n */\nexport const Mid = (point1, point2) => {\n return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]\n}\n\n/**\n * 通过三个点确定一个圆的中心点\n * @param point1\n * @param point2\n * @param point3\n */\nexport const getCircleCenterOfThreePoints = (point1, point2, point3) => {\n let pntA = [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]\n let pntB = [pntA[0] - point1[1] + point2[1], pntA[1] + point1[0] - point2[0]]\n let pntC = [(point1[0] + point3[0]) / 2, (point1[1] + point3[1]) / 2]\n let pntD = [pntC[0] - point1[1] + point3[1], pntC[1] + point1[0] - point3[0]]\n return getIntersectPoint(pntA, pntB, pntC, pntD)\n}\n\n/**\n * 获取交集的点\n * @param pntA\n * @param pntB\n * @param pntC\n * @param pntD\n * @returns {[*,*]}\n */\nexport const getIntersectPoint = (pntA, pntB, pntC, pntD) => {\n if (pntA[1] === pntB[1]) {\n let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])\n let x = f * (pntA[1] - pntC[1]) + pntC[0]\n let y = pntA[1]\n return [x, y]\n }\n if (pntC[1] === pntD[1]) {\n let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])\n let x = e * (pntC[1] - pntA[1]) + pntA[0]\n let y = pntC[1]\n return [x, y]\n }\n let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])\n let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])\n let y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f)\n let x = e * y - e * pntA[1] + pntA[0]\n return [x, y]\n}\n\n/**\n * 获取方位角(地平经度)\n * @param startPoint\n * @param endPoint\n * @returns {*}\n */\nexport const getAzimuth = (startPoint, endPoint) => {\n let azimuth\n let angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / (MathDistance(startPoint, endPoint)))\n if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) {\n azimuth = angle + Math.PI\n } else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) {\n azimuth = Math.PI * 2 - angle\n } else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) {\n azimuth = angle\n } else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) {\n azimuth = Math.PI - angle\n }\n return azimuth\n}\n\n/**\n * 通过三个点获取方位角\n * @param pntA\n * @param pntB\n * @param pntC\n * @returns {number}\n */\nexport const getAngleOfThreePoints = (pntA, pntB, pntC) => {\n let angle = getAzimuth(pntB, pntA) - getAzimuth(pntB, pntC)\n return ((angle < 0) ? (angle + Math.PI * 2) : angle)\n}\n\n/**\n * 判断是否是顺时针\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {boolean}\n */\nexport const isClockWise = (pnt1, pnt2, pnt3) => {\n return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))\n}\n\n/**\n * 获取线上的点\n * @param t\n * @param startPnt\n * @param endPnt\n * @returns {[*,*]}\n */\nexport const getPointOnLine = (t, startPnt, endPnt) => {\n let x = startPnt[0] + (t * (endPnt[0] - startPnt[0]))\n let y = startPnt[1] + (t * (endPnt[1] - startPnt[1]))\n return [x, y]\n}\n\n/**\n * 获取立方值\n * @param t\n * @param startPnt\n * @param cPnt1\n * @param cPnt2\n * @param endPnt\n * @returns {[*,*]}\n */\nexport const getCubicValue = (t, startPnt, cPnt1, cPnt2, endPnt) => {\n t = Math.max(Math.min(t, 1), 0)\n let [tp, t2] = [(1 - t), (t * t)]\n let t3 = t2 * t\n let tp2 = tp * tp\n let tp3 = tp2 * tp\n let x = (tp3 * startPnt[0]) + (3 * tp2 * t * cPnt1[0]) + (3 * tp * t2 * cPnt2[0]) + (t3 * endPnt[0])\n let y = (tp3 * startPnt[1]) + (3 * tp2 * t * cPnt1[1]) + (3 * tp * t2 * cPnt2[1]) + (t3 * endPnt[1])\n return [x, y]\n}\n\n/**\n * 根据起止点和旋转方向求取第三个点\n * @param startPnt\n * @param endPnt\n * @param angle\n * @param distance\n * @param clockWise\n * @returns {[*,*]}\n */\nexport const getThirdPoint = (startPnt, endPnt, angle, distance, clockWise) => {\n let azimuth = getAzimuth(startPnt, endPnt)\n let alpha = clockWise ? (azimuth + angle) : (azimuth - angle)\n let dx = distance * Math.cos(alpha)\n let dy = distance * Math.sin(alpha)\n return ([endPnt[0] + dx, endPnt[1] + dy])\n}\n\n/**\n * 插值弓形线段点\n * @param center\n * @param radius\n * @param startAngle\n * @param endAngle\n * @returns {null}\n */\nexport const getArcPoints = (center, radius, startAngle, endAngle) => {\n let [x, y, pnts, angleDiff] = [null, null, [], (endAngle - startAngle)]\n angleDiff = ((angleDiff < 0) ? (angleDiff + (Math.PI * 2)) : angleDiff)\n for (let i = 0; i < 100; i++) {\n let angle = startAngle + angleDiff * i / 100\n x = center[0] + radius * Math.cos(angle)\n y = center[1] + radius * Math.sin(angle)\n pnts.push([x, y])\n }\n return pnts\n}\n\n/**\n * getBisectorNormals\n * @param t\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {[*,*]}\n */\nexport const getBisectorNormals = (t, pnt1, pnt2, pnt3) => {\n let normal = getNormal(pnt1, pnt2, pnt3)\n let [bisectorNormalRight, bisectorNormalLeft, dt, x, y] = [null, null, null, null, null]\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n let uX = normal[0] / dist\n let uY = normal[1] / dist\n let d1 = MathDistance(pnt1, pnt2)\n let d2 = MathDistance(pnt2, pnt3)\n if (dist > Constants.ZERO_TOLERANCE) {\n if (isClockWise(pnt1, pnt2, pnt3)) {\n dt = t * d1\n x = pnt2[0] - dt * uY\n y = pnt2[1] + dt * uX\n bisectorNormalRight = [x, y]\n dt = t * d2\n x = pnt2[0] + dt * uY\n y = pnt2[1] - dt * uX\n bisectorNormalLeft = [x, y]\n } else {\n dt = t * d1\n x = pnt2[0] + dt * uY\n y = pnt2[1] - dt * uX\n bisectorNormalRight = [x, y]\n dt = t * d2\n x = pnt2[0] - dt * uY\n y = pnt2[1] + dt * uX\n bisectorNormalLeft = [x, y]\n }\n } else {\n x = pnt2[0] + t * (pnt1[0] - pnt2[0])\n y = pnt2[1] + t * (pnt1[1] - pnt2[1])\n bisectorNormalRight = [x, y]\n x = pnt2[0] + t * (pnt3[0] - pnt2[0])\n y = pnt2[1] + t * (pnt3[1] - pnt2[1])\n bisectorNormalLeft = [x, y]\n }\n return [bisectorNormalRight, bisectorNormalLeft]\n}\n\n/**\n * 获取默认三点的内切圆\n * @param pnt1\n * @param pnt2\n * @param pnt3\n * @returns {[*,*]}\n */\nexport const getNormal = (pnt1, pnt2, pnt3) => {\n let dX1 = pnt1[0] - pnt2[0]\n let dY1 = pnt1[1] - pnt2[1]\n let d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1)\n dX1 /= d1\n dY1 /= d1\n let dX2 = pnt3[0] - pnt2[0]\n let dY2 = pnt3[1] - pnt2[1]\n let d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2)\n dX2 /= d2\n dY2 /= d2\n let uX = dX1 + dX2\n let uY = dY1 + dY2\n return [uX, uY]\n}\n\n/**\n * 获取左边控制点\n * @param controlPoints\n * @returns {[*,*]}\n */\nexport const getLeftMostControlPoint = (controlPoints, t) => {\n let [pnt1, pnt2, pnt3, controlX, controlY] = [controlPoints[0], controlPoints[1], controlPoints[2], null, null]\n let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3)\n let normalRight = pnts[0]\n let normal = getNormal(pnt1, pnt2, pnt3)\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n if (dist > Constants.ZERO_TOLERANCE) {\n let mid = Mid(pnt1, pnt2)\n let pX = pnt1[0] - mid[0]\n let pY = pnt1[1] - mid[1]\n let d1 = MathDistance(pnt1, pnt2)\n let n = 2.0 / d1\n let nX = -n * pY\n let nY = n * pX\n let a11 = nX * nX - nY * nY\n let a12 = 2 * nX * nY\n let a22 = nY * nY - nX * nX\n let dX = normalRight[0] - mid[0]\n let dY = normalRight[1] - mid[1]\n controlX = mid[0] + a11 * dX + a12 * dY\n controlY = mid[1] + a12 * dX + a22 * dY\n } else {\n controlX = pnt1[0] + t * (pnt2[0] - pnt1[0])\n controlY = pnt1[1] + t * (pnt2[1] - pnt1[1])\n }\n return [controlX, controlY]\n}\n\n/**\n * 获取右边控制点\n * @param controlPoints\n * @param t\n * @returns {[*,*]}\n */\nexport const getRightMostControlPoint = (controlPoints, t) => {\n let count = controlPoints.length\n let pnt1 = controlPoints[count - 3]\n let pnt2 = controlPoints[count - 2]\n let pnt3 = controlPoints[count - 1]\n let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3)\n let normalLeft = pnts[1]\n let normal = getNormal(pnt1, pnt2, pnt3)\n let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])\n let [controlX, controlY] = [null, null]\n if (dist > Constants.ZERO_TOLERANCE) {\n let mid = Mid(pnt2, pnt3)\n let pX = pnt3[0] - mid[0]\n let pY = pnt3[1] - mid[1]\n let d1 = MathDistance(pnt2, pnt3)\n let n = 2.0 / d1\n let nX = -n * pY\n let nY = n * pX\n let a11 = nX * nX - nY * nY\n let a12 = 2 * nX * nY\n let a22 = nY * nY - nX * nX\n let dX = normalLeft[0] - mid[0]\n let dY = normalLeft[1] - mid[1]\n controlX = mid[0] + a11 * dX + a12 * dY\n controlY = mid[1] + a12 * dX + a22 * dY\n } else {\n controlX = pnt3[0] + t * (pnt2[0] - pnt3[0])\n controlY = pnt3[1] + t * (pnt2[1] - pnt3[1])\n }\n return [controlX, controlY]\n}\n\n/**\n * 插值曲线点\n * @param t\n * @param controlPoints\n * @returns {null}\n */\nexport const getCurvePoints = (t, controlPoints) => {\n let leftControl = getLeftMostControlPoint(controlPoints, t)\n let [pnt1, pnt2, pnt3, normals, points] = [null, null, null, [leftControl], []]\n for (let i = 0; i < controlPoints.length - 2; i++) {\n [pnt1, pnt2, pnt3] = [controlPoints[i], controlPoints[i + 1], controlPoints[i + 2]]\n let normalPoints = getBisectorNormals(t, pnt1, pnt2, pnt3)\n normals = normals.concat(normalPoints)\n }\n let rightControl = getRightMostControlPoint(controlPoints, t)\n if (rightControl) {\n normals.push(rightControl)\n }\n for (let i = 0; i < controlPoints.length - 1; i++) {\n pnt1 = controlPoints[i]\n pnt2 = controlPoints[i + 1]\n points.push(pnt1)\n for (let t = 0; t < Constants.FITTING_COUNT; t++) {\n let pnt = getCubicValue(t / Constants.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)\n points.push(pnt)\n }\n points.push(pnt2)\n }\n return points\n}\n\n/**\n * 贝塞尔曲线\n * @param points\n * @returns {*}\n */\nexport const getBezierPoints = function (points) {\n if (points.length <= 2) {\n return points\n } else {\n let bezierPoints = []\n let n = points.length - 1\n for (let t = 0; t <= 1; t += 0.01) {\n let [x, y] = [0, 0]\n for (let index = 0; index <= n; index++) {\n let factor = getBinomialFactor(n, index)\n let a = Math.pow(t, index)\n let b = Math.pow((1 - t), (n - index))\n x += factor * a * b * points[index][0]\n y += factor * a * b * points[index][1]\n }\n bezierPoints.push([x, y])\n }\n bezierPoints.push(points[n])\n return bezierPoints\n }\n}\n\n/**\n * 获取阶乘数据\n * @param n\n * @returns {number}\n */\nexport const getFactorial = (n) => {\n let result = 1\n switch (n) {\n case (n <= 1):\n result = 1\n break\n case (n === 2):\n result = 2\n break\n case (n === 3):\n result = 6\n break\n case (n === 24):\n result = 24\n break\n case (n === 5):\n result = 120\n break\n default:\n for (let i = 1; i <= n; i++) {\n result *= i\n }\n break\n }\n return result\n}\n\n/**\n * 获取二项分布\n * @param n\n * @param index\n * @returns {number}\n */\nexport const getBinomialFactor = (n, index) => {\n return (getFactorial(n) / (getFactorial(index) * getFactorial(n - index)))\n}\n\n/**\n * 插值线性点\n * @param points\n * @returns {*}\n */\nexport const getQBSplinePoints = points => {\n if (points.length <= 2) {\n return points\n } else {\n let [n, bSplinePoints] = [2, []]\n let m = points.length - n - 1\n bSplinePoints.push(points[0])\n for (let i = 0; i <= m; i++) {\n for (let t = 0; t <= 1; t += 0.05) {\n let [x, y] = [0, 0]\n for (let k = 0; k <= n; k++) {\n let factor = getQuadricBSplineFactor(k, t)\n x += factor * points[i + k][0]\n y += factor * points[i + k][1]\n }\n bSplinePoints.push([x, y])\n }\n }\n bSplinePoints.push(points[points.length - 1])\n return bSplinePoints\n }\n}\n\n/**\n * 得到二次线性因子\n * @param k\n * @param t\n * @returns {number}\n */\nexport const getQuadricBSplineFactor = (k, t) => {\n let res = 0\n if (k === 0) {\n res = Math.pow(t - 1, 2) / 2\n } else if (k === 1) {\n res = (-2 * Math.pow(t, 2) + 2 * t + 1) / 2\n } else if (k === 2) {\n res = Math.pow(t, 2) / 2\n }\n return res\n}\n","import * as maptalks from 'maptalks'\nimport {\n getArcPoints,\n MathDistance,\n getAzimuth,\n isClockWise,\n getCircleCenterOfThreePoints\n} from '../helper/index'\nconst Coordinate = maptalks.Coordinate\nconst options = {\n 'arrowStyle': null,\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\n 'clipToPaint': true\n}\n\nclass Arc extends maptalks.LineString {\n constructor (coordinates, options = {}) {\n super(options)\n this.type = 'Arc'\n this._coordinates = []\n if (coordinates) {\n this.setPoints(coordinates)\n }\n }\n\n _generate () {\n let count = this._coordinates.length\n if (count < 2) return\n if (count === 2) {\n this.setCoordinates(this._coordinates)\n } else {\n let [\n pnt1, pnt2,\n pnt3, startAngle,\n endAngle\n ] = [\n this._coordinates[0], this._coordinates[1],\n this._coordinates[2], null, null\n ]\n let center = getCircleCenterOfThreePoints([pnt1['x'], pnt1['y']], [pnt2['x'], pnt2['y']], [pnt3['x'], pnt3['y']])\n let radius = MathDistance([pnt1['x'], pnt1['y']], center)\n let angle1 = getAzimuth([pnt1['x'], pnt1['y']], center)\n let angle2 = getAzimuth([pnt2['x'], pnt2['y']], center)\n if (isClockWise([pnt1['x'], pnt1['y']], [pnt2['x'], pnt2['y']], [pnt3['x'], pnt3['y']])) {\n startAngle = angle2\n endAngle = angle1\n } else {\n startAngle = angle1\n endAngle = angle2\n }\n let points = getArcPoints(center, radius, startAngle, endAngle)\n if (Array.isArray(points)) {\n let _points = points.map(_item => {\n if (Array.isArray(_item)) {\n if (!isNaN(_item[0]) && !isNaN(_item[1])) {\n return new Coordinate(_item[0], _item[1])\n }\n } else {\n return _item\n }\n })\n this.setCoordinates(_points)\n }\n }\n }\n\n setPoints (coordinates) {\n this._coordinates = !coordinates ? [] : coordinates\n if (this._coordinates.length >= 1) {\n this._generate()\n }\n }\n\n _exportGeoJSONGeometry () {\n const points = this.getCoordinates()\n const coordinates = Coordinate.toNumberArrays(points)\n return {\n 'type': 'LineString',\n 'coordinates': coordinates\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options)\n }\n }\n}\n\nArc.mergeOptions(options)\n\nArc.registerJSONType('Arc')\n\nexport default Arc\n","/**\n * Created by FDD on 2017/12/10.\n * @desc 标绘曲线算法\n */\n\nimport * as maptalks from 'maptalks'\nimport { getCurvePoints } from '../helper/index'\nconst Coordinate = maptalks.Coordinate\nconst options = {\n 'arrowStyle': null,\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\n 'clipToPaint': true\n}\nclass Curve extends maptalks.LineString {\n constructor (coordinates, options = {}) {\n super(options)\n this.type = 'Curve'\n this._coordinates = []\n if (coordinates) {\n this.setPoints(coordinates)\n }\n }\n\n _generate () {\n let count = this._coordinates.length\n if (count < 2) {\n return false\n } else if (count === 2) {\n this.setCoordinates(this._coordinates)\n } else {\n let _coordinates = this._coordinates.map(_item => {\n if (_item && _item.hasOwnProperty('x')) {\n return [_item['x'], _item['y']]\n } else if (Array.isArray(_item)) {\n return _item\n }\n })\n let points = getCurvePoints(0.3, _coordinates)\n if (Array.isArray(points)) {\n let _points = points.map(_item => {\n if (Array.isArray(_item)) {\n return new Coordinate(_item[0], _item[1])\n } else {\n return _item\n }\n })\n this.setCoordinates(_points)\n }\n }\n }\n\n setPoints (coordinates) {\n this._coordinates = !coordinates ? [] : coordinates\n if (this._coordinates.length >= 1) {\n this._generate()\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options),\n 'subType': 'Curve'\n }\n }\n\n static fromJSON (json) {\n const feature = json['feature']\n const arc = new Curve(feature['geometry']['coordinates'], json['options'])\n arc.setProperties(feature['properties'])\n return arc\n }\n}\nCurve.registerJSONType('Curve')\nCurve.mergeOptions(options)\n\nexport default Curve\n","import * as maptalks from 'maptalks'\nconst Coordinate = maptalks.Coordinate\nconst options = {\n 'arrowStyle': null,\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\n 'clipToPaint': true\n}\n\nclass Polyline extends maptalks.LineString {\n constructor (coordinates, options = {}) {\n super(options)\n this.type = 'Polyline'\n if (coordinates) {\n this.setCoordinates(coordinates)\n }\n }\n\n setPoints (coordinates) {\n if (coordinates) {\n this.setCoordinates(coordinates)\n }\n }\n\n _exportGeoJSONGeometry () {\n const points = this.getCoordinates()\n const coordinates = Coordinate.toNumberArrays(points)\n return {\n 'type': 'LineString',\n 'coordinates': coordinates\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options)\n }\n }\n}\n\nPolyline.mergeOptions(options)\n\nPolyline.registerJSONType('Polyline')\n\nexport default Polyline\n","/**\n * Created by FDD on 2017/12/12.\n * @desc 自由线\n * @Inherits maptalks.LineString\n */\nimport * as maptalks from 'maptalks'\nconst Coordinate = maptalks.Coordinate\nconst options = {\n 'arrowStyle': null,\n 'arrowPlacement': 'vertex-last', // vertex-first, vertex-last, vertex-firstlast, point\n 'clipToPaint': true\n}\n\nclass FreeLine extends maptalks.LineString {\n constructor (coordinates, options = {}) {\n super(options)\n this.type = 'FreeLine'\n if (coordinates) {\n this.setCoordinates(coordinates)\n }\n }\n\n setPoints (coordinates) {\n if (coordinates) {\n this.setCoordinates(coordinates)\n }\n }\n\n _exportGeoJSONGeometry () {\n const points = this.getCoordinates()\n const coordinates = Coordinate.toNumberArrays(points)\n return {\n 'type': 'LineString',\n 'coordinates': coordinates\n }\n }\n\n _toJSON (options) {\n return {\n 'feature': this.toGeoJSON(options)\n }\n }\n}\n\nFreeLine.mergeOptions(options)\n\nFreeLine.registerJSONType('FreeLine')\n\nexport default FreeLine\n","/**\n * Created by FDD on 2017/5/20.\n * @desc 标绘图形构造类\n */\n\nimport Arc from './Polyline/Arc'\nimport Curve from './Polyline/Curve'\nimport Polyline from './Polyline/Polyline'\nimport FreeLine from './Polyline/FreeLine'\nimport * as PlotTypes from '../core/PlotTypes'\nconst RegisterModes = {}\nRegisterModes[PlotTypes.ARC] = {\n 'freehand': false,\n 'limitClickCount': 3,\n 'action': ['click', 'mousemove'],\n 'create': function (path) {\n return new Arc(path)\n },\n 'update': function (path, geometry) {\n geometry.setPoints(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\nRegisterModes[PlotTypes.CURVE] = {\n 'freehand': false,\n 'action': ['click', 'mousemove', 'dblclick'],\n 'create': function (path) {\n return new Curve(path)\n },\n 'update': function (path, geometry) {\n geometry.setPoints(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\nRegisterModes[PlotTypes.POLYLINE] = {\n 'freehand': false,\n 'action': ['click', 'mousemove', 'dblclick'],\n 'create': function (path) {\n return new Polyline(path)\n },\n 'update': function (path, geometry) {\n geometry.setPoints(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\nRegisterModes[PlotTypes.FREE_LINE] = {\n 'freehand': true,\n 'action': ['mousedown', 'drag', 'mouseup'],\n 'create': function (path) {\n return new FreeLine(path)\n },\n 'update': function (path, geometry) {\n geometry.setPoints(path)\n },\n 'generate': function (geometry) {\n return geometry\n }\n}\n\nexport default RegisterModes\n","/**\n * 判断是否为对象\n * @param value\n * @returns {boolean}\n */\nexport const isObject = value => {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nexport const merge = (a, b) => {\n for (const key in b) {\n if (isObject(b[key]) && isObject(a[key])) {\n merge(a[key], b[key])\n } else {\n a[key] = b[key]\n }\n }\n return a\n}\n","/**\n * Created by FDD on 2017/12/10.\n * @desc PlotDraw\n */\n\nimport * as maptalks from 'maptalks'\nimport {BASE_LAYERNAME} from '../Constants'\nimport RegisterModes from '../geometry'\nimport { merge } from '../utils/utils'\nconst _options = {\n 'symbol': {\n 'lineColor': '#000',\n 'lineWidth': 2,\n 'lineOpacity': 1,\n 'polygonFill': '#fff',\n 'polygonOpacity': 0.3\n },\n 'doubleClickZoom': false,\n 'mode': null,\n 'once': false,\n 'ignoreMouseleave': true\n}\nconst registeredMode = {}\nconst stopPropagation = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.cancelBubble = true\n }\n return this\n}\nclass PlotDraw extends maptalks.MapTool {\n constructor (options = {}) {\n const $options = merge(_options, options)\n super($options)\n this.options = $options\n if (this.options['mode']) this._getRegisterMode()\n\n /**\n * 创建图层名称\n * @type {string}\n */\n this.layerName = ((this.options && this.options['layerName']) ? this.options['layerName'] : BASE_LAYERNAME)\n\n /**\n * 创建标绘要素图层\n * @type {*}\n */\n this.drawLayer = null\n\n /**\n * events\n * @type {{click: PlotDraw._firstClickHandler, mousemove: PlotDraw._mouseMoveHandler, dblclick: PlotDraw._doubleClickHandler}}\n */\n this.events = {\n 'click': this._firstClickHandler,\n 'mousemove': this._mouseMoveHandler,\n 'dblclick': this._doubleClickHandler,\n 'mousedown': this._mouseDownHandler,\n 'mouseup': this._mouseUpHandler,\n 'drag': this._mouseMoveHandler\n }\n }\n\n /**\n * 获取注册过的标绘类型\n * @returns {Object}\n * @private\n */\n _getRegisterMode () {\n const mode = this.getMode()\n const registerMode = PlotDraw.getRegisterMode(mode)\n if (!registerMode) {\n throw new Error(mode + ' is not a valid type of PlotDraw.')\n }\n return registerMode\n }\n\n /**\n * 激活对应工具\n * @param mode\n * @returns {PlotDraw}\n */\n setMode (mode) {\n this._clearStage()\n this._switchEvents('off') // _prototype\n this.options['mode'] = mode\n this._getRegisterMode() // cheack type\n if (this.isEnabled()) {\n this._switchEvents('on')\n this._deactiveMapInteractions()\n }\n return this\n }\n\n /**\n * 获取当前激活的标绘工具\n * @return {String} mode\n */\n getMode () {\n if (this.options['mode']) {\n return this.options['mode'].toLowerCase()\n }\n return null\n }\n\n /**\n * 取消激活地图交互并保存\n */\n _deactiveMapInteractions () {\n const map = this.getMap()\n this._mapDoubleClickZoom = map.options['doubleClickZoom']\n map.config({\n 'doubleClickZoom': this.options['doubleClickZoom']\n })\n const action = this._getRegisterMode()['action']\n if (action.indexOf('drag') > -1) {\n const map = this.getMap()\n this._mapDraggable = map.options['draggable']\n map.config({\n 'draggable': false\n })\n }\n }\n\n /**\n * 激活地图原有交互\n * @private\n */\n _activateMapInteractions () {\n const map = this.getMap()\n map.config({\n 'doubleClickZoom': this._mapDoubleClickZoom\n })\n if (this._mapDraggable) {\n map.config('draggable', this._mapDraggable)\n }\n delete this._mapDraggable\n delete this._mapDoubleClickZoom\n }\n\n /**\n * 注册地图事件\n * @returns {*}\n */\n getEvents () {\n const action = this._getRegisterMode()['action']\n const _events = {}\n if (Array.isArray(action)) {\n for (let i = 0; i < action.length; i++) {\n if (action[i] === 'drag') {\n _events['mousemove'] = this.events[action[i]]\n } else {\n _events[action[i]] = this.events[action[i]]\n }\n }\n return _events\n }\n return null\n }\n\n /**\n * 鼠标按下事件\n * @param event\n * @private\n */\n _mouseDownHandler (event) {\n this._createGeometry(event)\n }\n\n /**\n * 鼠标抬起事件\n * @param event\n * @returns {PlotDraw}\n * @private\n */\n _mouseUpHandler (event) {\n this.endDraw(event)\n }\n\n /**\n * 鼠标第一次点击事件处理\n * @param event\n * @private\n */\n _firstClickHandler (event) {\n this._createGeometry(event)\n const registerMode = this._getRegisterMode()\n const coordinate = event['coordinate']\n if (this._geometry) {\n if (!(this._historyPointer === null)) {\n this._clickCoords = this._clickCoords.slice(0, this._historyPointer)\n }\n this._clickCoords.push(coordinate)\n this._historyPointer = this._clickCoords.length\n if (registerMode['limitClickCount'] && registerMode['limitClickCount'] === this._historyPointer) {\n registerMode['update'](this._clickCoords, this._geometry, event)\n this.endDraw(event)\n } else {\n registerMode['update'](this._clickCoords, this._geometry, event)\n }\n this._fireEvent('drawvertex', event)\n }\n }\n\n /**\n * 第一次事件创建相关geometry\n * @param event\n * @private\n */\n _createGeometry (event) {\n const registerMode = this._getRegisterMode()\n const coordinate = event['coordinate']\n const symbol = this.getSymbol()\n if (!this._geometry) {\n this._clickCoords = [coordinate]\n this._geometry = registerMode['create'](this._clickCoords, event)\n if (symbol) {\n this._geometry.setSymbol(symbol)\n }\n this._addGeometryToStage(this._geometry)\n this._fireEvent('drawstart', event)\n }\n }\n\n /**\n * 鼠标移动事件处理\n * FIXME 当为freehand模式时,鼠标按下松开而不移动会造成\n * 构造的geometry不完整\n * @param event\n * @private\n */\n _mouseMoveHandler (event) {\n const map = this.getMap()\n if (!this._geometry || !map || map.isInteracting()) {\n return\n }\n const containerPoint = this._getMouseContainerPoint(event)\n if (!this._isValidContainerPoint(containerPoint)) {\n return\n }\n const coordinate = event['coordinate']\n const registerMode = this._getRegisterMode()\n const path = this._clickCoords.slice(0, this._historyPointer)\n if (path && path.length > 0 && coordinate.equals(path[path.length - 1])) {\n return\n }\n if (!registerMode.freehand) {\n registerMode['update'](path.concat([coordinate]), this._geometry, event)\n } else {\n if (!(this._historyPointer === null)) {\n this._clickCoords = this._clickCoords.slice(0, this._historyPointer)\n }\n this._clickCoords.push(coordinate)\n this._historyPointer = this._clickCoords.length\n registerMode['update'](this._clickCoords, this._geometry, event)\n }\n this._fireEvent('mousemove', event)\n }\n\n /**\n * 双击事件处理\n * @param event\n * @private\n */\n _doubleClickHandler (event) {\n this.endDraw(event)\n }\n\n /**\n * get point\n * @param event\n * @returns {*}\n * @private\n */\n _getMouseContainerPoint (event) {\n const action = this._getRegisterMode()['action']\n if (action.indexOf('drag') > -1) {\n stopPropagation(event['domEvent'])\n }\n return event['containerPoint']\n }\n\n /**\n * is valid point\n * @param containerPoint\n * @returns {boolean}\n * @private\n */\n _isValidContainerPoint (containerPoint) {\n const mapSize = this._map.getSize()\n const w = mapSize['width']\n const h = mapSize['height']\n if (containerPoint.x < 0 || containerPoint.y < 0) {\n return false\n } else if (containerPoint.x > w || containerPoint.y > h) {\n return false\n }\n return true\n }\n\n /**\n * 清空缓存\n * @private\n */\n _clearStage () {\n this._getDrawLayer(this.layerName).clear()\n if (this._geometry) {\n this._geometry.remove()\n delete this._geometry\n }\n delete this._clickCoords\n }\n\n /**\n * 添加geometry到图层\n * @param geometry\n * @private\n */\n _addGeometryToStage (geometry) {\n this._getDrawLayer(this.layerName).addGeometry(geometry)\n }\n\n /**\n * Set draw tool's symbol\n * @param {Object} symbol - symbol set\n * @returns {DrawTool} this\n */\n setSymbol (symbol) {\n if (!symbol) {\n return this\n }\n this.options['symbol'] = symbol\n if (this._geometry) {\n this._geometry.setSymbol(symbol)\n }\n return this\n }\n\n /**\n * Get symbol of the draw tool\n * @return {Object} symbol\n */\n getSymbol () {\n const symbol = this.options['symbol']\n if (symbol) {\n return maptalks.Util.extendSymbol(symbol)\n } else {\n return maptalks.Util.extendSymbol(this.options['symbol'])\n }\n }\n\n /**\n * 创建矢量图层\n * @param layerName\n * @returns {*}\n * @private\n */\n _getDrawLayer (layerName) {\n let drawToolLayer = this._map.getLayer(layerName)\n if (!drawToolLayer) {\n drawToolLayer = new maptalks.VectorLayer(layerName, {\n 'enableSimplify': false\n })\n this._map.addLayer(drawToolLayer)\n }\n return drawToolLayer\n }\n\n /**\n * fire event\n * @param eventName\n * @param param\n * @private\n */\n _fireEvent (eventName, param = {}) {\n if (this._geometry) {\n param['geometry'] = this._getRegisterMode()['generate'](this._geometry).copy()\n }\n maptalks.MapTool.prototype._fireEvent.call(this, eventName, param)\n }\n\n /**\n * when layer add, check register mode\n */\n onAdd () {\n this._getRegisterMode()\n }\n\n /**\n * handle enAble event\n * @returns {PlotDraw}\n */\n onEnable () {\n this._deactiveMapInteractions()\n this.drawLayer = this._getDrawLayer(this.layerName)\n this._clearStage()\n this._loadResources()\n return this\n }\n\n /**\n * handle disable event\n * @returns {PlotDraw}\n */\n onDisable () {\n const map = this.getMap()\n this._activateMapInteractions()\n this.endDraw()\n if (this._map) {\n map.removeLayer(this._getDrawLayer(this.layerName))\n }\n return this\n }\n\n /**\n * 结束当前绘制\n * @param param\n * @returns {PlotDraw}\n */\n endDraw (param = {}) {\n if (!this._geometry || this._ending) {\n return this\n }\n this._ending = true\n const geometry = this._geometry\n this._clearStage()\n this._geometry = geometry\n this._fireEvent('drawend', param)\n delete this._geometry\n if (this.options['once']) {\n this.disable()\n }\n delete this._ending\n return this\n }\n\n /**\n * 加载资源\n * @private\n */\n _loadResources () {\n const symbol = this.getSymbol()\n const resources = maptalks.Util.getExternalResources(symbol)\n if (resources.length > 0) {\n this.drawLayer._getRenderer().loadResources(resources)\n }\n }\n\n /**\n * Register a new mode for DrawTool\n * @param name\n * @param modeAction\n */\n static registerMode (name, modeAction) {\n registeredMode[name.toLowerCase()] = modeAction\n }\n\n /**\n * Get mode actions by mode name\n * @param {String} name DrawTool mode name\n * @return {Object} mode actions\n */\n static getRegisterMode (name) {\n return registeredMode[name.toLowerCase()]\n }\n\n /**\n * Register modes for DrawTool\n * @param modes\n */\n static registeredModes (modes) {\n if (modes) {\n for (let key of Reflect.ownKeys(modes)) {\n if (!key.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {\n let desc = Object.getOwnPropertyDescriptor(modes, key)\n let _key = key.toLowerCase()\n Object.defineProperty(registeredMode, _key, desc)\n }\n }\n }\n }\n}\n\nPlotDraw.registeredModes(RegisterModes)\n\nexport default PlotDraw\n"],"names":["TextArea","ARC","CURVE","GATHERING_PLACE","POLYLINE","FREE_LINE","POINT","PENNANT","RECTANGLE","CIRCLE","ELLIPSE","LUNE","SECTOR","CLOSED_CURVE","POLYGON","FREE_POLYGON","ATTACK_ARROW","DOUBLE_ARROW","STRAIGHT_ARROW","FINE_ARROW","ASSAULT_DIRECTION","TAILED_ATTACK_ARROW","SQUAD_COMBAT","TAILED_SQUAD_COMBAT","RECTFLAG","TRIANGLEFLAG","CURVEFLAG","FITTING_COUNT","ZERO_TOLERANCE","BASE_LAYERNAME","MathDistance","pnt1","pnt2","Math","sqrt","pow","Mid","point1","point2","getCircleCenterOfThreePoints","point3","pntA","pntB","pntC","pntD","getIntersectPoint","f","x","y","e","getAzimuth","startPoint","endPoint","azimuth","angle","asin","abs","PI","isClockWise","pnt3","getCubicValue","t","startPnt","cPnt1","cPnt2","endPnt","max","min","tp","t2","t3","tp2","tp3","getArcPoints","center","radius","startAngle","endAngle","pnts","angleDiff","i","cos","sin","push","getBisectorNormals","normal","getNormal","bisectorNormalRight","bisectorNormalLeft","dt","dist","uX","uY","d1","d2","Constants","dX1","dY1","dX2","dY2","getLeftMostControlPoint","controlPoints","controlX","controlY","normalRight","mid","pX","pY","n","nX","nY","a11","a12","a22","dX","dY","getRightMostControlPoint","count","length","normalLeft","getCurvePoints","leftControl","normals","points","normalPoints","concat","rightControl","pnt","Coordinate","maptalks","options","Arc","coordinates","type","_coordinates","setPoints","_generate","setCoordinates","angle1","angle2","Array","isArray","_points","map","_item","isNaN","_exportGeoJSONGeometry","getCoordinates","toNumberArrays","_toJSON","toGeoJSON","mergeOptions","registerJSONType","Curve","hasOwnProperty","fromJSON","json","feature","arc","setProperties","Polyline","FreeLine","RegisterModes","PlotTypes","path","geometry","isObject","value","merge","a","b","key","_options","registeredMode","stopPropagation","cancelBubble","PlotDraw","$options","_getRegisterMode","layerName","drawLayer","events","_firstClickHandler","_mouseMoveHandler","_doubleClickHandler","_mouseDownHandler","_mouseUpHandler","mode","getMode","registerMode","getRegisterMode","Error","setMode","_clearStage","_switchEvents","isEnabled","_deactiveMapInteractions","toLowerCase","getMap","_mapDoubleClickZoom","config","action","indexOf","_mapDraggable","_activateMapInteractions","getEvents","_events","event","_createGeometry","endDraw","coordinate","_geometry","_historyPointer","_clickCoords","slice","_fireEvent","symbol","getSymbol","setSymbol","_addGeometryToStage","isInteracting","containerPoint","_getMouseContainerPoint","_isValidContainerPoint","equals","freehand","mapSize","_map","getSize","w","h","_getDrawLayer","clear","remove","addGeometry","extendSymbol","drawToolLayer","getLayer","addLayer","eventName","param","copy","prototype","call","onAdd","onEnable","_loadResources","onDisable","removeLayer","_ending","disable","resources","getExternalResources","_getRenderer","loadResources","name","modeAction","registeredModes","modes","Reflect","ownKeys","match","desc","Object","getOwnPropertyDescriptor","_key","defineProperty"],"mappings":"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"} \ No newline at end of file diff --git a/examples/draw-tool.html b/examples/draw-tool.html deleted file mode 100644 index d00bbf8..0000000 --- a/examples/draw-tool.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - -