UNPKG

vue-cesium

Version:
1,183 lines (1,176 loc) 47.4 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var mitt = require('mitt'); require('../../../composables/index.js'); var defaultProps = require('./defaultProps.js'); var mergeDescriptors = require('../../../utils/merge-descriptors.js'); var util = require('../../../utils/util.js'); var vm = require('../../../utils/private/vm.js'); var cesiumHelpers = require('../../../utils/cesium-helpers.js'); var useLog = require('../../../composables/private/use-log.js'); var loadUtil = require('./loadUtil.js'); var index = require('../../../composables/use-global-config/index.js'); var useVcExtension = require('../../../composables/private/use-vc-extension.js'); var index$1 = require('../../../composables/use-events/index.js'); var index$2 = require('../../../composables/use-locale/index.js'); var shared = require('@vue/shared'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var mitt__default = /*#__PURE__*/_interopDefaultLegacy(mitt); "use strict"; const viewerProps = defaultProps["default"]; function useViewer(props, ctx, vcInstance) { let createResolve, reject; const creatingPromise = new Promise((_resolve, _reject) => { createResolve = _resolve; reject = _reject; }); const viewerRef = vue.ref(); const isReady = vue.ref(false); const vcMitt = mitt__default["default"](); const { emit } = ctx; const globalConfig = index.useGlobalConfig(); const logger = useLog["default"](vcInstance); vcInstance.mounted = false; vcInstance.vcMitt = vcMitt; vcInstance.cesiumClass = "Viewer"; vcInstance.children = []; const eventsState = index$1["default"](props, vcInstance, logger); const layout = vue.reactive({ toolbarContainerRC: void 0, timelineContainerRC: void 0, animationContainerRC: void 0, bottomContainerRC: void 0 }); let loadLibs = []; logger.debug("viewer creating"); const { t } = index$2.useLocale(); const { invokeExtensions, revokeExtensions } = useVcExtension["default"](); vue.watch( () => props.selectionIndicator, (val) => { const { viewer, viewerElement } = vcInstance; const { defined, SelectionIndicator } = Cesium; let selectionIndicatorContainer; if (defined(viewer.selectionIndicator) && !viewer.selectionIndicator.isDestroyed() && !val) { selectionIndicatorContainer = viewer.selectionIndicator.container; viewerElement == null ? void 0 : viewerElement.removeChild(selectionIndicatorContainer); viewer.selectionIndicator.destroy(); viewer._selectionIndicator = void 0; } else if (!defined(viewer.selectionIndicator) || viewer.selectionIndicator.isDestroyed()) { selectionIndicatorContainer = document.createElement("div"); selectionIndicatorContainer.className = "cesium-viewer-selectionIndicatorContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(selectionIndicatorContainer); const selectionIndicator = new SelectionIndicator(selectionIndicatorContainer, viewer.scene); viewer._selectionIndicator = selectionIndicator; } viewer.viewerWidgetResized.raiseEvent({ type: "selectionIndicator", status: val ? "added" : "removed", target: selectionIndicatorContainer }); } ); vue.watch( () => props.infoBox, (val) => { var _a, _b; const { viewer, viewerElement } = vcInstance; const { defined, InfoBox } = Cesium; const events = ["cameraClicked", "closeClicked"]; let infoBoxContainer; if (defined(viewer.infoBox) && !viewer.infoBox.isDestroyed() && !val) { const infoBoxViewModel = viewer.infoBox.viewModel; infoBoxViewModel && eventsState.bindEvents(infoBoxViewModel, events, false); infoBoxContainer = viewer.infoBox.container; viewerElement == null ? void 0 : viewerElement.removeChild(infoBoxContainer); viewer.infoBox.destroy(); viewer._infoBox = void 0; } else if (!defined(viewer.infoBox) || viewer.infoBox.isDestroyed()) { infoBoxContainer = document.createElement("div"); infoBoxContainer.className = "cesium-viewer-infoBoxContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(infoBoxContainer); const infoBox = new InfoBox(infoBoxContainer); const infoBoxViewModel = infoBox.viewModel; viewer._onInfoBoxCameraClicked && ((_a = viewer._eventHelper) == null ? void 0 : _a.add(infoBoxViewModel.cameraClicked, viewer._onInfoBoxCameraClicked, viewer)); viewer._onInfoBoxClockClicked && ((_b = viewer._eventHelper) == null ? void 0 : _b.add(infoBoxViewModel.closeClicked, viewer._onInfoBoxClockClicked, viewer)); infoBoxViewModel && eventsState.bindEvents(infoBoxViewModel, events, true); viewer._infoBox = infoBox; } viewer.forceResize(); viewer.viewerWidgetResized.raiseEvent({ type: "infoBox", status: val ? "added" : "removed", target: infoBoxContainer }); } ); vue.watch( () => props.geocoder, (val) => { var _a; const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, Geocoder } = Cesium; let geocoderContainer; if (defined(viewer.geocoder) && !viewer.geocoder.isDestroyed() && !val) { geocoderContainer = viewer.geocoder.container; toolbar == null ? void 0 : toolbar.removeChild(geocoderContainer); viewer.geocoder.destroy(); viewer._geocoder = void 0; } else if (!defined(viewer.geocoder) || viewer.geocoder.isDestroyed()) { geocoderContainer = document.createElement("div"); geocoderContainer.className = "cesium-viewer-geocoderContainer"; toolbar == null ? void 0 : toolbar.appendChild(geocoderContainer); const geocoder = new Geocoder({ container: geocoderContainer, geocoderServices: defined(props.geocoder) && typeof props.geocoder !== "boolean" ? Array.isArray(props.geocoder) ? props.geocoder : [props.geocoder] : void 0, scene: viewer.scene }); viewer._clearObjects && ((_a = viewer._eventHelper) == null ? void 0 : _a.add(geocoder.viewModel.search.beforeExecute, viewer._clearObjects, viewer)); viewer._geocoder = geocoder; resizeToolbar(toolbar, geocoderContainer); } viewer.viewerWidgetResized.raiseEvent({ type: "geocoder", status: val ? "added" : "removed", target: geocoderContainer }); } ); vue.watch( () => props.homeButton, (val) => { var _a, _b; const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, HomeButton } = Cesium; if (defined(viewer.homeButton) && !viewer.homeButton.isDestroyed() && !val) { viewer.homeButton.destroy(); viewer._homeButton = void 0; } else if (!defined(viewer.homeButton) || viewer.homeButton.isDestroyed()) { const homeButton = new HomeButton(toolbar, viewer.scene); if (defined(viewer.geocoder)) { (_a = viewer._eventHelper) == null ? void 0 : _a.add(homeButton.viewModel.command.afterExecute, function() { const viewModel = viewer.geocoder.viewModel; viewModel.searchText = ""; viewModel.isSearchInProgress && viewModel.search(); }); } viewer._clearTrackedObject && ((_b = viewer._eventHelper) == null ? void 0 : _b.add(homeButton.viewModel.command.beforeExecute, viewer._clearTrackedObject, viewer)); viewer._homeButton = homeButton; resizeToolbar(toolbar, homeButton); } viewer.viewerWidgetResized.raiseEvent({ type: "homeButton", status: val ? "added" : "removed", target: toolbar }); } ); vue.watch( () => props.sceneModePicker, (val) => { const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, DeveloperError, SceneModePicker } = Cesium; if (defined(viewer.sceneModePicker) && !viewer.sceneModePicker.isDestroyed() && !val) { viewer.sceneModePicker.destroy(); viewer._sceneModePicker = void 0; } else if (!defined(viewer.sceneModePicker) || viewer.sceneModePicker.isDestroyed()) { if (props.sceneModePicker && props.scene3DOnly) { throw new DeveloperError("options.sceneModePicker is not available when options.scene3DOnly is set to true."); } if (!props.scene3DOnly && props.sceneModePicker) { const sceneModePicker = new SceneModePicker(toolbar, viewer.scene); viewer._sceneModePicker = sceneModePicker; resizeToolbar(toolbar, sceneModePicker); } } viewer.viewerWidgetResized.raiseEvent({ type: "sceneModePicker", status: val ? "added" : "removed", target: toolbar }); } ); vue.watch( () => props.projectionPicker, (val) => { const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, ProjectionPicker } = Cesium; if (defined(viewer.projectionPicker) && !viewer.projectionPicker.isDestroyed() && !val) { viewer.projectionPicker.destroy(); viewer._projectionPicker = void 0; } else if (!defined(viewer.projectionPicker) || viewer.projectionPicker.isDestroyed()) { const projectionPicker = new ProjectionPicker(toolbar, viewer.scene); viewer._projectionPicker = projectionPicker; resizeToolbar(toolbar, projectionPicker); } viewer.viewerWidgetResized.raiseEvent({ type: "projectionPicker", status: val ? "added" : "removed", target: toolbar }); } ); vue.watch( () => props.baseLayerPicker, async (val) => { const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, buildModuleUrl, DeveloperError, defaultValue, createDefaultImageryProviderViewModels, createDefaultTerrainProviderViewModels, BaseLayerPicker } = Cesium; if (defined(viewer.baseLayerPicker) && !viewer.baseLayerPicker.isDestroyed() && !val) { viewer.baseLayerPicker.destroy(); viewer._baseLayerPicker = void 0; viewer.imageryLayers.remove(viewer.imageryLayers.get(viewer.imageryLayers.length - 1)); const url = buildModuleUrl("Assets/Textures/NaturalEarthII"); const baseLayer = viewer.imageryLayers.addImageryProvider( cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.104") ? await Cesium.TileMapServiceImageryProvider.fromUrl(url) : new Cesium.TileMapServiceImageryProvider({ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore url }) ); viewer.imageryLayers.lowerToBottom(baseLayer); } else if (!defined(viewer.baseLayerPicker) || viewer.baseLayerPicker.isDestroyed()) { const createBaseLayerPicker = (!Cesium.defined(viewer.scene.globe) || props.globe !== false) && (!Cesium.defined(viewer.baseLayerPicker) || props.baseLayerPicker !== false); if (createBaseLayerPicker && defined(props.imageryProvider)) { throw new DeveloperError(`options.imageryProvider is not available when using the BaseLayerPicker widget. Either specify options.selectedImageryProviderViewModel instead or set options.baseLayerPicker to false.`); } if (!createBaseLayerPicker && defined(props.selectedImageryProviderViewModel)) { throw new DeveloperError(`options.selectedImageryProviderViewModel is not available when not using the BaseLayerPicker widget. Either specify options.imageryProvider instead or set options.baseLayerPicker to true.`); } if (createBaseLayerPicker && defined(props.terrainProvider)) { throw new DeveloperError(`options.terrainProvider is not available when using the BaseLayerPicker widget. Either specify options.selectedTerrainProviderViewModel instead or set options.baseLayerPicker to false.`); } if (!createBaseLayerPicker && defined(props.selectedTerrainProviderViewModel)) { throw new DeveloperError(`options.selectedTerrainProviderViewModel is not available when not using the BaseLayerPicker widget. Either specify options.terrainProvider instead or set options.baseLayerPicker to true.`); } if (createBaseLayerPicker) { const imageryProviderViewModels = defaultValue(props.imageryProviderViewModels, createDefaultImageryProviderViewModels()); const terrainProviderViewModels = defaultValue(props.terrainProviderViewModels, createDefaultTerrainProviderViewModels()); const baseLayerPicker = new BaseLayerPicker(toolbar, { globe: viewer.scene.globe, imageryProviderViewModels, selectedImageryProviderViewModel: imageryProviderViewModels[0], terrainProviderViewModels, selectedTerrainProviderViewModel: terrainProviderViewModels[0] }); const elements = toolbar == null ? void 0 : toolbar.getElementsByClassName("cesium-baseLayerPicker-dropDown"); const baseLayerPickerDropDown = elements == null ? void 0 : elements[0]; viewer._baseLayerPickerDropDown = baseLayerPickerDropDown; viewer._baseLayerPicker = baseLayerPicker; viewer.imageryLayers.raiseToTop(viewer.imageryLayers.get(0)); resizeToolbar(toolbar, baseLayerPicker); } } viewer.viewerWidgetResized.raiseEvent({ type: "baseLayerPicker", status: val ? "added" : "removed", target: toolbar }); } ); vue.watch( () => props.navigationHelpButton, (val) => { const { viewer } = vcInstance; const toolbar = viewer._toolbar; const { defined, defaultValue, NavigationHelpButton } = Cesium; if (defined(viewer.navigationHelpButton) && !viewer.navigationHelpButton.isDestroyed() && !val) { viewer.navigationHelpButton.destroy(); viewer._navigationHelpButton = void 0; } else if (!defined(viewer.navigationHelpButton) || viewer.navigationHelpButton.isDestroyed()) { let showNavHelp = true; try { if (defined(window.localStorage)) { const hasSeenNavHelp = window.localStorage.getItem("cesium-hasSeenNavHelp"); if (defined(hasSeenNavHelp) && Boolean(hasSeenNavHelp)) { showNavHelp = false; } else { window.localStorage.setItem("cesium-hasSeenNavHelp", "true"); } } } catch (e) { } const navigationHelpButton = new NavigationHelpButton({ container: toolbar, instructionsInitiallyVisible: defaultValue(props.navigationInstructionsInitiallyVisible, showNavHelp) }); viewer._navigationHelpButton = navigationHelpButton; resizeToolbar(toolbar, navigationHelpButton); } viewer.viewerWidgetResized.raiseEvent({ type: "navigationHelpButton", status: val ? "added" : "removed", target: toolbar }); } ); vue.watch( () => props.animation, (val) => { const { viewer, viewerElement } = vcInstance; const { defined, Animation, AnimationViewModel } = Cesium; let animationContainer; if (defined(viewer.animation) && !viewer.animation.isDestroyed() && !val) { animationContainer = viewer.animation.container; viewerElement == null ? void 0 : viewerElement.removeChild(animationContainer); viewer.animation.destroy(); viewer._animation = void 0; } else if (!defined(viewer.animation) || viewer.animation.isDestroyed()) { animationContainer = document.createElement("div"); animationContainer.className = "cesium-viewer-animationContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(animationContainer); const animation = new Animation(animationContainer, new AnimationViewModel(viewer.clockViewModel)); animation.viewModel.dateFormatter = localeDateTimeFormatter; animation.viewModel.timeFormatter = localeTimeFormatter; viewer._animation = animation; } viewer.forceResize(); viewer.viewerWidgetResized.raiseEvent({ type: "animation", status: val ? "added" : "removed", target: animationContainer }); } ); vue.watch( () => props.timeline, (val) => { var _a; const { viewer, viewerElement } = vcInstance; const { defined, Timeline } = Cesium; let timelineContainer; if (defined(viewer.timeline) && !viewer.timeline.isDestroyed() && !val) { timelineContainer = viewer.timeline.container; viewerElement == null ? void 0 : viewerElement.removeChild(timelineContainer); viewer.timeline.destroy(); viewer._timeline = void 0; } else if (!defined(viewer.timeline) || viewer.timeline.isDestroyed()) { timelineContainer = document.createElement("div"); timelineContainer.className = "cesium-viewer-timelineContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(timelineContainer); const timeline = new Timeline(timelineContainer, viewer.clock); timeline.makeLabel = (time) => { return localeDateTimeFormatter(time); }; (_a = timeline.addEventListener) == null ? void 0 : _a.call(timeline, "settime", onTimelineScrubfunction, false); timeline.zoomTo(viewer.clock.startTime, viewer.clock.stopTime); viewer._timeline = timeline; } viewer.forceResize(); viewer.viewerWidgetResized.raiseEvent({ type: "timeline", status: val ? "added" : "removed", target: timelineContainer }); } ); vue.watch( () => props.fullscreenButton, (val) => { const { viewer, viewerElement } = vcInstance; const { defined, FullscreenButton } = Cesium; let fullscreenContainer; if (defined(viewer.fullscreenButton) && !viewer.fullscreenButton.isDestroyed() && !val) { fullscreenContainer = viewer.fullscreenButton.container; viewerElement == null ? void 0 : viewerElement.removeChild(fullscreenContainer); viewer.fullscreenButton.destroy(); viewer._fullscreenButton = void 0; } else if (!defined(viewer.fullscreenButton) || viewer.fullscreenButton.isDestroyed()) { fullscreenContainer = document.createElement("div"); fullscreenContainer.className = "cesium-viewer-fullscreenContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(fullscreenContainer); const fullscreenButton = new FullscreenButton(fullscreenContainer, viewerElement); viewer._fullscreenButton = fullscreenButton; } viewer.forceResize(); viewer.viewerWidgetResized.raiseEvent({ type: "fullscreenButton", status: val ? "added" : "removed", target: fullscreenContainer }); } ); vue.watch( () => props.fullscreenElement, (val) => { const { viewer } = vcInstance; const { defined } = Cesium; if (!defined(viewer.fullscreenButton)) { return; } if (defined(val)) { viewer.fullscreenButton.viewModel.fullscreenElement = val; } } ); vue.watch( () => props.vrButton, (val) => { const { viewer, viewerElement } = vcInstance; const { defined, VRButton } = Cesium; let vrContainer; if (defined(viewer.vrButton) && !viewer.vrButton.isDestroyed() && !val) { vrContainer = viewer.vrButton.container; viewerElement == null ? void 0 : viewerElement.removeChild(vrContainer); viewer.vrButton.destroy(); viewer._vrButton = void 0; } else if (!defined(viewer.vrButton) || viewer.vrButton.isDestroyed()) { vrContainer = document.createElement("div"); vrContainer.className = "cesium-viewer-vrContainer"; viewerElement == null ? void 0 : viewerElement.appendChild(vrContainer); const vrButton = new VRButton(vrContainer, viewer.scene, viewerElement); const viewModelCommand = vrButton.viewModel.command; vrButton.viewModel._command = function(VRButtonViewModel) { viewModelCommand(); enableVRUI(viewer, VRButtonViewModel.isVRMode); }; viewer._vrButton = vrButton; } viewer.forceResize(); viewer.viewerWidgetResized.raiseEvent({ type: "fullscreenButton", status: val ? "added" : "removed", target: vrContainer }); } ); vue.watch( () => props.useDefaultRenderLoop, (val) => { vcInstance.viewer.useDefaultRenderLoop = val; } ); vue.watch( () => props.sceneMode, (val) => { const { SceneMode } = Cesium; if (SceneMode.COLUMBUS_VIEW === val || SceneMode.MORPHING === val || SceneMode.SCENE2D === val || SceneMode.SCENE3D === val) { vcInstance.viewer.scene.mode = val; } } ); vue.watch( () => props.shouldAnimate, (val) => { vcInstance.viewer.clock.shouldAnimate = val; } ); vue.watch( () => props.terrainExaggeration, (val) => { vcInstance.viewer._terrainExaggeration = val; } ); vue.watch( () => props.shadows, (val) => { vcInstance.viewer.scene.shadowMap.enabled = val; } ); vue.watch( () => props.terrainProvider, (val) => { val && (vcInstance.viewer.terrainProvider = val); } ); vue.watch( () => props.camera, (val) => { cesiumHelpers.setViewerCamera(vcInstance.viewer, val); }, { deep: true } ); vue.watch( () => props.imageryProvider, (val, oldVal) => { const { viewer } = vcInstance; const { defined } = Cesium; if (defined(val)) { for (let i = 0; i < viewer.imageryLayers.length; i++) { viewer.imageryLayers.get(i).imageryProvider === oldVal && viewer.imageryLayers.remove(viewer.imageryLayers[i]); } val && viewer.imageryLayers.addImageryProvider(val); } } ); vue.watch( () => props.showCredit, (val) => { const { viewer } = vcInstance; viewer.cesiumWidget.creditContainer.style.display = val ? "inline" : "none"; viewer.viewerWidgetResized.raiseEvent({ type: "credit", status: val ? "added" : "removed", target: viewer.cesiumWidget.creditContainer }); } ); vue.watch( () => props.debugShowFramesPerSecond, (val) => { const { viewer } = vcInstance; viewer.scene.debugShowFramesPerSecond = val; } ); const beforeLoad = async function() { logger.debug("beforeLoad - viewer"); const listener = vm.getInstanceListener(vcInstance, "beforeLoad"); listener && emit("beforeLoad", vcInstance); globalConfig.value.__scriptPromise = globalConfig.value.__scriptPromise || getCesiumScript(); await globalConfig.value.__scriptPromise; }; const load = async function() { var _a, _b, _c; logger.debug("loading-viewer"); if (vcInstance.mounted) { return false; } await beforeLoad(); if (typeof Cesium === "undefined") { return false; } const { Ion, buildModuleUrl, ImageryLayer, TileMapServiceImageryProvider, Viewer, defined, Math: CesiumMath, Event } = Cesium; const accessToken = props.accessToken ? props.accessToken : globalConfig.value.accessToken; Ion.defaultAccessToken = accessToken; const url = buildModuleUrl("Assets/Textures/NaturalEarthII"); const options = {}; props && Object.keys(props).forEach((vueProp) => { if (props[vueProp] === void 0 || props[vueProp] === null) { return; } options[vueProp] = props[vueProp]; }); options.fullscreenElement = util.isEmptyObj(options.fullscreenElement) ? vm.$(viewerRef) : options.fullscreenElement; if (cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.104")) { options.baseLayer = util.isEmptyObj(options.baseLayer) && options.baseLayer !== false ? ImageryLayer.fromProviderAsync(TileMapServiceImageryProvider.fromUrl(url), {}) : options.baseLayer; } else { options.imageryProvider = util.isEmptyObj(options.imageryProvider) ? new TileMapServiceImageryProvider({ url }) : options.imageryProvider; } let viewer; if (props.viewerCreator) { viewer = props.viewerCreator(vcInstance, vm.$(viewerRef), options); } else { if (globalThis.mars3d) { vcInstance.map = new mars3d.Map(vm.$(viewerRef).id, { scene: options, control: options }); viewer = (_a = vcInstance.map) == null ? void 0 : _a._viewer; } else if (globalThis.DC) { vcInstance.dcViewer = new DC.Viewer(vm.$(viewerRef).id, options); viewer = (_b = vcInstance.dcViewer) == null ? void 0 : _b.delegate; } else if (globalThis.XE) { vcInstance.earth = new globalThis.XE.Earth(vm.$(viewerRef), options); viewer = (_c = vcInstance.earth) == null ? void 0 : _c.czm.viewer; } else { viewer = new Viewer(vm.$(viewerRef), options); } } invokeExtensions(viewer); vcInstance.Cesium = Cesium; vcInstance.viewer = viewer; vcInstance.viewerElement = viewer._element; vcInstance.mounted = true; if (cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.83")) { if (cesiumHelpers.compareCesiumVersion(Cesium.VERSION, "1.116")) { viewer.scene.verticalExaggeration = options.verticalExaggeration || options.terrainExaggeration; } else { viewer.scene.globe["terrainExaggeration"] = options.verticalExaggeration || options.terrainExaggeration; } } defined(options.camera) && cesiumHelpers.setViewerCamera(viewer, options.camera); const listener = vm.getInstanceListener(vcInstance, "update:camera"); listener && viewer.camera.changed.addEventListener(() => { const cartographic = viewer.camera.positionCartographic; let cameraNew; if (shared.hasOwn(options.camera.position, "lng")) { cameraNew = { position: { lng: CesiumMath.toDegrees(cartographic.longitude), lat: CesiumMath.toDegrees(cartographic.latitude), height: cartographic.height }, heading: CesiumMath.toDegrees(viewer.camera.heading || 360), pitch: CesiumMath.toDegrees(viewer.camera.pitch || -90), roll: CesiumMath.toDegrees(viewer.camera.roll || 0) }; } else { cameraNew = { position: { x: viewer.camera.position.x, y: viewer.camera.position.y, z: viewer.camera.position.z }, heading: viewer.camera.heading || 2 * Math.PI, pitch: viewer.camera.pitch || -Math.PI / 2, roll: viewer.camera.roll || 0 }; } emit("update:camera", cameraNew); }); if (defined(viewer.animation)) { viewer.animation.viewModel.dateFormatter = localeDateTimeFormatter; viewer.animation.viewModel.timeFormatter = localeTimeFormatter; } if (defined(viewer.timeline)) { viewer.timeline.makeLabel = (time) => { return localeDateTimeFormatter(time); }; viewer.timeline.zoomTo(viewer.clock.startTime, viewer.clock.stopTime); } if (process.env.NODE_ENV !== "production") { if (props.logo) { logger.warn("'logo' is deprecated. Use `showCredit` prop instead. "); } } !props.showCredit && (viewer.cesiumWidget.creditContainer.style.display = "none"); props.debugShowFramesPerSecond && (viewer.scene.debugShowFramesPerSecond = true); viewer.viewerWidgetResized = viewer.viewerWidgetResized || new Event(); viewer.viewerWidgetResized.addEventListener(onViewerWidgetResized); viewer.imageryLayers.layerAdded.addEventListener(onImageryLayerAdded); eventsState.registerEvents(true); const readyObj = { Cesium, viewer, vm: vcInstance }; if (globalThis.XE) { Object.assign(readyObj, { earth: vcInstance.earth }); } else if (globalThis.mars3d) { Object.assign(readyObj, { map: vcInstance.map }); } else if (globalThis.DC) { Object.assign(readyObj, { dcViewer: vcInstance.dcViewer }); } const listenerReady = vm.getInstanceListener(vcInstance, "ready"); listenerReady && emit("ready", readyObj); vcMitt == null ? void 0 : vcMitt.emit("ready", readyObj); vue.nextTick(() => { viewer.resize(); onViewerWidgetResized({ type: "viewer", status: "added", target: viewer.container }); isReady.value = true; }); logger.debug("loaded-viewer"); Object.assign(vcInstance.proxy, { cesiumObject: viewer }); return readyObj; }; const unload = async function() { if (!vcInstance.mounted) { return false; } logger.debug("viewer---unloading"); let unloadingResolve; globalConfig.value.__viewerUnloadingPromise = new Promise((resolve, reject2) => { unloadingResolve = resolve; }); for (let i = 0; i < vcInstance.children.length; i++) { const vcChildCmp = vcInstance.children[i].proxy; await vcChildCmp.unload(); } vcInstance.children.length = 0; const { viewer, earth, map, dcViewer } = vcInstance; if (globalThis.Cesium) { viewer.imageryLayers.layerAdded.removeEventListener(onImageryLayerAdded); eventsState.registerEvents(false); } const { removeCesiumScript } = props; viewer._vcPickScreenSpaceEventHandler && viewer._vcPickScreenSpaceEventHandler.destroy(); viewer._vcViewerScreenSpaceEventHandler && viewer._vcViewerScreenSpaceEventHandler.destroy(); viewer._vcPickScreenSpaceEventHandler = void 0; viewer._vcViewerScreenSpaceEventHandler = void 0; removeCesiumScript && revokeExtensions(viewer); delete vcInstance.appContext.config.globalProperties.$VueCesium[viewer.container.id]; if (globalThis.XE) { earth && earth.destroy(); } else if (globalThis.mars3d) { map && map.destroy(); } else if (globalThis.DC) { dcViewer && dcViewer.destroy(); } else { viewer && viewer.destroy(); } vcInstance.viewer = void 0; vcInstance.mounted = false; if (removeCesiumScript && globalThis.Cesium) { const scripts = document.getElementsByTagName("script"); const removeScripts = []; for (const script of scripts) { script.src.indexOf("/Cesium.js") > -1 && removeScripts.push(script); script.src.indexOf("/Workers/zlib.min.js") > -1 && removeScripts.push(script); if (globalThis.XE) { script.src.indexOf("/rxjs.umd.min.js") > -1 && removeScripts.push(script); script.src.indexOf("/XbsjCesium.js") > -1 && removeScripts.push(script); script.src.indexOf("/viewerCesiumNavigationMixin.js") > -1 && removeScripts.push(script); script.src.indexOf("/XbsjEarth.js") > -1 && removeScripts.push(script); } loadLibs.includes(script.src) && !removeScripts.includes(script) && removeScripts.push(script); } const links = document.getElementsByTagName("link"); for (const link of links) { link.href.includes("Widgets/widgets.css") && !removeScripts.includes(link) && removeScripts.push(link); loadLibs.includes(link.href) && !removeScripts.includes(link) && removeScripts.push(link); } removeScripts.forEach((script) => { script.parentNode && script.parentNode.removeChild(script); }); globalThis.Cesium && (globalThis.Cesium = void 0); globalThis.XbsjCesium && (globalThis.XbsjCesium = void 0); globalThis.XbsjEarth && (globalThis.XbsjEarth = void 0); globalThis.XE && (globalThis.XE = void 0); globalThis.mars3d && (globalThis.mars3d = void 0); globalThis.DC && (globalThis.DC = void 0); globalThis.DcCore && (globalThis.DcCore = void 0); globalConfig.value.__scriptPromise = void 0; loadLibs = []; } vcInstance.isUnmounted = false; const listener = vm.getInstanceListener(vcInstance, "destroyed"); listener && emit("destroyed", vcInstance); vcMitt.emit("destroyed", vcInstance); logger.debug("viewer---unloaded"); unloadingResolve(true); globalConfig.value.__viewerUnloadingPromise = void 0; isReady.value = false; return true; }; const reload = function() { return unload().then(() => { return load(); }); }; const getCesiumScript = async function() { logger.debug("getCesiumScript"); if (!globalThis.Cesium) { const cesiumPath = props.cesiumPath ? props.cesiumPath : globalConfig.value.cesiumPath; const dirName = util.dirname(cesiumPath); const mars3dConfig = globalConfig.value.mars3dConfig || props.mars3dConfig; const dcConfig = globalConfig.value.dcConfig || props.dcConfig; if (mars3dConfig) { const libsConfig = mars3dConfig.libs || loadUtil.getMars3dConfig(); const include = mars3dConfig.include || "mars3d"; const arrInclude = include.trim().split(","); const keys = {}; for (let i = 0, len = arrInclude.length; i < len; i++) { const key = arrInclude[i]; if (keys[key]) { continue; } keys[key] = true; loadLibs.push(...libsConfig[key]); } } else if (dcConfig) { loadLibs.push(cesiumPath); loadLibs.push(cesiumPath.replace("dc.min.js", "dc.min.css")); loadLibs.push(dcConfig.Cesium); const dirName2 = util.dirname(dcConfig.Cesium); loadLibs.push(`${dirName2}/Widgets/widgets.css`); if (dcConfig.turf) { loadLibs.push(dcConfig.turf); } if (dcConfig.echarts) { loadLibs.push(dcConfig.echarts); } } else if (cesiumPath.includes("/dc.base.min.js")) { loadLibs.push(cesiumPath); loadLibs.push(cesiumPath.replace("/dc.base.min.js", "/dc.core.min.js")); loadLibs.push(cesiumPath.replace("/dc.base.min.js", "/dc.core.min.js").replace("/dc.core.min.js", "/dc.core.min.css")); } else if (cesiumPath.includes("/XbsjEarth.js")) { loadLibs.push(cesiumPath); } else { loadLibs.push(cesiumPath); loadLibs.push(`${dirName}/Widgets/widgets.css`); } const secondaryLibs = loadLibs; if (mars3dConfig || dcConfig) { const primaryLib = loadLibs.find((v) => v.includes("Cesium.js")); await loadScript(primaryLib); secondaryLibs.splice(secondaryLibs.indexOf(primaryLib), 1); } const scriptLoadPromises = []; secondaryLibs.forEach((url) => { const cssExpr = new RegExp("\\.css"); if (cssExpr.test(url)) { scriptLoadPromises.push(loadLink(url)); } else { scriptLoadPromises.push(loadScript(url)); } }); return Promise.all(scriptLoadPromises).then(() => { if (globalThis.Cesium) { if (globalThis.DC) { const config = { ...dcConfig, Cesium: globalThis.Cesium }; if (dcConfig.echarts) { config.echarts = globalThis.echarts; } if (dcConfig.turf) { config.turf = globalThis.turf; } return globalThis.DC.ready(config).then(() => { globalThis.Cesium = DC.getLib("Cesium"); const listener = vm.getInstanceListener(vcInstance, "cesiumReady"); listener && emit("cesiumReady", globalThis.DC); return globalThis.Cesium; }); } else { const listener = vm.getInstanceListener(vcInstance, "cesiumReady"); listener && emit("cesiumReady", globalThis.Cesium); return globalThis.Cesium; } } else if (globalThis.XE) { return globalThis.XE.ready().then(() => { const listener = vm.getInstanceListener(vcInstance, "cesiumReady"); listener && emit("cesiumReady", globalThis.Cesium); return globalThis.Cesium; }); } else if (globalThis.DC) { if (cesiumHelpers.compareCesiumVersion(globalThis.DC.VERSION, "3.0.0")) { return globalThis.DC.ready({ ...dcConfig, Cesium: globalThis.Cesium }).then(() => { globalThis.Cesium = DC.getLib("Cesium"); const listener = vm.getInstanceListener(vcInstance, "cesiumReady"); listener && emit("cesiumReady", globalThis.DC); return globalThis.Cesium; }); } else { globalThis.DC.use(globalThis.DcCore.default || globalThis.DcCore); globalThis.DC.baseUrl = `${dirName}/resources/`; globalThis.DC.ready(() => { globalThis.Cesium = DC.Namespace.Cesium; const listener = vm.getInstanceListener(vcInstance, "cesiumReady"); listener && emit("cesiumReady", globalThis.DC); return globalThis.Cesium; }); return globalThis.Cesium; } } else { reject(new Error("VueCesium ERROR: Error loading CesiumJS!")); } }); } else { return Promise.resolve(globalThis.Cesium); } }; const loadScript = (src) => { const $script = document.createElement("script"); $script.async = false; $script.src = src; document.body.appendChild($script); return new Promise((resolve, reject2) => { $script.onload = () => { resolve(true); }; }); }; const loadLink = (src) => { const $link = document.createElement("link"); $link.rel = "stylesheet"; $link.href = src; document.head.appendChild($link); return new Promise((resolve, reject2) => { $link.onload = () => { resolve(true); }; }); }; const onViewerWidgetResized = (e) => { var _a, _b; const { viewer } = vcInstance; const toolbarElement = viewer._toolbar; if (toolbarElement !== void 0 && getComputedStyle(toolbarElement).visibility !== "hidden" && getComputedStyle(toolbarElement).display !== "none") { layout.toolbarContainerRC = toolbarElement.getBoundingClientRect(); } else { layout.toolbarContainerRC = void 0; } const bottomContainer = viewer.bottomContainer; if (bottomContainer !== void 0 && getComputedStyle(bottomContainer).visibility !== "hidden" && getComputedStyle(bottomContainer).display !== "none") { layout.bottomContainerRC = bottomContainer.getBoundingClientRect(); } else { layout.bottomContainerRC = void 0; } const timelineContainer = (_a = viewer.timeline) == null ? void 0 : _a.container; if (timelineContainer !== void 0 && getComputedStyle(timelineContainer).visibility !== "hidden" && getComputedStyle(timelineContainer).display !== "none") { layout.timelineContainerRC = timelineContainer.getBoundingClientRect(); } else { layout.timelineContainerRC = void 0; } const animationContainer = (_b = viewer.animation) == null ? void 0 : _b.container; if (animationContainer !== void 0 && getComputedStyle(animationContainer).visibility !== "hidden" && getComputedStyle(animationContainer).display !== "none") { layout.animationContainerRC = animationContainer.getBoundingClientRect(); } else { layout.animationContainerRC = void 0; } viewer.resize(); const listener = vm.getInstanceListener(vcInstance, "viewerWidgetResized"); listener && emit("viewerWidgetResized", e); }; const onImageryLayerAdded = (layer) => { const viewer = vcInstance.viewer; const { autoSortImageryLayers } = props; if (viewer.baseLayerPicker) { viewer.imageryLayers.raiseToTop(layer); } const { defined } = Cesium; if (autoSortImageryLayers) { layer.sortOrder = defined(layer.sortOrder) ? layer.sortOrder : 9999; viewer.imageryLayers._layers.sort((a, b) => a.sortOrder - b.sortOrder); viewer.imageryLayers._update(); } }; const localeDateTimeFormatter = function(date, viewModel, ignoredate) { const { JulianDate } = Cesium; let TZCode; if (props.UTCOffset) { date = JulianDate.addMinutes(date, props.UTCOffset, new JulianDate()); const offset = (/* @__PURE__ */ new Date()).getTimezoneOffset() - props.UTCOffset; TZCode = offset === 0 ? "UTC" : "UTC+" + -(offset / 60); } else { TZCode = (/* @__PURE__ */ new Date()).getTimezoneOffset() === 0 ? "UTC" : "UTC+" + -((/* @__PURE__ */ new Date()).getTimezoneOffset() / 60); } const jsDate = JulianDate.toDate(date); const timeString = jsDate.toLocaleString(t("name"), { hour: "numeric", minute: "numeric", second: "numeric", hour12: false }).replace(/,/g, ""); const dateString = jsDate.toLocaleString(t("name"), { year: "numeric", month: "short", day: "numeric" }).replace(/,/g, ""); if (!ignoredate && (viewModel || jsDate.getHours() + jsDate.getMinutes() === 0)) { return dateString; } props.TZCode && (TZCode = props.TZCode); return ignoredate ? `${timeString} ${TZCode}` : `${dateString} ${timeString} ${TZCode}`; }; const localeTimeFormatter = function(time, viewModel) { return localeDateTimeFormatter(time, viewModel, true); }; const onTimelineScrubfunction = function(e) { const clock = e.clock; clock.currentTime = e.timeJulian; clock.shouldAnimate = false; }; const enableVRUI = function(viewer, enabled) { const geocoder = viewer._geocoder; const homeButton = viewer._homeButton; const sceneModePicker = viewer._sceneModePicker; const projectionPicker = viewer._projectionPicker; const baseLayerPicker = viewer._baseLayerPicker; const animation = viewer._animation; const timeline = viewer._timeline; const fullscreenButton = viewer._fullscreenButton; const infoBox = viewer._infoBox; const selectionIndicator = viewer._selectionIndicator; const visibility = enabled ? "hidden" : "visible"; const { defined } = Cesium; if (defined(geocoder)) { geocoder.container.style.visibility = visibility; } if (defined(homeButton)) { homeButton.container.style.visibility = visibility; } if (defined(sceneModePicker)) { sceneModePicker.container.style.visibility = visibility; } if (defined(projectionPicker)) { projectionPicker.container.style.visibility = visibility; } if (defined(baseLayerPicker)) { baseLayerPicker.container.style.visibility = visibility; } if (defined(animation)) { animation.container.style.visibility = visibility; } if (defined(timeline)) { timeline.container.style.visibility = visibility; } if (defined(fullscreenButton) && fullscreenButton.viewModel.isFullscreenEnabled) { fullscreenButton.container.style.visibility = visibility; } if (defined(infoBox)) { infoBox.container.style.visibility = visibility; } if (defined(selectionIndicator)) { selectionIndicator.container.style.visibility = visibility; } if (viewer._container) { const right = enabled || !defined(fullscreenButton) ? 0 : fullscreenButton.container.clientWidth; viewer._vrButton.container.style.right = right + "px"; viewer.forceResize(); } }; const resizeToolbar = function(parent, child) { Array.prototype.slice.call(parent.children).forEach((element) => { switch (element.className) { case "cesium-viewer-geocoderContainer": element.customIndex = 1; break; case "cesium-button cesium-toolbar-button cesium-home-button": element.customIndex = 2; break; case "cesium-sceneModePicker-wrapper cesium-toolbar-button": element.customIndex = 3; break; case "cesium-projectionPicker-wrapper cesium-toolbar-button": element.customIndex = 4; break; case "cesium-button cesium-toolbar-button": case "cesium-baseLayerPicker-dropDown": element.customIndex = 5; break; case "cesium-navigationHelpButton-wrapper": element.customIndex = 6; break; } }); const arr = []; Array.prototype.slice.call(parent.children).forEach((element) => { arr.push(element); }); arr.sort(function(a, b) { return a.customIndex - b.customIndex; }); for (let i = 0; i < arr.length; i++) { parent.appendChild(arr[i]); } }; const getServices = function() { return mergeDescriptors.mergeDescriptors( {}, { get layout() { return layout; }, get vm() { return vcInstance; }, get Cesium() { return vcInstance.Cesium; }, get viewer() { return vcInstance.viewer; }, get dataSources() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.dataSources; }, get entities() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.entities; }, get imageryLayers() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.imageryLayers; }, get primitives() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.scene.primitives; }, get groundPrimitives() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.scene.groundPrimitives; }, get postProcessStages() { var _a; return (_a = vcInstance.viewer) == null ? void 0 : _a.postProcessStages; }, get creatingPromise() { return creatingPromise; }, /** * for mars3d only */ get mars3dMap() { return vcInstance.map; }, /** * for dc-sdk only */ get dcViewer() { return vcInstance.dcViewer; }, /** * for earth-sdk only */ get earth() { return vcInstance.earth; } } ); }; Object.defineProperties(vcInstance, { cesiumObject: { enumerable: true, get: () => vcInstance.viewer } }); vue.onMounted(async () => { var _a; try { logger.debug("viewer - onMounted"); await ((_a = globalConfig.value) == null ? void 0 : _a.__viewerUnloadingPromise); load().then((e) => { createResolve(e); }).catch((e) => { emit("unready", e); reject(e); }); } catch (e) { emit("unready", e); reject(e); } }); vue.onUnmounted(() => { logger.debug("viewer - onUnmounted"); unload().then(() => { vcMitt.all.clear(); }); }); return { isReady, load, unload, reload, getServices, viewerRef, creatingPromise }; } exports["default"] = useViewer; exports.viewerProps = viewerProps; //# sourceMappingURL=useViewer.js.map