Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

TrackController.js 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-04-01 10:36:36
  4. */
  5. import { Cesium } from '@dc-modules/namespace'
  6. import { SceneEventType, TrackEventType } from '@dc-modules/event'
  7. import State from '@dc-modules/state/State'
  8. import TrackViewMode from './TrackViewMode'
  9. class TrackController {
  10. constructor(viewer) {
  11. this._viewer = viewer
  12. this._cache = {}
  13. this._delegete = new Cesium.CustomDataSource('history-track-layer')
  14. this._viewer.dataSources.add(this._delegete)
  15. this._activedTrack = undefined
  16. this._viewMode = undefined
  17. this._viewOption = {}
  18. this._stopTime = undefined
  19. this._state = State.INITIALIZED
  20. }
  21. get delegate() {
  22. return this._delegete.entities
  23. }
  24. get state() {
  25. return this._state
  26. }
  27. /**
  28. * @private
  29. */
  30. _onPostRender() {
  31. Object.keys(this._cache).forEach(key => {
  32. let track = this._cache[key]
  33. track.trackEvent &&
  34. track.trackEvent.fire(TrackEventType.POST_RENDER, {
  35. viewer: this._viewer,
  36. viewOption: this._viewOption
  37. })
  38. })
  39. this._viewer.scene.requestRender()
  40. }
  41. /**
  42. *
  43. * @param track
  44. * @returns {TrackController}
  45. */
  46. addTrack(track) {
  47. if (
  48. track &&
  49. track.trackEvent &&
  50. !this._cache.hasOwnProperty(track.trackId)
  51. ) {
  52. track.trackEvent.fire(TrackEventType.ADD, this)
  53. this._cache[track.trackId] = track
  54. }
  55. return this
  56. }
  57. /**
  58. *
  59. * @param tracks
  60. * @returns {TrackController}
  61. */
  62. addTracks(tracks) {
  63. if (Array.isArray(tracks)) {
  64. tracks.forEach(item => {
  65. this.addTrack(item)
  66. })
  67. }
  68. return this
  69. }
  70. /**
  71. * Returns a track
  72. * @param id
  73. * @returns {*|undefined}
  74. */
  75. getTrack(id) {
  76. let filters = this.getTracks().filter(item => item.id === id)
  77. return filters && filters.length ? filters[0] : undefined
  78. }
  79. /**
  80. * Removes a track
  81. * @param track
  82. * @returns {TrackController}
  83. */
  84. removeTrack(track) {
  85. if (
  86. track &&
  87. track.trackEvent &&
  88. this._cache.hasOwnProperty(track.trackId)
  89. ) {
  90. track.trackEvent.fire(TrackEventType.REMOVE, this)
  91. delete this._cache[track.trackId]
  92. }
  93. return this
  94. }
  95. /**
  96. *
  97. * @returns {*[]}
  98. */
  99. getTracks() {
  100. let result = []
  101. Object.keys(this._cache).forEach(key => {
  102. result.push(this._cache[key])
  103. })
  104. return result
  105. }
  106. /**
  107. * Starts play all path
  108. * @returns {TrackController}
  109. */
  110. play() {
  111. let now = Cesium.JulianDate.now()
  112. Object.keys(this._cache).forEach(key => {
  113. let track = this._cache[key]
  114. track.startTime = now
  115. track.viewed = false
  116. })
  117. this._activedTrack = undefined
  118. this._stopTime = undefined
  119. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  120. this._viewer.on(SceneEventType.POST_RENDER, this._onPostRender, this)
  121. this._state = State.PLAY
  122. return this
  123. }
  124. /**
  125. *
  126. */
  127. pause() {
  128. this._stopTime = Cesium.JulianDate.now()
  129. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  130. this._viewer.delegate.trackedEntity = undefined
  131. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  132. this._state = State.PAUSE
  133. return this
  134. }
  135. /**
  136. *
  137. */
  138. restore() {
  139. if (this._state !== State.PAUSE) {
  140. return this
  141. }
  142. if (this._stopTime) {
  143. let now = Cesium.JulianDate.now()
  144. Object.keys(this._cache).forEach(key => {
  145. let track = this._cache[key]
  146. track.trackEvent.fire(TrackEventType.RESET_TIME_LINE, {
  147. stopTime: this._stopTime,
  148. duration: Cesium.JulianDate.secondsDifference(now, this._stopTime)
  149. })
  150. })
  151. }
  152. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  153. this._viewer.on(SceneEventType.POST_RENDER, this._onPostRender, this)
  154. this._state = State.PLAY
  155. return this
  156. }
  157. // /**
  158. // *
  159. // * @param speed
  160. // * @returns {TrackController}
  161. // */
  162. // changeSpeed(speed) {
  163. // this._viewer.clock.multiplier = speed
  164. // return this
  165. // }
  166. /**
  167. *
  168. * @param track
  169. * @param viewOption
  170. * @returns {TrackController}
  171. */
  172. viewTrack(track, viewOption = {}) {
  173. if (!this._cache.hasOwnProperty(track.trackId)) {
  174. throw new Error('TrackController: track does not added ')
  175. }
  176. this._viewOption = viewOption
  177. if (this._activedTrack) {
  178. this._activedTrack.viewed = false
  179. }
  180. track.viewed = true
  181. this._activedTrack = track
  182. if (viewOption.mode === TrackViewMode.FREE) {
  183. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  184. this._viewer.delegate.trackedEntity = undefined
  185. }
  186. return this
  187. }
  188. /**
  189. *
  190. * @param track
  191. * @returns {TrackController}
  192. */
  193. releaseTrack(track) {
  194. if (!this._cache.hasOwnProperty(track.trackId)) {
  195. throw new Error('TrackController: track does not added ')
  196. }
  197. if (track.viewed) {
  198. track.viewed = false
  199. }
  200. this._activedTrack = undefined
  201. this._viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
  202. this._viewer.delegate.trackedEntity = undefined
  203. return this
  204. }
  205. /**
  206. *
  207. * @returns {TrackController}
  208. */
  209. clear() {
  210. Object.keys(this._cache).forEach(key => {
  211. this.removeTrack(this._cache[key])
  212. })
  213. this._activedTrack && (this._activedTrack.viewed = false)
  214. this._activedTrack = undefined
  215. this._viewer.off(SceneEventType.POST_RENDER, this._onPostRender, this)
  216. return this
  217. }
  218. }
  219. export default TrackController