You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Layer.js 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-01-03 09:38:21
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import { Util } from '@dc-modules/utils'
  7. import State from '@dc-modules/state/State'
  8. import { LayerEventType, OverlayEventType, LayerEvent } from '@dc-modules/event'
  9. import LayerType from './LayerType'
  10. class Layer {
  11. constructor(id) {
  12. this._id = Util.uuid()
  13. this._bid = id || Util.uuid()
  14. this._delegate = undefined
  15. this._viewer = undefined
  16. this._state = undefined
  17. this._show = true
  18. this._cache = {}
  19. this._attr = {}
  20. this._layerEvent = new LayerEvent()
  21. this._layerEvent.on(LayerEventType.ADD, this._onAdd, this)
  22. this._layerEvent.on(LayerEventType.REMOVE, this._onRemove, this)
  23. this._state = undefined
  24. this.type = undefined
  25. }
  26. get layerId() {
  27. return this._id
  28. }
  29. get id() {
  30. return this._bid
  31. }
  32. get delegate() {
  33. return this._delegate
  34. }
  35. set show(show) {
  36. this._show = show
  37. this._delegate && (this._delegate.show = this._show)
  38. }
  39. get show() {
  40. return this._show
  41. }
  42. get layerEvent() {
  43. return this._layerEvent
  44. }
  45. set attr(attr) {
  46. this._attr = attr
  47. }
  48. get attr() {
  49. return this._attr
  50. }
  51. get state() {
  52. return this._state
  53. }
  54. /**
  55. * The hook for added
  56. * @private
  57. */
  58. _addedHook() {}
  59. /**
  60. * The hook for removed
  61. * @private
  62. */
  63. _removedHook() {}
  64. /**
  65. * The layer added callback function
  66. * Subclasses need to be overridden
  67. * @param viewer
  68. * @private
  69. */
  70. _onAdd(viewer) {
  71. this._viewer = viewer
  72. if (!this._delegate) {
  73. return
  74. }
  75. if (this._delegate instanceof Cesium.PrimitiveCollection) {
  76. this._viewer.scene.primitives.add(this._delegate)
  77. } else {
  78. this._viewer.dataSources.add(this._delegate)
  79. }
  80. this._addedHook && this._addedHook()
  81. this._state = State.ADDED
  82. }
  83. /**
  84. * The layer added callback function
  85. * Subclasses need to be overridden
  86. * @private
  87. */
  88. _onRemove() {
  89. if (!this._delegate) {
  90. return
  91. }
  92. if (this._viewer) {
  93. this._cache = {}
  94. if (this._delegate instanceof Cesium.PrimitiveCollection) {
  95. this._delegate.removeAll()
  96. this._viewer.scene.primitives.remove(this._delegate)
  97. } else if (this._delegate.then) {
  98. this._delegate.then(dataSource => {
  99. dataSource.entities.removeAll()
  100. })
  101. this._viewer.dataSources.remove(this._delegate)
  102. } else {
  103. this._delegate.entities && this._delegate.entities.removeAll()
  104. this._viewer.dataSources.remove(this._delegate)
  105. }
  106. this._removedHook && this._removedHook()
  107. this._state = State.REMOVED
  108. }
  109. }
  110. /**
  111. * The layer add overlay
  112. * @param overlay
  113. * @private
  114. */
  115. _addOverlay(overlay) {
  116. if (
  117. overlay &&
  118. overlay.overlayEvent &&
  119. !this._cache.hasOwnProperty(overlay.overlayId)
  120. ) {
  121. overlay.overlayEvent.fire(OverlayEventType.ADD, this)
  122. this._cache[overlay.overlayId] = overlay
  123. if (this._state === State.CLEARED) {
  124. this._state = State.ADDED
  125. }
  126. }
  127. }
  128. /**
  129. * The layer remove overlay
  130. * @param overlay
  131. * @private
  132. */
  133. _removeOverlay(overlay) {
  134. if (
  135. overlay &&
  136. overlay.overlayEvent &&
  137. this._cache.hasOwnProperty(overlay.overlayId)
  138. ) {
  139. overlay.overlayEvent.fire(OverlayEventType.REMOVE, this)
  140. delete this._cache[overlay.overlayId]
  141. }
  142. }
  143. /**
  144. * Add overlay
  145. * @param overlay
  146. * @returns {Layer}
  147. */
  148. addOverlay(overlay) {
  149. this._addOverlay(overlay)
  150. return this
  151. }
  152. /**
  153. * Add overlays
  154. * @param overlays
  155. * @returns {Layer}
  156. */
  157. addOverlays(overlays) {
  158. if (Array.isArray(overlays)) {
  159. overlays.forEach(item => {
  160. this._addOverlay(item)
  161. })
  162. }
  163. return this
  164. }
  165. /**
  166. * Remove overlay
  167. * @param overlay
  168. * @returns {Layer}
  169. */
  170. removeOverlay(overlay) {
  171. this._removeOverlay(overlay)
  172. return this
  173. }
  174. /**
  175. * Returns the overlay by overlayId
  176. * @param overlayId
  177. * @returns {*|undefined}
  178. */
  179. getOverlay(overlayId) {
  180. return this._cache[overlayId] || undefined
  181. }
  182. /**
  183. * Returns the overlay by bid
  184. * @param id
  185. * @returns {any}
  186. */
  187. getOverlayById(id) {
  188. let overlay = undefined
  189. Object.keys(this._cache).forEach(key => {
  190. if (this._cache[key].id === id) {
  191. overlay = this._cache[key]
  192. }
  193. })
  194. return overlay
  195. }
  196. /**
  197. * Returns the overlays by attrName and AttrVal
  198. * @param attrName
  199. * @param attrVal
  200. * @returns {[]}
  201. */
  202. getOverlaysByAttr(attrName, attrVal) {
  203. let result = []
  204. this.eachOverlay(item => {
  205. if (item.attr[attrName] === attrVal) {
  206. result.push(item)
  207. }
  208. }, this)
  209. return result
  210. }
  211. /**
  212. * Iterate through each overlay and pass it as an argument to the callback function
  213. * @param method
  214. * @param context
  215. * @returns {Layer}
  216. */
  217. eachOverlay(method, context) {
  218. Object.keys(this._cache).forEach(key => {
  219. method && method.call(context || this, this._cache[key])
  220. })
  221. return this
  222. }
  223. /**
  224. * Returns all overlays
  225. * @returns {[]}
  226. */
  227. getOverlays() {
  228. let result = []
  229. Object.keys(this._cache).forEach(key => {
  230. result.push(this._cache[key])
  231. })
  232. return result
  233. }
  234. /**
  235. * Clears all overlays
  236. * Subclasses need to be overridden
  237. */
  238. clear() {}
  239. /**
  240. * Removes from the viewer
  241. */
  242. remove() {
  243. if (this._viewer) {
  244. this._viewer.removeLayer(this)
  245. }
  246. }
  247. /**
  248. * Adds to the viewer
  249. * @param viewer
  250. * @returns {Layer}
  251. */
  252. addTo(viewer) {
  253. if (viewer && viewer.addLayer) {
  254. viewer.addLayer(this)
  255. }
  256. return this
  257. }
  258. /**
  259. * sets the style, the style will apply to every overlay of the layer
  260. * Subclasses need to be overridden
  261. * @param style
  262. */
  263. setStyle(style) {}
  264. /**
  265. * Registers Type
  266. * @param type
  267. */
  268. static registerType(type) {
  269. if (type) {
  270. LayerType[type.toLocaleUpperCase()] = type.toLocaleLowerCase()
  271. }
  272. }
  273. /**
  274. * Returns type
  275. * @param type
  276. * @returns {*|undefined}
  277. */
  278. static getLayerType(type) {
  279. return LayerType[type.toLocaleUpperCase()] || undefined
  280. }
  281. }
  282. export default Layer