| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- /**
- * @Author: Caven
- * @Date: 2020-01-03 09:38:21
- */
-
- import { Cesium } from '@dc-modules/namespace'
- import { Util } from '@dc-modules/utils'
- import State from '@dc-modules/state/State'
- import { LayerEventType, OverlayEventType, LayerEvent } from '@dc-modules/event'
- import LayerType from './LayerType'
-
- class Layer {
- constructor(id) {
- this._id = Util.uuid()
- this._bid = id || Util.uuid()
- this._delegate = undefined
- this._viewer = undefined
- this._state = undefined
- this._show = true
- this._isGround = false
- this._cache = {}
- this._attr = {}
- this._layerEvent = new LayerEvent()
- this._layerEvent.on(LayerEventType.ADD, this._onAdd, this)
- this._layerEvent.on(LayerEventType.REMOVE, this._onRemove, this)
- }
-
- get layerId() {
- return this._id
- }
-
- get id() {
- return this._bid
- }
-
- get delegate() {
- return this._delegate
- }
-
- set show(show) {
- this._show = show
- this._delegate && (this._delegate.show = this._show)
- }
-
- get show() {
- return this._show
- }
-
- get layerEvent() {
- return this._layerEvent
- }
-
- set attr(attr) {
- this._attr = attr
- }
-
- get attr() {
- return this._attr
- }
-
- get state() {
- return this._state
- }
-
- /**
- * The hook for added
- * @private
- */
- _addedHook() {}
-
- /**
- * The hook for removed
- * @private
- */
- _removedHook() {}
-
- /**
- * The layer added callback function
- * Subclasses need to be overridden
- * @param viewer
- * @private
- */
- _onAdd(viewer) {
- this._viewer = viewer
- if (!this._delegate) {
- return
- }
- if (this._delegate instanceof Cesium.PrimitiveCollection) {
- if (this._isGround) {
- this._viewer.scene.groundPrimitives.add(this._delegate)
- } else {
- this._viewer.scene.primitives.add(this._delegate)
- }
- } else {
- this._viewer.dataSources.add(this._delegate)
- }
- this._addedHook && this._addedHook()
- this._state = State.ADDED
- }
-
- /**
- * The layer added callback function
- * Subclasses need to be overridden
- * @private
- */
- _onRemove() {
- if (!this._delegate) {
- return
- }
- if (this._viewer) {
- this._cache = {}
- if (this._delegate instanceof Cesium.PrimitiveCollection) {
- this._delegate.removeAll()
- if (this._isGround) {
- this._viewer.scene.groundPrimitives.remove(this._delegate)
- } else {
- this._viewer.scene.primitives.remove(this._delegate)
- }
- } else if (this._delegate.then) {
- this._delegate.then(dataSource => {
- dataSource.entities.removeAll()
- })
- this._viewer.dataSources.remove(this._delegate)
- } else {
- this._delegate.entities && this._delegate.entities.removeAll()
- this._viewer.dataSources.remove(this._delegate)
- }
- this._removedHook && this._removedHook()
- this._state = State.REMOVED
- }
- }
-
- /**
- * The layer add overlay
- * @param overlay
- * @private
- */
- _addOverlay(overlay) {
- if (!this._cache.hasOwnProperty(overlay.overlayId)) {
- this._cache[overlay.overlayId] = overlay
- this._delegate && overlay.fire(OverlayEventType.ADD, this)
- if (this._state === State.CLEARED) {
- this._state = State.ADDED
- }
- }
- }
-
- /**
- * The layer remove overlay
- * @param overlay
- * @private
- */
- _removeOverlay(overlay) {
- if (this._cache.hasOwnProperty(overlay.overlayId)) {
- this._delegate && overlay.fire(OverlayEventType.REMOVE, this)
- delete this._cache[overlay.overlayId]
- }
- }
-
- /**
- * Add overlay
- * @param overlay
- * @returns {Layer}
- */
- addOverlay(overlay) {
- this._addOverlay(overlay)
- return this
- }
-
- /**
- * Add overlays
- * @param overlays
- * @returns {Layer}
- */
- addOverlays(overlays) {
- if (Array.isArray(overlays)) {
- overlays.forEach(item => {
- this._addOverlay(item)
- })
- }
- return this
- }
-
- /**
- * Remove overlay
- * @param overlay
- * @returns {Layer}
- */
- removeOverlay(overlay) {
- this._removeOverlay(overlay)
- return this
- }
-
- /**
- * Returns the overlay by overlayId
- * @param overlayId
- * @returns {*|undefined}
- */
- getOverlay(overlayId) {
- return this._cache[overlayId] || undefined
- }
-
- /**
- * Returns the overlay by bid
- * @param id
- * @returns {any}
- */
- getOverlayById(id) {
- let overlay = undefined
- Object.keys(this._cache).forEach(key => {
- if (this._cache[key].id === id) {
- overlay = this._cache[key]
- }
- })
- return overlay
- }
-
- /**
- * Returns the overlays by attrName and AttrVal
- * @param attrName
- * @param attrVal
- * @returns {[]}
- */
- getOverlaysByAttr(attrName, attrVal) {
- let result = []
- this.eachOverlay(item => {
- if (item.attr[attrName] === attrVal) {
- result.push(item)
- }
- }, this)
- return result
- }
-
- /**
- * Iterate through each overlay and pass it as an argument to the callback function
- * @param method
- * @param context
- * @returns {Layer}
- */
- eachOverlay(method, context) {
- Object.keys(this._cache).forEach(key => {
- method && method.call(context || this, this._cache[key])
- })
- return this
- }
-
- /**
- * Returns all overlays
- * @returns {[]}
- */
- getOverlays() {
- let result = []
- Object.keys(this._cache).forEach(key => {
- result.push(this._cache[key])
- })
- return result
- }
-
- /**
- * Clears all overlays
- * Subclasses need to be overridden
- */
- clear() {}
-
- /**
- * Removes from the viewer
- */
- remove() {
- if (this._viewer) {
- this._viewer.removeLayer(this)
- }
- }
-
- /**
- * Adds to the viewer
- * @param viewer
- * @returns {Layer}
- */
- addTo(viewer) {
- if (viewer?.addLayer) {
- viewer.addLayer(this)
- }
- return this
- }
-
- /**
- * sets the style, the style will apply to every overlay of the layer
- * Subclasses need to be overridden
- * @param style
- */
- setStyle(style) {}
-
- /**
- * Subscribe event
- * @param type
- * @param callback
- * @param context
- * @returns {Layer}
- */
- on(type, callback, context) {
- this._layerEvent.on(type, callback, context || this)
- return this
- }
-
- /**
- * Unsubscribe event
- * @param type
- * @param callback
- * @param context
- * @returns {Layer}
- */
- off(type, callback, context) {
- this._layerEvent.off(type, callback, context || this)
- return this
- }
-
- /**
- * Trigger subscription event
- * @param type
- * @param params
- * @returns {Layer}
- */
- fire(type, params) {
- this._layerEvent.fire(type, params)
- return this
- }
-
- /**
- * Registers Type
- * @param type
- */
- static registerType(type) {
- if (type) {
- LayerType[type.toLocaleUpperCase()] = type.toLocaleLowerCase()
- }
- }
-
- /**
- * Returns type
- * @param type
- * @returns {*|undefined}
- */
- static getLayerType(type) {
- return LayerType[type.toLocaleUpperCase()] || undefined
- }
- }
-
- export default Layer
|