/** * @name: index * @author: Administrator * @date: 2023-11-20 18:06 * @description:index * @update: 2023-11-20 18:06 */ import Dialog from '../../../Element/Dialog'; import CoordTransform from "../../../../transform/CoordTransform"; import BaseSource from "../index"; import { syncData, get2DView } from '../../../../Global/MultiViewportMode' import { setSplitDirection, syncSplitData } from '../../../../Global/SplitScreen' import { setActiveViewer, closeRotateAround, closeViewFollow } from '../../../../Global/global' class BaseLayer extends BaseSource { constructor(sdk, options, _Dialog = {}) { super(sdk, options); this.options.name = options.name || '未命名对象' this.Dialog = _Dialog this._elms = {}; } setDefaultValue() { super.setDefaultValue(); this.options.alpha = this.options.alpha ?? 1 this.options.brightness = this.options.brightness ?? 1 } get layerIndex() { return this.entity ? this.entity._layerIndex : undefined } get layer_index() { return this.entity ? this.entity._layerIndex : undefined } get brightness() { return this.options.brightness } set brightness(v) { this.options.brightness = v this.entity.brightness = v } get alpha() { return this.options.alpha } set alpha(v) { if (Number(v) > 1) v = 1 if (Number(v) < 0) v = 0 this.entity.alpha = v this.options.alpha = v this._elms.alpha && this._elms.alpha.forEach((item) => { item.value = v }) } /**@description 提高图层的一层层级 * @method layerRaise * @param id {string} 图层id *@memberOf Layer * */ layerRaise(id) { this.sdk.viewer.imageryLayers.raise(this.entity) for (let i = 0; i < this.sdk.viewer.imageryLayers._layers.length; i++) { if (this.sdk.viewer.imageryLayers._layers[i]._imageryProvider && this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && (this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw' || this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww')) { let layer = this.sdk.viewer.imageryLayers._layers[i] this.sdk.viewer.imageryLayers.raiseToTop(layer) } } this.options.layer_index = this.entity._layerIndex return this.entity._layerIndex } /**@description 降低图层的一层层级 * @method layerLower * @memberOf Layer * */ layerLower() { this.sdk.viewer.imageryLayers.lower(this.entity) this.options.layer_index = this.entity._layerIndex return this.entity._layerIndex } /**@description 置顶 * @method layerToTop * @memberOf Layer * */ layerToTop() { this.sdk.viewer.imageryLayers.raiseToTop(this.entity) for (let i = 0; i < this.sdk.viewer.imageryLayers._layers.length; i++) { if (this.sdk.viewer.imageryLayers._layers[i]._imageryProvider && this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && (this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw' || this.sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww')) { let layer = this.sdk.viewer.imageryLayers._layers[i] this.sdk.viewer.imageryLayers.raiseToTop(layer) } } this.options.layer_index = this.entity._layerIndex return this.entity._layerIndex } /**@description 置底 * @method lowerToBottom * @memberOf Layer * */ layerToBottom() { this.sdk.viewer.imageryLayers.lowerToBottom(this.entity) this.options.layer_index = this.entity._layerIndex return this.entity._layerIndex } remove() { super.remove() this.sdk.viewer.scene.imageryLayers.remove(this.entity) this.entity = null } /**@description 定位 * @method flyTo * @memberOf Layer * */ async flyTo(options = {}) { if (this._error) { return } setActiveViewer(0) closeRotateAround(this.sdk) closeViewFollow(this.sdk) if (this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation) { let orientation = { heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0), pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0), roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0) } let lng = this.options.customView.relativePosition.lng let lat = this.options.customView.relativePosition.lat let alt = this.options.customView.relativePosition.alt let destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt) let position = { lng: 0, lat: 0 } if (this.options.position) { position = { ...this.options.position } } else if (this.options.positions) { position = { ...this.options.positions[0] } } else if (this.options.center) { position = { ...this.options.center } } else if (this.options.start) { position = { ...this.options.start } } else { if (this.options.hasOwnProperty('lng')) { position.lng = this.options.lng } if (this.options.hasOwnProperty('lat')) { position.lat = this.options.lat } if (this.options.hasOwnProperty('alt')) { position.alt = this.options.alt } } // 如果没有高度值,则获取紧贴高度计算 if (!position.hasOwnProperty('alt')) { position.alt = await this.getClampToHeight(position) } lng = this.options.customView.relativePosition.lng + position.lng lat = this.options.customView.relativePosition.lat + position.lat alt = this.options.customView.relativePosition.alt + position.alt destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt) this.sdk.viewer.camera.flyTo({ destination: destination, orientation: orientation }) } else { this.sdk.viewer.flyTo(this.entity) } } /*高德的纠偏*/ amapMercatorTilingScheme(options) { class AmapMercatorTilingScheme extends Cesium.WebMercatorTilingScheme { constructor(options) { super(options) let projection = new Cesium.WebMercatorProjection() this._projection.project = function (cartographic, result) { result = CoordTransform.WGS84ToGCJ02( Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude) ) result = projection.project( new Cesium.Cartographic( Cesium.Math.toRadians(result[0]), Cesium.Math.toRadians(result[1]) ) ) return new Cesium.Cartesian2(result.x, result.y) } this._projection.unproject = function (cartesian, result) { let cartographic = projection.unproject(cartesian) result = CoordTransform.GCJ02ToWGS84( Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude) ) return new Cesium.Cartographic( Cesium.Math.toRadians(result[0]), Cesium.Math.toRadians(result[1]) ) } } } return new AmapMercatorTilingScheme(options) } /** * @description 编辑框 * @param state=false {boolean} 状态: true打开, false关闭 */ async edit(state = false) { this.originalOptions = this.deepCopyObj(this.options) if (this._DialogObject && this._DialogObject.close) { this._DialogObject.close() this._DialogObject = null } this._DialogObject = await new Dialog(this.sdk, this.options, { title: '底图属性', left: '180px', top: '100px', confirmCallBack: (options) => { this.name = this.name.trim() if (!this.name) { this.name = '未命名对象' } this.originalOptions = this.deepCopyObj(this.options) this._DialogObject.close() this.Dialog.confirmCallBack && this.Dialog.confirmCallBack(this.originalOptions) // syncData(this.sdk, this.options.id) syncSplitData(this.sdk, this.options.id) let sdk2D = get2DView() if (sdk2D && sdk2D != this.sdk) { for(let i=0;i { this.reset() this.Dialog.closeCallBack && this.Dialog.closeCallBack() }, // resetCallBack: () => { // this.name = this.originalOptions.name // this.alpha = this.originalOptions.alpha // this.Dialog.resetCallBack && this.Dialog.resetCallBack() // }, removeCallBack: () => { this.Dialog.removeCallBack && this.Dialog.removeCallBack() }, }, true) let contentElm = document.createElement('div') contentElm.style.width = '300px' let html = `
名称:
透明度:
` contentElm.innerHTML = html let nameElm = contentElm.getElementsByClassName('name')[0] let alphaElm = contentElm.getElementsByClassName('alpha')[0] nameElm.value = this.name alphaElm.value = this.alpha nameElm.addEventListener('input', () => { this.name = nameElm.value }) alphaElm.addEventListener('input', () => { this.alpha = alphaElm.value }) this._DialogObject.contentAppChild(contentElm) this._elms.name = [nameElm] this._elms.alpha = [alphaElm] } reset() { if (!this.entity && !this._DialogObject) { return } this.options = this.deepCopyObj(this.originalOptions) this.name = this.options.name this.alpha = this.options.alpha this.brightness = this.options.brightness } flicker() { } } export default BaseLayer