826 lines
27 KiB
JavaScript
826 lines
27 KiB
JavaScript
|
/**
|
|||
|
* @name: global
|
|||
|
* @author: Administrator
|
|||
|
* @date: 2023-12-01 14:15
|
|||
|
* @description:global
|
|||
|
* @update: 2023-12-01 14:15
|
|||
|
*/
|
|||
|
|
|||
|
/*获取当前视角*/
|
|||
|
import MouseEvent from '../Event/index'
|
|||
|
import Tools from "../Tools";
|
|||
|
import { Proj } from "../Tools/proj";
|
|||
|
import { getTheme, setTheme } from "../Obj/Element/theme";
|
|||
|
import { setActiveViewer as setMultiViewportActiveViewer } from './MultiViewportMode'
|
|||
|
import { setActiveViewer as setSplitActiveViewer, getSdk } from './SplitScreen'
|
|||
|
import { updateCluster } from './cluster/cluster'
|
|||
|
|
|||
|
let coordinateSystem = 'EPSG:4326'
|
|||
|
let _cartesian
|
|||
|
let GroundCover = false
|
|||
|
let bimPickObject = {}
|
|||
|
let containerObject = {}
|
|||
|
let rotateAroundObject = {}
|
|||
|
function getCurrentView(sdk) {
|
|||
|
let tools = new Tools()
|
|||
|
let viewer = sdk.viewer
|
|||
|
return JSON.parse(JSON.stringify({
|
|||
|
// heading: viewer.camera.heading,
|
|||
|
// pitch: viewer.camera.pitch,
|
|||
|
// roll: viewer.camera.roll,
|
|||
|
position: tools.cartesian3Towgs84(viewer.camera.position, viewer),
|
|||
|
orientation: {
|
|||
|
heading: Cesium.Math.toDegrees(viewer.camera.heading),
|
|||
|
pitch: Cesium.Math.toDegrees(viewer.camera.pitch),
|
|||
|
roll: Cesium.Math.toDegrees(viewer.camera.roll)
|
|||
|
}
|
|||
|
}))
|
|||
|
}
|
|||
|
|
|||
|
/*设置默认视角*/
|
|||
|
function setDefaultView(sdk, options) {
|
|||
|
let viewer = sdk.viewer
|
|||
|
if (options) {
|
|||
|
viewer.CAMERA_DEFAULT_VIEW_RECTANGLE = {
|
|||
|
destination: options.destination || {},
|
|||
|
orientation: options.orientation || {}
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
viewer.CAMERA_DEFAULT_VIEW_RECTANGLE = undefined
|
|||
|
//设置cesium的默认视角
|
|||
|
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
|
|||
|
//西边的经度
|
|||
|
89.5,
|
|||
|
//南边的纬度
|
|||
|
10.4,
|
|||
|
//东边的经度
|
|||
|
110.4,
|
|||
|
//北边的维度
|
|||
|
61.2
|
|||
|
)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*定位到指定视角*/
|
|||
|
async function flyTo(sdk, options, duration = 3) {
|
|||
|
let tools = new Tools(sdk)
|
|||
|
let destination
|
|||
|
let orientation = options.orientation
|
|||
|
if (options.position) {
|
|||
|
if (options.position.alt !== 0 && !options.position.alt) {
|
|||
|
options.position.alt = await tools.getClampToHeight(options.position)
|
|||
|
}
|
|||
|
let h = 0
|
|||
|
if (!orientation) {
|
|||
|
h = 500
|
|||
|
}
|
|||
|
destination = Cesium.Cartesian3.fromDegrees(options.position.lng, options.position.lat, options.position.alt + h)
|
|||
|
}
|
|||
|
else {
|
|||
|
let bbox = tools.cal_envelope(options.positions)
|
|||
|
destination = new Cesium.Rectangle(
|
|||
|
Cesium.Math.toRadians(bbox[3][0]),
|
|||
|
Cesium.Math.toRadians(bbox[3][1]),
|
|||
|
Cesium.Math.toRadians(bbox[1][0]),
|
|||
|
Cesium.Math.toRadians(bbox[1][1])
|
|||
|
)
|
|||
|
}
|
|||
|
closeRotateAround(sdk)
|
|||
|
sdk.viewer.camera.flyTo({ destination, duration, orientation, complete: options.complete, })
|
|||
|
}
|
|||
|
|
|||
|
/*相机锁定*/
|
|||
|
function CameraController(sdk, status = true) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
let viewer = sdk.viewer
|
|||
|
viewer.scene.screenSpaceCameraController.enableRotate = status;
|
|||
|
viewer.scene.screenSpaceCameraController.enableTranslate = status;
|
|||
|
viewer.scene.screenSpaceCameraController.enableZoom = status;
|
|||
|
viewer.scene.screenSpaceCameraController.enableTilt = status;
|
|||
|
viewer.scene.screenSpaceCameraController.enableLook = status;
|
|||
|
}
|
|||
|
|
|||
|
/*控件显隐*/
|
|||
|
function CesiumContainer(sdk, options) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
containerObject[sdk.viewer._element.className] || (containerObject[sdk.viewer._element.className] = {})
|
|||
|
containerObject[sdk.viewer._element.className].event && containerObject[sdk.viewer._element.className].event.destroy()
|
|||
|
let tools = new Tools()
|
|||
|
let element = sdk.viewer._element
|
|||
|
let proj = sdk.proj
|
|||
|
for (let key in options) {
|
|||
|
switch (key) {
|
|||
|
case 'compass':
|
|||
|
let compass = element.getElementsByClassName('compass')[0]
|
|||
|
let navigation = element.getElementsByClassName('navigation-controls')[0]
|
|||
|
if (options[key]) {
|
|||
|
compass && (compass.style.display = 'block')
|
|||
|
navigation && (navigation.style.display = 'flex')
|
|||
|
}
|
|||
|
else {
|
|||
|
compass && (compass.style.display = 'none')
|
|||
|
navigation && (navigation.style.display = 'none')
|
|||
|
}
|
|||
|
break;
|
|||
|
case 'legend':
|
|||
|
let distanceLegend = element.getElementsByClassName('distance-legend')[0]
|
|||
|
if (options[key]) {
|
|||
|
distanceLegend && (distanceLegend.parentNode.style.display = 'block')
|
|||
|
}
|
|||
|
else {
|
|||
|
distanceLegend && (distanceLegend.parentNode.style.display = 'none')
|
|||
|
}
|
|||
|
break;
|
|||
|
case 'info':
|
|||
|
let infoElm = element.getElementsByClassName('cesium-info')[0]
|
|||
|
if (options[key]) {
|
|||
|
if (infoElm) {
|
|||
|
update()
|
|||
|
infoElm.style.display = 'block'
|
|||
|
}
|
|||
|
else {
|
|||
|
infoElm = document.createElement('div');
|
|||
|
infoElm.className = "cesium-info"
|
|||
|
infoElm.style.position = 'absolute';
|
|||
|
infoElm.style.bottom = '32px';
|
|||
|
infoElm.style.right = '240px';
|
|||
|
infoElm.style['font-size'] = '14px';
|
|||
|
infoElm.style['background-color'] = 'rgba(47,53,60,.8)';
|
|||
|
infoElm.style.color = '#fff';
|
|||
|
infoElm.style.padding = '4px 10px';
|
|||
|
infoElm.style['border-radius'] = '18px';
|
|||
|
|
|||
|
if (coordinateSystem === 'EPSG:4326') {
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>经度:</span><span>-</span>
|
|||
|
<span>纬度:</span><span>-</span>
|
|||
|
<span>海拔高度:</span><span>-</span>
|
|||
|
`
|
|||
|
}
|
|||
|
else {
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>x:</span><span>-</span>
|
|||
|
<span>y:</span><span>-</span>
|
|||
|
<span>z:</span><span>-</span>
|
|||
|
`
|
|||
|
}
|
|||
|
sdk.viewer._element.appendChild(infoElm)
|
|||
|
}
|
|||
|
let event = new MouseEvent(sdk)
|
|||
|
containerObject[sdk.viewer._element.className].event = event
|
|||
|
event.mouse_move((movement, cartesian) => {
|
|||
|
_cartesian = cartesian
|
|||
|
update()
|
|||
|
})
|
|||
|
function update() {
|
|||
|
if (!_cartesian) {
|
|||
|
return
|
|||
|
}
|
|||
|
let position = tools.cartesian3Towgs84(_cartesian, sdk.viewer)
|
|||
|
if (coordinateSystem === 'EPSG:4326') {
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>经度:</span><span>${Number(position.lng.toFixed(6))}° </span>
|
|||
|
<span>纬度:</span><span>${Number(position.lat.toFixed(6))}° </span>
|
|||
|
<span>海拔高度:</span><span>${Number(position.alt.toFixed(2))}米</span>
|
|||
|
`
|
|||
|
}
|
|||
|
else {
|
|||
|
let result = proj.convert([{ x: position.lng, y: position.lat, z: position.alt }], 'EPSG:4326', coordinateSystem)
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>x:</span><span>${Number(result.points[0].x.toFixed(6))}</span>
|
|||
|
<span style="margin-left: 5px;">y:</span><span>${Number(result.points[0].y.toFixed(6))}</span>
|
|||
|
<span style="margin-left: 5px;">z:</span><span>${Number(result.points[0].z.toFixed(6))}</span>
|
|||
|
`
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
infoElm && (infoElm.style.display = 'none')
|
|||
|
}
|
|||
|
break;
|
|||
|
case 'frame':
|
|||
|
if (options[key]) {
|
|||
|
sdk.viewer.scene.debugShowFramesPerSecond = true;
|
|||
|
setTimeout(() => {
|
|||
|
let cesiumWidgetContainerElm = sdk.viewer._element.getElementsByClassName('cesium-viewer-cesiumWidgetContainer')[0]
|
|||
|
let defaultContainer = cesiumWidgetContainerElm.getElementsByClassName('cesium-performanceDisplay-defaultContainer')[0]
|
|||
|
if (defaultContainer) {
|
|||
|
cesiumWidgetContainerElm.appendChild(defaultContainer)
|
|||
|
}
|
|||
|
}, 50);
|
|||
|
}
|
|||
|
else {
|
|||
|
sdk.viewer.scene.debugShowFramesPerSecond = false;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
// let compass = element.getElementsByClassName('compass')[0]
|
|||
|
// let navigation = element.getElementsByClassName('navigation-controls')[0]
|
|||
|
// let distanceLegend = element.getElementsByClassName('distance-legend')[0]
|
|||
|
// if(status) {
|
|||
|
// compass && (compass.style.display = 'block')
|
|||
|
// navigation && (navigation.style.display = 'block')
|
|||
|
// distanceLegend && (distanceLegend.style.display = 'block')
|
|||
|
// }
|
|||
|
// else {
|
|||
|
// compass && (compass.style.display = 'none')
|
|||
|
// navigation && (navigation.style.display = 'none')
|
|||
|
// distanceLegend && (distanceLegend.style.display = 'none')
|
|||
|
// viewer.cesiumNavigation.distanceLegendViewModel.destroy()
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
/*设置广告牌默认图标*/
|
|||
|
function setBillboardDefaultUrl(url, name) {
|
|||
|
if (name) {
|
|||
|
name = 'billboard_default_url_' + name
|
|||
|
}
|
|||
|
else {
|
|||
|
name = 'billboard_default_url'
|
|||
|
}
|
|||
|
localStorage.setItem(name, url);
|
|||
|
}
|
|||
|
/*获取广告牌默认图标*/
|
|||
|
function getBillboardDefaultUrl(name) {
|
|||
|
if (name) {
|
|||
|
name = 'billboard_default_url_' + name
|
|||
|
}
|
|||
|
else {
|
|||
|
name = 'billboard_default_url'
|
|||
|
}
|
|||
|
return localStorage.getItem(name);
|
|||
|
}
|
|||
|
|
|||
|
/*设置高度参考*/
|
|||
|
function setGroundCover(sdk, status) {
|
|||
|
GroundCover = status ? true : false
|
|||
|
updateCluster(sdk.viewer)
|
|||
|
}
|
|||
|
|
|||
|
/*获取高度参考*/
|
|||
|
function getGroundCover() {
|
|||
|
return GroundCover
|
|||
|
}
|
|||
|
|
|||
|
function setBimPickStatus(sdk, status) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
bimPickObject[sdk.viewer._element.className] || (bimPickObject[sdk.viewer._element.className] = {})
|
|||
|
bimPickObject[sdk.viewer._element.className].status = status
|
|||
|
if (bimPickObject[sdk.viewer._element.className].MoveHandler) {
|
|||
|
bimPickObject[sdk.viewer._element.className].MoveHandler.destroy()
|
|||
|
}
|
|||
|
if (!status) {
|
|||
|
return
|
|||
|
}
|
|||
|
bimPickObject[sdk.viewer._element.className].MoveHandler = new Cesium.ScreenSpaceEventHandler(sdk.viewer.canvas)
|
|||
|
bimPickObject[sdk.viewer._element.className].MoveHandler.setInputAction(function (movement) {
|
|||
|
const pick = sdk.viewer.scene.pick(movement.endPosition);
|
|||
|
let selectedId = bimPickObject[sdk.viewer._element.className].selectedId
|
|||
|
let that = sdk.entityMap.get(bimPickObject[sdk.viewer._element.className].id)
|
|||
|
// if (selectedFeatureId) {
|
|||
|
// let color = '#fff'
|
|||
|
// let state = selectedFeature.getProperty('state')
|
|||
|
// switch (state) {
|
|||
|
// case '0':
|
|||
|
// color = '#fff'
|
|||
|
// break;
|
|||
|
// case '1':
|
|||
|
// color = '#f00'
|
|||
|
// break;
|
|||
|
// case '2':
|
|||
|
// color = '#0f0'
|
|||
|
// break;
|
|||
|
// case '3':
|
|||
|
// color = '#00f'
|
|||
|
// break;
|
|||
|
// default:
|
|||
|
// }
|
|||
|
// selectedFeature.color = Cesium.Color.fromCssColorString(color).withAlpha(selectedFeature.tileset.transparency)
|
|||
|
// }
|
|||
|
if (that) {
|
|||
|
if (that.features.has(selectedId)) {
|
|||
|
let features = that.features.get(selectedId).features
|
|||
|
for (let key in features) {
|
|||
|
if (features[key].content._model) {
|
|||
|
let color = features[key].customColor || Cesium.Color.fromCssColorString('#fff')
|
|||
|
features[key].color = Cesium.Color.fromCssColorString(`rgba(${Cesium.Color.floatToByte(color.red)},${Cesium.Color.floatToByte(color.green)},${Cesium.Color.floatToByte(color.blue)},${color.alpha * ((features[key].customAlpha || features[key].customAlpha === 0) ? features[key].customAlpha : 1)})`)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (pick && pick.content) {
|
|||
|
let obj = sdk.getIncetance(pick.content.tileset.id)
|
|||
|
if (obj.type === 'bim') {
|
|||
|
if (pick.primitive && pick.primitive.id) {
|
|||
|
let that = sdk.entityMap.get(pick.primitive.id)
|
|||
|
selectedId = pick.getProperty('id')
|
|||
|
if (that.features.has(selectedId)) {
|
|||
|
let features = that.features.get(selectedId).features
|
|||
|
for (let key in features) {
|
|||
|
if (features[key].content._model) {
|
|||
|
features[key].color = Cesium.Color.fromCssColorString('#ffeb3b')
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
bimPickObject[sdk.viewer._element.className].id = pick.primitive.id
|
|||
|
bimPickObject[sdk.viewer._element.className].selectedId = selectedId
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
pick.primitive.id = null
|
|||
|
}
|
|||
|
}
|
|||
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
|||
|
}
|
|||
|
|
|||
|
function getBimPickStatus(sdk) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
return bimPickObject[sdk.viewer._element.className] ? bimPickObject[sdk.viewer._element.className].status : false
|
|||
|
}
|
|||
|
|
|||
|
/* 围绕坐标旋转 */
|
|||
|
function rotateAround(sdk, position) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
setActiveViewer(0)
|
|||
|
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
|
|||
|
// 关闭Controller
|
|||
|
sdk.entityMap.forEach((item) => {
|
|||
|
item.editObj && item.editObj.destroy()
|
|||
|
item.ControllerObject && item.ControllerObject.destroy()
|
|||
|
})
|
|||
|
rotateAroundObject[sdk.viewer._element.className] || (rotateAroundObject[sdk.viewer._element.className] = {})
|
|||
|
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
|
|||
|
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
|
|||
|
if (!position) {
|
|||
|
CameraController(sdk, true)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
let point = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt)
|
|||
|
let angle = Cesium.Math.toDegrees(sdk.viewer.camera.heading)
|
|||
|
let range = Cesium.Cartesian3.distance(sdk.viewer.camera.position, point);
|
|||
|
CameraController(sdk, false)
|
|||
|
let pitch = sdk.viewer.camera.pitch
|
|||
|
let degrees = Cesium.Math.toDegrees(pitch)
|
|||
|
if (degrees < -89.99) {
|
|||
|
pitch = Cesium.Math.toRadians(-89.99)
|
|||
|
}
|
|||
|
rotateAroundObject[sdk.viewer._element.className].animate = new TWEEN.Tween({ angle: angle }).to({ angle: angle - 360 }, 30000).easing(TWEEN.Easing.Linear.None).repeat(Infinity).onUpdate(async (r, a) => {
|
|||
|
if (!sdk.viewer) {
|
|||
|
TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
|
|||
|
return
|
|||
|
}
|
|||
|
sdk.viewer.camera.lookAt(
|
|||
|
point,
|
|||
|
new Cesium.HeadingPitchRange(Cesium.Math.toRadians(r.angle), pitch, range)
|
|||
|
)
|
|||
|
|
|||
|
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
|
|||
|
}).start()
|
|||
|
|
|||
|
let event = new MouseEvent(sdk)
|
|||
|
rotateAroundObject[sdk.viewer._element.className].event = event
|
|||
|
event.mouse_left_down(() => {
|
|||
|
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
|
|||
|
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
|
|||
|
CameraController(sdk, true)
|
|||
|
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
/* 关闭围绕坐标旋转 */
|
|||
|
function closeRotateAround(sdk) {
|
|||
|
if (!sdk || !sdk.viewer) {
|
|||
|
return
|
|||
|
}
|
|||
|
if (rotateAroundObject[sdk.viewer._element.className]) {
|
|||
|
rotateAroundObject[sdk.viewer._element.className].animate && TWEEN.remove(rotateAroundObject[sdk.viewer._element.className].animate)
|
|||
|
rotateAroundObject[sdk.viewer._element.className].event && rotateAroundObject[sdk.viewer._element.className].event.destroy()
|
|||
|
CameraController(sdk, true)
|
|||
|
sdk.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function closeViewFollow(sdk) {
|
|||
|
if (sdk && sdk.entityMap) {
|
|||
|
let entityMap = sdk.entityMap
|
|||
|
for (let [key, value] of entityMap) {
|
|||
|
if (value.type === 'TrajectoryMotion' && value.viewFollow) {
|
|||
|
value.viewFollow = false
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* 方里网状态开关 */
|
|||
|
function FlwStatusSwitch(sdk, status) {
|
|||
|
if(!sdk) {
|
|||
|
return
|
|||
|
}
|
|||
|
let layer
|
|||
|
let sdkD = getSdk().sdkD
|
|||
|
if(sdkD && sdk !== sdkD) {
|
|||
|
FlwStatusSwitch(sdkD, status)
|
|||
|
}
|
|||
|
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
|
|||
|
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw') {
|
|||
|
layer = sdk.viewer.imageryLayers._layers[i]
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
if (layer) {
|
|||
|
sdk.viewer.imageryLayers.remove(layer)
|
|||
|
}
|
|||
|
if (status) {
|
|||
|
sdk.viewer.imageryLayers.addImageryProvider(new Cesium.TileCoordinatesImageryProviderFlw(
|
|||
|
{
|
|||
|
tileWidth: 128,
|
|||
|
tileHeight: 128,
|
|||
|
}
|
|||
|
));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getFlwStatus(sdk) {
|
|||
|
let status = false
|
|||
|
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
|
|||
|
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'flw') {
|
|||
|
status = true
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
return status
|
|||
|
}
|
|||
|
|
|||
|
/* 经纬网状态开关 */
|
|||
|
function JwwStatusSwitch(sdk, status) {
|
|||
|
if(!sdk) {
|
|||
|
return
|
|||
|
}
|
|||
|
let layer
|
|||
|
let sdkD = getSdk().sdkD
|
|||
|
if(sdkD && sdk !== sdkD) {
|
|||
|
JwwStatusSwitch(sdkD, status)
|
|||
|
}
|
|||
|
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
|
|||
|
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww') {
|
|||
|
layer = sdk.viewer.imageryLayers._layers[i]
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
if (layer) {
|
|||
|
sdk.viewer.imageryLayers.remove(layer)
|
|||
|
}
|
|||
|
if (status) {
|
|||
|
sdk.viewer.imageryLayers.addImageryProvider(new Cesium.TileCoordinatesImageryProviderJww());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getJwwStatus(sdk) {
|
|||
|
let status = false
|
|||
|
for (let i = 0; i < sdk.viewer.imageryLayers._layers.length; i++) {
|
|||
|
if (sdk.viewer.imageryLayers._layers[i]._imageryProvider && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type && sdk.viewer.imageryLayers._layers[i]._imageryProvider._type === 'jww') {
|
|||
|
status = true
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
return status
|
|||
|
}
|
|||
|
|
|||
|
function splitScreen2(sdk, status) {
|
|||
|
let sliderElm = sdk.viewer._element.getElementsByClassName('YJ-custom-slider')[0]
|
|||
|
let leftElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-left')[0]
|
|||
|
let rightElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-right')[0]
|
|||
|
if (sliderElm) {
|
|||
|
sdk.viewer._element.removeChild(sliderElm)
|
|||
|
sdk.viewer._element.removeChild(leftElm)
|
|||
|
sdk.viewer._element.removeChild(rightElm)
|
|||
|
}
|
|||
|
if (status) {
|
|||
|
sliderElm = document.createElement('div');
|
|||
|
sliderElm.className = 'YJ-custom-slider'
|
|||
|
sliderElm.style.position = 'absolute'
|
|||
|
sliderElm.style.left = '50%'
|
|||
|
sliderElm.style.top = '0px'
|
|||
|
|
|||
|
leftElm = document.createElement('input');
|
|||
|
leftElm.className = 'YJ-custom-checkbox-left'
|
|||
|
leftElm.type = 'checkbox'
|
|||
|
leftElm.style.position = 'absolute'
|
|||
|
leftElm.style.left = 'calc(50% - 50px)'
|
|||
|
rightElm = document.createElement('input');
|
|||
|
rightElm.className = 'YJ-custom-checkbox-right'
|
|||
|
rightElm.type = 'checkbox'
|
|||
|
rightElm.style.position = 'absolute'
|
|||
|
rightElm.style.right = 'calc(50% - 50px)'
|
|||
|
sdk.viewer._element.appendChild(leftElm)
|
|||
|
sdk.viewer._element.appendChild(rightElm)
|
|||
|
|
|||
|
leftElm.checked = true
|
|||
|
leftElm.addEventListener('change', (e) => {
|
|||
|
if (!e.target.checked) {
|
|||
|
if (!rightElm.checked) {
|
|||
|
rightElm.checked = true
|
|||
|
}
|
|||
|
}
|
|||
|
changeEntitySplitStatus()
|
|||
|
})
|
|||
|
rightElm.addEventListener('change', (e) => {
|
|||
|
if (!e.target.checked) {
|
|||
|
if (!leftElm.checked) {
|
|||
|
leftElm.checked = true
|
|||
|
}
|
|||
|
}
|
|||
|
changeEntitySplitStatus()
|
|||
|
})
|
|||
|
|
|||
|
sliderElm.addEventListener('mousedown', () => {
|
|||
|
document.body.addEventListener('mousemove', mousemove)
|
|||
|
sliderElm.addEventListener('mouseup', () => {
|
|||
|
document.body.removeEventListener('mousemove', mousemove)
|
|||
|
})
|
|||
|
})
|
|||
|
function mousemove(a, b) {
|
|||
|
if (sdk.viewer._element.getElementsByTagName('canvas')[0] === a.target) {
|
|||
|
sliderElm.style.left = (a.offsetX / sdk.viewer._element.scrollWidth * 100) + '%'
|
|||
|
sdk.viewer.scene.splitPosition = a.offsetX / sdk.viewer._element.scrollWidth
|
|||
|
}
|
|||
|
}
|
|||
|
sdk.viewer._element.appendChild(sliderElm)
|
|||
|
sdk.viewer.scene.splitStatus = status
|
|||
|
sdk.viewer.scene.splitPosition = 0.5
|
|||
|
changeEntitySplitStatus()
|
|||
|
}
|
|||
|
else {
|
|||
|
sdk.viewer.scene.splitPosition = 0
|
|||
|
changeEntitySplitStatus(0)
|
|||
|
sdk.viewer.scene.splitStatus = status
|
|||
|
}
|
|||
|
|
|||
|
function changeEntitySplitStatus(v) {
|
|||
|
let value
|
|||
|
if (v === undefined || v === null) {
|
|||
|
if (leftElm.checked && rightElm.checked) {
|
|||
|
value = 0
|
|||
|
}
|
|||
|
else {
|
|||
|
if (leftElm.checked) {
|
|||
|
value = -1
|
|||
|
}
|
|||
|
if (rightElm.checked) {
|
|||
|
value = 1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
value = v
|
|||
|
}
|
|||
|
|
|||
|
sdk.entityMap.forEach((item, key) => {
|
|||
|
if (sdk.viewer.scene.splitStatus) {
|
|||
|
if (item.entity.billboard) {
|
|||
|
item.entity.billboard.splitDirection = value
|
|||
|
}
|
|||
|
else {
|
|||
|
item.entity && (item.entity.splitDirection = value)
|
|||
|
}
|
|||
|
}
|
|||
|
console.log()
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
function splitScreen(sdk, status) {
|
|||
|
let sliderElm = sdk.viewer._element.getElementsByClassName('YJ-custom-slider')[0]
|
|||
|
let leftElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-left')[0]
|
|||
|
let rightElm = sdk.viewer._element.getElementsByClassName('YJ-custom-checkbox-right')[0]
|
|||
|
if (sliderElm) {
|
|||
|
sdk.viewer._element.removeChild(sliderElm)
|
|||
|
sdk.viewer._element.removeChild(leftElm)
|
|||
|
sdk.viewer._element.removeChild(rightElm)
|
|||
|
}
|
|||
|
if (status) {
|
|||
|
sliderElm = document.createElement('div');
|
|||
|
sliderElm.className = 'YJ-custom-slider'
|
|||
|
sliderElm.style.position = 'absolute'
|
|||
|
sliderElm.style.left = '50%'
|
|||
|
sliderElm.style.top = '0px'
|
|||
|
|
|||
|
leftElm = document.createElement('input');
|
|||
|
leftElm.className = 'YJ-custom-checkbox-left'
|
|||
|
leftElm.type = 'checkbox'
|
|||
|
leftElm.style.position = 'absolute'
|
|||
|
leftElm.style.left = 'calc(50% - 50px)'
|
|||
|
rightElm = document.createElement('input');
|
|||
|
rightElm.className = 'YJ-custom-checkbox-right'
|
|||
|
rightElm.type = 'checkbox'
|
|||
|
rightElm.style.position = 'absolute'
|
|||
|
rightElm.style.right = 'calc(50% - 50px)'
|
|||
|
sdk.viewer._element.appendChild(leftElm)
|
|||
|
sdk.viewer._element.appendChild(rightElm)
|
|||
|
|
|||
|
leftElm.checked = true
|
|||
|
leftElm.addEventListener('change', (e) => {
|
|||
|
if (!e.target.checked) {
|
|||
|
if (!rightElm.checked) {
|
|||
|
rightElm.checked = true
|
|||
|
}
|
|||
|
}
|
|||
|
changeEntitySplitStatus()
|
|||
|
})
|
|||
|
rightElm.addEventListener('change', (e) => {
|
|||
|
if (!e.target.checked) {
|
|||
|
if (!leftElm.checked) {
|
|||
|
leftElm.checked = true
|
|||
|
}
|
|||
|
}
|
|||
|
changeEntitySplitStatus()
|
|||
|
})
|
|||
|
|
|||
|
sliderElm.addEventListener('mousedown', () => {
|
|||
|
document.body.addEventListener('mousemove', mousemove)
|
|||
|
sliderElm.addEventListener('mouseup', () => {
|
|||
|
document.body.removeEventListener('mousemove', mousemove)
|
|||
|
})
|
|||
|
})
|
|||
|
function mousemove(a, b) {
|
|||
|
if (sdk.viewer._element.getElementsByTagName('canvas')[0] === a.target) {
|
|||
|
sliderElm.style.left = (a.offsetX / sdk.viewer._element.scrollWidth * 100) + '%'
|
|||
|
sdk.viewer.scene.splitPosition = a.offsetX / sdk.viewer._element.scrollWidth
|
|||
|
}
|
|||
|
}
|
|||
|
sdk.viewer._element.appendChild(sliderElm)
|
|||
|
sdk.viewer.scene.splitStatus = status
|
|||
|
sdk.viewer.scene.splitPosition = 0.5
|
|||
|
changeEntitySplitStatus()
|
|||
|
}
|
|||
|
else {
|
|||
|
sdk.viewer.scene.splitPosition = 0
|
|||
|
changeEntitySplitStatus(0)
|
|||
|
sdk.viewer.scene.splitStatus = status
|
|||
|
}
|
|||
|
|
|||
|
function changeEntitySplitStatus(v) {
|
|||
|
let value
|
|||
|
if (v === undefined || v === null) {
|
|||
|
if (leftElm.checked && rightElm.checked) {
|
|||
|
value = 0
|
|||
|
}
|
|||
|
else {
|
|||
|
if (leftElm.checked) {
|
|||
|
value = -1
|
|||
|
}
|
|||
|
if (rightElm.checked) {
|
|||
|
value = 1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
value = v
|
|||
|
}
|
|||
|
|
|||
|
sdk.entityMap.forEach((item, key) => {
|
|||
|
if (sdk.viewer.scene.splitStatus) {
|
|||
|
if (item.entity.billboard) {
|
|||
|
item.entity.billboard.splitDirection = value
|
|||
|
}
|
|||
|
else {
|
|||
|
item.entity && (item.entity.splitDirection = value)
|
|||
|
}
|
|||
|
}
|
|||
|
console.log()
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getCoordinateSystem() {
|
|||
|
return coordinateSystem
|
|||
|
}
|
|||
|
|
|||
|
function setCoordinateSystem(sdk, epsg) {
|
|||
|
coordinateSystem = epsg || 'EPSG:4326'
|
|||
|
if (!sdk || !sdk.viewer || !sdk.viewer._element) {
|
|||
|
return
|
|||
|
}
|
|||
|
let infoElm = sdk.viewer._element.getElementsByClassName('cesium-info')[0]
|
|||
|
if (!_cartesian || !infoElm) {
|
|||
|
return
|
|||
|
}
|
|||
|
let tools = new Tools()
|
|||
|
let proj = sdk.proj
|
|||
|
let position = tools.cartesian3Towgs84(_cartesian, sdk.viewer)
|
|||
|
if (coordinateSystem === 'EPSG:4326') {
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>经度:</span><span>${Number(position.lng.toFixed(6))}° </span>
|
|||
|
<span>纬度:</span><span>${Number(position.lat.toFixed(6))}° </span>
|
|||
|
<span>海拔高度:</span><span>${Number(position.alt.toFixed(2))}米</span>
|
|||
|
`
|
|||
|
}
|
|||
|
else {
|
|||
|
let result = proj.convert([{ x: position.lng, y: position.lat, z: position.alt }], 'EPSG:4326', coordinateSystem)
|
|||
|
infoElm.innerHTML = `
|
|||
|
<span>x:</span><span>${Number(result.points[0].x.toFixed(6))}</span>
|
|||
|
<span style="margin-left: 5px;">y:</span><span>${Number(result.points[0].y.toFixed(6))}</span>
|
|||
|
<span style="margin-left: 5px;">z:</span><span>${Number(result.points[0].z.toFixed(6))}</span>
|
|||
|
`
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function cameraChanged(sdk, cb) {
|
|||
|
let tools = new Tools()
|
|||
|
//设置相机变化的监听事件
|
|||
|
let removeChanged = sdk.viewer.camera.changed.addEventListener(percentage => {
|
|||
|
cb({
|
|||
|
position: tools.cartesian3Towgs84(sdk.viewer.camera.position, sdk.viewer),
|
|||
|
orientation: {
|
|||
|
heading: sdk.viewer.camera.heading,
|
|||
|
pitch: sdk.viewer.camera.pitch,
|
|||
|
roll: sdk.viewer.camera.roll
|
|||
|
}
|
|||
|
})
|
|||
|
})
|
|||
|
return removeChanged
|
|||
|
}
|
|||
|
|
|||
|
function setMaximumRequestsPerServer(v) {
|
|||
|
if (typeof v == 'number')
|
|||
|
Cesium.RequestScheduler.maximumRequestsPerServer = v
|
|||
|
}
|
|||
|
|
|||
|
/* 键盘事件 */
|
|||
|
function setKeyboardEventActive(sdk, status) {
|
|||
|
if (!sdk) {
|
|||
|
return
|
|||
|
}
|
|||
|
if (status) {
|
|||
|
sdk.viewer._disableKeyboardEvent = false
|
|||
|
}
|
|||
|
else {
|
|||
|
sdk.viewer._disableKeyboardEvent = true
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getCesiumIndexedDBMaxSize() {
|
|||
|
const baseUnit = 1024 * 1024 * 1024
|
|||
|
let size = Number(Number(localStorage.getItem('IndexedDBMaxSize')).toFixed(0))
|
|||
|
if (isNaN(size) || size < baseUnit) {
|
|||
|
size = baseUnit
|
|||
|
}
|
|||
|
return size
|
|||
|
}
|
|||
|
function setCesiumIndexedDBMaxSize(v) {
|
|||
|
const baseUnit = 1024 * 1024 * 1024
|
|||
|
let maxSize = Number(Number(v).toFixed(0))
|
|||
|
if (isNaN(maxSize) || maxSize < baseUnit) {
|
|||
|
maxSize = baseUnit
|
|||
|
}
|
|||
|
Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.SetIndexedDBMaxSize(maxSize)
|
|||
|
localStorage.setItem('IndexedDBMaxSize', maxSize)
|
|||
|
}
|
|||
|
|
|||
|
function getCesiumManageIndexexDBState() {
|
|||
|
let state = localStorage.getItem('ManageIndexexDBState')
|
|||
|
if (state === 'false') {
|
|||
|
return false
|
|||
|
}
|
|||
|
return Boolean(state)
|
|||
|
}
|
|||
|
function setCesiumManageIndexexDBState(v) {
|
|||
|
if (typeof v === "boolean") {
|
|||
|
Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.SetManageIndexexDBState(v)
|
|||
|
localStorage.setItem('ManageIndexexDBState', v)
|
|||
|
} else {
|
|||
|
console.error("参数必须为boolean")
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getCesiumIndexedDBCurrentSize() {
|
|||
|
return Cesium.ManageIndexedDB && Cesium.ManageIndexedDB.GetIndexedDBCurrentSize()
|
|||
|
}
|
|||
|
|
|||
|
function setActiveViewer(v) {
|
|||
|
setMultiViewportActiveViewer(v)
|
|||
|
setSplitActiveViewer(v)
|
|||
|
}
|
|||
|
|
|||
|
// 设置地球透明度
|
|||
|
function enablePerspective(sdk, alpha = 1) {
|
|||
|
if (!alpha && alpha != 0) {
|
|||
|
alpha = 1
|
|||
|
}
|
|||
|
sdk.viewer.scene.globe.translucency.frontFaceAlpha = alpha
|
|||
|
}
|
|||
|
|
|||
|
export { getCurrentView, setDefaultView, flyTo, CameraController, CesiumContainer, setBillboardDefaultUrl, getBillboardDefaultUrl, setGroundCover, getGroundCover, getBimPickStatus, setBimPickStatus, rotateAround, closeRotateAround, closeViewFollow, FlwStatusSwitch, JwwStatusSwitch, getFlwStatus, getJwwStatus, getCoordinateSystem, setCoordinateSystem, cameraChanged, setMaximumRequestsPerServer, setKeyboardEventActive, getTheme, setTheme, getCesiumIndexedDBMaxSize, setCesiumIndexedDBMaxSize, getCesiumManageIndexexDBState, setCesiumManageIndexexDBState, getCesiumIndexedDBCurrentSize, setActiveViewer, enablePerspective }
|