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

312 lines
9.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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
}
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