Files
sdk4.0/src/Obj/Base/BaseSource/BaseLayer/index.js

312 lines
9.8 KiB
JavaScript
Raw Normal View History

2025-07-03 13:54:01 +08:00
/**
* @name: index
* @author: Administrator
* @date: 2023-11-20 18:06
* @descriptionindex
* @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
2025-07-03 13:54:01 +08:00
}
get layer_index() {
return this.entity ? this.entity._layerIndex : undefined
2025-07-03 13:54:01 +08:00
}
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