312 lines
9.8 KiB
JavaScript
312 lines
9.8 KiB
JavaScript
/**
|
||
* @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 } 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)
|
||
},
|
||
closeCallBack: () => {
|
||
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 = `
|
||
<span class="custom-divider"></span>
|
||
<div class="div-item">
|
||
<div class="row">
|
||
<div class="col">
|
||
<span class="label" style="flex: 0 0 60px;">名称:</span>
|
||
<input class="input name" type="text">
|
||
</div>
|
||
</div>
|
||
<div class="row">
|
||
<div class="col">
|
||
<span class="label" style="flex: 0 0 60px;">透明度:</span>
|
||
<input type="range" class="alpha" min="0" max="1" step="0.01">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`
|
||
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
|