您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Overlay.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-01-03 12:18:17
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import State from '@dc-modules/state/State'
  7. import { Util } from '@dc-modules/utils'
  8. import { OverlayEventType, OverlayEvent } from '@dc-modules/event'
  9. import OverlayType from './OverlayType'
  10. class Overlay {
  11. constructor() {
  12. this._id = Util.uuid()
  13. this._bid = Util.uuid() // Business id
  14. this._delegate = undefined
  15. this._layer = undefined
  16. this._state = undefined
  17. this._show = true
  18. this._style = {}
  19. this._attr = {}
  20. this._allowDrillPicking = false
  21. this._contextMenu = []
  22. this._overlayEvent = new OverlayEvent()
  23. this.type = undefined
  24. this.on(OverlayEventType.ADD, this._onAdd, this)
  25. this.on(OverlayEventType.REMOVE, this._onRemove, this)
  26. }
  27. get overlayId() {
  28. return this._id
  29. }
  30. set id(id) {
  31. this._bid = id
  32. return this
  33. }
  34. get id() {
  35. return this._bid
  36. }
  37. set show(show) {
  38. this._show = show
  39. this._delegate && (this._delegate.show = this._show)
  40. return this
  41. }
  42. get show() {
  43. return this._show
  44. }
  45. set attr(attr) {
  46. this._attr = attr
  47. return this
  48. }
  49. get attr() {
  50. return this._attr
  51. }
  52. set allowDrillPicking(allowDrillPicking) {
  53. this._allowDrillPicking = allowDrillPicking
  54. return this
  55. }
  56. get allowDrillPicking() {
  57. return this._allowDrillPicking
  58. }
  59. get overlayEvent() {
  60. return this._overlayEvent
  61. }
  62. get delegate() {
  63. return this._delegate
  64. }
  65. get state() {
  66. return this._state
  67. }
  68. set contextMenu(menus) {
  69. this._contextMenu = menus
  70. return this
  71. }
  72. get contextMenu() {
  73. return this._contextMenu
  74. }
  75. /**
  76. * The hook for mount layer
  77. * Subclasses need to be overridden
  78. * @private
  79. */
  80. _mountedHook() {}
  81. /**
  82. * The hook for added
  83. * @returns {boolean}
  84. * @private
  85. */
  86. _addedHook() {
  87. if (!this._delegate) {
  88. return false
  89. }
  90. this._delegate.layerId = this._layer?.layerId
  91. this._delegate.overlayId = this._id
  92. }
  93. /**
  94. * The hook for removed
  95. * Subclasses need to be overridden
  96. * @private
  97. */
  98. _removedHook() {}
  99. /**
  100. * Add handler
  101. * @param layer
  102. * @private
  103. */
  104. _onAdd(layer) {
  105. if (!layer) {
  106. return
  107. }
  108. this._layer = layer
  109. this._mountedHook && this._mountedHook()
  110. // for Entity
  111. if (this._layer?.delegate?.entities && this._delegate) {
  112. this._layer.delegate.entities.add(this._delegate)
  113. } else if (this._layer?.delegate?.add && this._delegate) {
  114. // for Primitive
  115. if (this.type === 'point_primitive' && this._layer.points) {
  116. this._delegate = this._layer.points.add(this._delegate)
  117. } else if (
  118. this.type === 'billboard_primitive' &&
  119. this._layer.billboards
  120. ) {
  121. this._delegate = this._layer.billboards.add(this._delegate)
  122. } else if (this.type === 'polyline_primitive' && this._layer.polylines) {
  123. this._delegate = this._layer.polylines.add(this._delegate)
  124. } else if (this.type === 'label_primitive' && this._layer.labels) {
  125. this._delegate = this._layer.labels.add(this._delegate)
  126. } else {
  127. this._layer.delegate.add(this._delegate)
  128. }
  129. }
  130. this._addedHook && this._addedHook()
  131. this._state = State.ADDED
  132. }
  133. /**
  134. * Remove handler
  135. * @private
  136. */
  137. _onRemove() {
  138. if (!this._layer || !this._delegate) {
  139. return
  140. }
  141. // for Entity
  142. if (this._layer?.delegate?.entities) {
  143. this._layer.delegate.entities.remove(this._delegate)
  144. } else if (this._layer?.delegate?.remove) {
  145. // for Primitive
  146. if (this.type === 'point_primitive' && this._layer.points) {
  147. this._layer.points.remove(this._delegate)
  148. } else if (
  149. this.type === 'billboard_primitive' &&
  150. this._layer.billboards
  151. ) {
  152. this._layer.billboards.remove(this._delegate)
  153. } else if (this.type === 'polyline_primitive' && this._layer.polylines) {
  154. this._layer.polylines.remove(this._delegate)
  155. } else if (this.type === 'label_primitive' && this._layer.labels) {
  156. this._layer.labels.remove(this._delegate)
  157. } else {
  158. this._layer.delegate.remove(this._delegate)
  159. }
  160. }
  161. this._removedHook && this._removedHook()
  162. this._state = State.REMOVED
  163. }
  164. /**
  165. * Sets Text with Style
  166. * @param text
  167. * @param textStyle
  168. * @returns {Overlay}
  169. */
  170. setLabel(text, textStyle) {
  171. if (!this._delegate) {
  172. return this
  173. }
  174. if (this._delegate instanceof Cesium.Entity) {
  175. this._delegate.label = {
  176. ...textStyle,
  177. text: text
  178. }
  179. }
  180. return this
  181. }
  182. /**
  183. * Sets style
  184. * @param style
  185. * @returns {Overlay}
  186. */
  187. setStyle(style) {
  188. return this
  189. }
  190. /**
  191. * Removes from layer
  192. * @returns {Overlay}
  193. */
  194. remove() {
  195. if (this._layer) {
  196. this._layer.removeOverlay(this)
  197. }
  198. return this
  199. }
  200. /**
  201. * adds to layer
  202. * @param layer
  203. * @returns {Overlay}
  204. */
  205. addTo(layer) {
  206. if (layer && layer.addOverlay) {
  207. layer.addOverlay(this)
  208. }
  209. return this
  210. }
  211. /**
  212. * Subscribe event
  213. * @param type
  214. * @param callback
  215. * @param context
  216. * @returns {Overlay}
  217. */
  218. on(type, callback, context) {
  219. this._overlayEvent.on(type, callback, context || this)
  220. return this
  221. }
  222. /**
  223. * Unsubscribe event
  224. * @param type
  225. * @param callback
  226. * @param context
  227. * @returns {Overlay}
  228. */
  229. off(type, callback, context) {
  230. this._overlayEvent.off(type, callback, context || this)
  231. return this
  232. }
  233. /**
  234. * Trigger subscription event
  235. * @param type
  236. * @param params
  237. * @returns {Overlay}
  238. */
  239. fire(type, params) {
  240. this._overlayEvent.fire(type, params)
  241. return this
  242. }
  243. /**
  244. *
  245. * @param type
  246. */
  247. static registerType(type) {
  248. if (type) {
  249. OverlayType[type.toLocaleUpperCase()] = type.toLocaleLowerCase()
  250. }
  251. }
  252. /**
  253. *
  254. * @param type
  255. * @returns {*|undefined}
  256. */
  257. static getOverlayType(type) {
  258. return OverlayType[type.toLocaleUpperCase()] || undefined
  259. }
  260. }
  261. export default Overlay