/* *cesium组件封装 *20190307 */ export default{ install(Vue){ /* *导航属性 */ Vue.prototype.CesiumAPI = { /* *导航接口 */ NavigateObj: { /* *飞到当前位置 *参数x:经度 *参数y:纬度 *参数h:高度 */ flyToXYZ: (Cesium, Viewerc, x, y, z) => { Viewerc.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(x, y, z) }); }, /* *放大 视角拉近 */ zoomIn: (Viewerc) => { Viewerc.camera.zoomIn((1000000)) }, /* *缩小 视角拉远 */ zoomOut: (Viewerc) => { Viewerc.camera.zoomOut((1000000)) }, /* *跳转 * 参数:Viewerc,Cesium,obj */ JumpTo: (Viewerc, Cesium, obj) => { if (obj.position != null && obj.position != undefined) { Viewerc.camera.setView({ destination: obj.position, orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-45.0), roll: 0.0 } }); } } }, /* *创建接口 */ CreateObj: { /* *创建点 *参数point:必选项 点的属性 { position: cartesian, point: { color: Cesium.Color.RED, pixelSize: 5, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND } }; */ createPoint: (tag, Viewerc, point, callback) => { var temp = _isContain(createobjlist, tag); if (temp.index > -1) { Viewerc.entities.remove(temp.item); createobjlist.splice(temp.index, 1); } else { var en = Viewerc.entities.add(point); createobjlist.push({tag: tag, item: en}); if (typeof callback == 'function') { callback({tag: tag, item: en, point: point}); } } }, /* *功能:创建线 左键开始 右键结束 创建 *参数 */ createLine: (tag, Viewerc, Cesium, handler, callback) => { var createLine; var temp = _isContain(createobjlist, tag); if (temp.index > -1) { Viewerc.entities.remove(temp.item); createobjlist.splice(temp.index, 1); } else { var PolyLinePrimitive = (function () { function _(positions) { this.options = { polyline: { show: true, positions: [], material: Cesium.Color.RED, width: 3 } }; this.positions = positions; this._init(); } _.prototype._init = function () { var _self = this; var _update = function () { return _self.positions; }; //实时更新polyline.positions this.options.polyline.positions = new Cesium.CallbackProperty(_update, false); createLine = Viewerc.entities.add(this.options); }; return _; })(); var positions = []; var poly = undefined; //鼠标左键单击画点 handler.setInputAction(function (movement) { var cartesian = Viewerc.scene.camera.pickEllipsoid(movement.position, Viewerc.scene.globe.ellipsoid); if (positions.length == 0) { positions.push(cartesian.clone()); } positions.push(cartesian); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //鼠标移动 handler.setInputAction(function (movement) { var cartesian = Viewerc.scene.camera.pickEllipsoid(movement.endPosition, Viewerc.scene.globe.ellipsoid); if (positions.length >= 2) { if (!Cesium.defined(poly)) { poly = new PolyLinePrimitive(positions); } else { if (cartesian != undefined) { positions.pop(); cartesian.y += (1 + Math.random()); positions.push(cartesian); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //单击鼠标右键结束画线 handler.setInputAction(function (movement) { handler.destroy(); new PolyLinePrimitive(positions); if (typeof callback == 'function') { callback({tag: tag, item: createLine}); } createobjlist.push({tag: tag, item: createLine}); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); } }, /* *功能:画面 左键开始 右键结束 */ createPolygon: (tag, Viewerc, Cesium, handler, callback) => { var temp = _isContain(createobjlist, tag); if (temp.index > -1) { Viewerc.entities.remove(temp.item); createobjlist.splice(temp.index, 1); } else { var Polygon; var PolygonPrimitive = (function () { function _(positions) { this.options = { name: '多边形', polygon: { hierarchy: [], perPositionHeight: true, material: Cesium.Color.RED.withAlpha(0.4) } }; this.hierarchy = positions; this._init(); } _.prototype._init = function () { var _self = this; var _update = function () { return _self.hierarchy; }; //实时更新polygon.hierarchy this.options.polygon.hierarchy = new Cesium.CallbackProperty(_update, false); Polygon = Viewerc.entities.add(this.options); }; return _; })(); var positions = []; var poly = undefined; //鼠标单击画点 handler.setInputAction(function (movement) { var cartesian = Viewerc.scene.camera.pickEllipsoid(movement.position, Viewerc.scene.globe.ellipsoid); if (positions.length == 0) { positions.push(cartesian.clone()); } positions.push(cartesian); }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //鼠标移动 handler.setInputAction(function (movement) { var cartesian = Viewerc.scene.camera.pickEllipsoid(movement.endPosition, Viewerc.scene.globe.ellipsoid); if (positions.length >= 2) { if (!Cesium.defined(poly)) { poly = new PolygonPrimitive(positions); } else { if (cartesian != undefined) { positions.pop(); cartesian.y += (1 + Math.random()); positions.push(cartesian); } } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //鼠标右键单击结束绘制 handler.setInputAction(function (movement) { handler.destroy(); new PolygonPrimitive(positions); if (typeof callback == 'function') { callback({tag: tag, item: Polygon}); } createobjlist.push({tag: tag, item: Polygon}); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); } }, /*画矩形 左键开始 右键结束*/ drawRect: (tag, _this,Viewerc, Cesium, handle, callback) => { var temp = _isContain(createobjlist, tag); if (temp.index > -1) { Viewerc.entities.remove(temp.item); createobjlist.splice(temp.index, 1); } else { var _self = _this; var pointsArr = []; _self.shape = { points: [], rect: null, entity: null }; var tempPosition; /*var handle = new Cesium.ScreenSpaceEventHandler(_self.viewer.scene.canvas);*/ //鼠标左键单击画点 handle.setInputAction(function (click) { tempPosition = _self.getPointFromWindowPoint(click.position); //选择的点在球面上 if (tempPosition) { if (_self.shape.points.length == 0) { pointsArr.push(tempPosition); _self.shape.points.push(_self.viewer.scene.globe.ellipsoid.cartesianToCartographic(tempPosition)); _self.shape.rect = Cesium.Rectangle.fromCartographicArray(_self.shape.points); _self.shape.rect.east += 0.000001; _self.shape.rect.north += 0.000001; _self.shape.entity = _self.viewer.entities.add({ rectangle: { coordinates: _self.shape.rect, material: Cesium.Color.BLACK.withAlpha(0.4), outline: true, outlineWidth: 2, outlineColor: Cesium.Color.RED, height: 0 } }); _self.bufferEntity = _self.shape.entity; } else { handle.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); handle.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); callback(pointsArr); } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //鼠标移动 handle.setInputAction(function (movement) { if (_self.shape.points.length == 0) { return; } var moveEndPosition = _self.getPointFromWindowPoint(movement.endPosition); //选择的点在球面上 if (moveEndPosition) { pointsArr[1] = moveEndPosition; _self.shape.points[1] = _self.viewer.scene.globe.ellipsoid.cartesianToCartographic(moveEndPosition); _self.shape.rect = Cesium.Rectangle.fromCartographicArray(_self.shape.points); if (_self.shape.rect.west == _self.shape.rect.east) _self.shape.rect.east += 0.000001; if (_self.shape.rect.south == _self.shape.rect.north) _self.shape.rect.north += 0.000001; _self.shape.entity.rectangle.coordinates = _self.shape.rect; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } } } } } } /* *判断当前数组是否存在该对象 */ window._isContain = function(layerlist, tag) { for (var i = 0; i < layerlist.length; i++) { var temp = layerlist[i]; if (temp.tag == tag) { temp.index = i; return temp; } } return { item: null, index: -1 }; } window.createobjlist = [];