| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | 
                        - /**
 -  * @Author: Caven
 -  * @Date: 2021-06-08 20:41:51
 -  */
 - 
 - import { Cesium } from '@dc-modules/namespace'
 - import State from '@dc-modules/state/State'
 - import Parse from '@dc-modules/parse/Parse'
 - import { PathEventType, PathEvent } from '@dc-modules/event'
 - import { Util } from '@dc-modules/utils'
 - import { Transform } from '@dc-modules/transform'
 - import { heading, distance } from '@dc-modules/math'
 - 
 - class RoamingPath {
 -   constructor(positions, duration, pathMode) {
 -     this._id = Util.uuid()
 -     this._bid = undefined
 -     this._positions = Parse.parsePositions(positions)
 -     this._duration = duration || 20
 -     this._pathMode = pathMode || 'speed'
 -     this._timeLine = []
 -     this._sampledPosition = undefined
 -     this._actived = false
 -     this._endTime = Cesium.JulianDate.now()
 -     this._pathEvent = new PathEvent()
 -     this._pathEvent.on(PathEventType.ADD, this._onAdd, this)
 -     this._pathEvent.on(PathEventType.REMOVE, this._onRemove, this)
 -     this._pathEvent.on(PathEventType.POST_RENDER, this._onPostRender, this)
 -     this._pathEvent.on(PathEventType.RESET_TIME_LINE, this._resetTimeLine, this)
 -     this._state = State.INITIALIZED
 -   }
 - 
 -   get pathId() {
 -     return this._id
 -   }
 - 
 -   set id(id) {
 -     this._bid = id
 -     return this
 -   }
 - 
 -   get id() {
 -     return this._bid
 -   }
 - 
 -   set positions(postions) {
 -     this._positions = Parse.parsePositions(postions)
 -     return this
 -   }
 - 
 -   get positions() {
 -     return this._positions
 -   }
 - 
 -   set duration(duration) {
 -     this._duration = duration
 -     return this
 -   }
 - 
 -   get duration() {
 -     return this._duration
 -   }
 - 
 -   set pathMode(pathMode) {
 -     this._pathMode = pathMode
 -     return this
 -   }
 - 
 -   get pathMode() {
 -     return this._pathMode
 -   }
 - 
 -   get pathEvent() {
 -     return this._pathEvent
 -   }
 - 
 -   set actived(actived) {
 -     this._actived = actived
 -     return this
 -   }
 - 
 -   get actived() {
 -     return this._actived
 -   }
 - 
 -   get state() {
 -     return this._state
 -   }
 - 
 -   _onAdd() {
 -     this._state = State.ADDED
 -   }
 - 
 -   _onRemove() {
 -     this._state = State.REMOVED
 -   }
 - 
 -   /**
 -    *
 -    * @param viewer
 -    * @param viewOption
 -    * @private
 -    */
 -   _onPostRender({ viewer, viewOption }) {
 -     if (!this.actived) {
 -       return false
 -     }
 -     let now = Cesium.JulianDate.now()
 -     if (
 -       Cesium.JulianDate.lessThan(now, this._endTime) &&
 -       this._sampledPosition
 -     ) {
 -       let p = this._sampledPosition.getValue(now)
 -       let next_p = this._sampledPosition.getValue(
 -         Cesium.JulianDate.addSeconds(now, 0.001, new Cesium.JulianDate())
 -       )
 -       if (p && next_p) {
 -         viewer.camera.lookAt(
 -           p,
 -           new Cesium.HeadingPitchRange(
 -             heading(p, next_p),
 -             Cesium.Math.toRadians(viewOption?.pitch || -20),
 -             viewOption?.range || 2000
 -           )
 -         )
 -       }
 -     } else {
 -       viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
 -       this._actived = false
 -     }
 -   }
 - 
 -   /**
 -    *
 -    * @private
 -    */
 -   _resetTimeLine() {
 -     if (!this._positions || !this._positions.length) {
 -       return false
 -     }
 -     let now = Cesium.JulianDate.now()
 -     let interval = 0
 -     let timeLine = []
 -     if (this._pathMode === 'speed') {
 -       let v = distance(this._positions) / this._duration
 -       timeLine = this._positions.map((item, index, arr) => {
 -         if (index !== 0) {
 -           interval += distance([arr[index - 1], item]) / v
 -         }
 -         return Cesium.JulianDate.addSeconds(
 -           now,
 -           interval,
 -           new Cesium.JulianDate()
 -         )
 -       })
 -     } else {
 -       let len = this._positions.length
 -       let interval = (this._duration - (this._duration % len)) / len
 -       timeLine = this._positions.map((item, index) => {
 -         return Cesium.JulianDate.addSeconds(
 -           now,
 -           index * interval,
 -           new Cesium.JulianDate()
 -         )
 -       })
 -     }
 -     this._sampledPosition = new Cesium.SampledPositionProperty()
 -     this._sampledPosition.addSamples(
 -       timeLine,
 -       Transform.transformWGS84ArrayToCartesianArray(this._positions)
 -     )
 -     this._sampledPosition.forwardExtrapolationType =
 -       Cesium.ExtrapolationType.HOLD
 -     this._sampledPosition.setInterpolationOptions({
 -       interpolationDegree: 2,
 -       interpolationAlgorithm: Cesium.HermitePolynomialApproximation
 -     })
 -     this._endTime = timeLine[timeLine.length - 1]
 -     this._actived = true
 -   }
 - }
 - 
 - export default RoamingPath
 
 
  |