类名 common/document/layer/igserver/IGSSceneLayer.js
import { Zondy } from '../../../base'
import { SceneServer } from '../../../service'
import { defaultValue, Log, toJSON } from '../../../util'
import { LayerType, LoadStatus } from '../../../base/enum'
import { SceneLayer } from '../baseLayer'
import Scene from './Scene'
import IGSSceneSubLayer from './IGSSceneSubLayer'
import { jsonClone } from '../../../util/Utils'

/**
 * IGS的SceneLayer图层
 * @class IGSSceneLayer
 * @moduleEX LayerModule
 * @extends SceneLayer
 * @param {Object} options 构造参数
 * @param {String} [options.url] 服务基地址
 * @param {Object} [options.extendProps] 存储额外参数的属性
 */
class IGSSceneLayer extends SceneLayer {
  constructor(options) {
    super(options)
    options = defaultValue(options, {})

    /**
     * 服务基地址
     * @member {String} IGSSceneLayer.prototype.url
     */
    this.url = defaultValue(options.url, '')
    /**
     * 图层类型
     * @member {String} IGSSceneLayer.prototype.type
     */
    this.type = LayerType.scene
    /**
     * 服务版本号
     * @member {String} IGSSceneLayer.prototype.version
     */
    this.version = undefined
    /**
     * 模型外包盒
     * @member {Object} IGSSceneLayer.prototype.boundingVolume
     */
    this.boundingVolume = undefined
    /**
     * 模型外包球
     * @readonly
     * @member {Object} IGSSceneLayer.prototype.boundingSphere
     */
    this.boundingSphere = undefined
    /**
     * 服务名
     * @member {String} IGSSceneLayer.prototype.sceneName
     */
    this.sceneName = undefined
    /**
     * 服务包含的表字段数组
     * @member {String} IGSSceneLayer.prototype.fieldInfo
     */
    this.fieldInfo = undefined
    /**
     * 模型位置
     * @member {Object} IGSSceneLayer.prototype.position
     */
    this.position = undefined
    /**
     * 模型坐标系
     * @member {Object} IGSSceneLayer.prototype.spatialReference
     */
    this.spatialReference = undefined
    /**
     * 描述信息
     * @member {String} IGSSceneLayer.prototype.description
     */
    this.description = '场景图层'
    /**
     * 场景集合
     * @member {Array<Scene>} IGSSceneLayer.prototype.scenes
     */
    this.scenes = defaultValue(options.scenes, [])

    this._sceneServer = new SceneServer({
      url: this.url
    })
  }

  load() {
    const self = this
    return this._sceneServer
      .queryServerInfo()
      .then((result) => {
        Log.info('SceneServer信息查询成功:', result)
        const data = result.data
        // igs2.0
        if (
          self.url.indexOf('/igs/rest/services/') > -1 &&
          self.url.indexOf('/SceneServer') > -1
        ) {
          const sceneOptions = JSON.parse(JSON.stringify(data))
          sceneOptions.layer = self

          self.sceneName = data.dataName
          self.documentInfo = data
          const sceneRange = data.sceneRange
          self.boundingSphere = {}
          self.boundingSphere.center = Cesium.Cartesian3.fromDegrees(
            (sceneRange.xMin + sceneRange.xMax) / 2,
            (sceneRange.yMin + sceneRange.yMax) / 2
          )
          const diff = Cesium.Cartesian3.fromDegrees(
            sceneRange.xMax - sceneRange.xMin,
            sceneRange.yMax - sceneRange.yMin
          )
          self.boundingSphere.radius = Math.abs(Math.min(diff.x, diff.y))
          return self._sceneServer.queryLayerListInfo().then((listInfoData) => {
            const layers = listInfoData.data.layers
            function setLayers(layers, _subLayers) {
              for (let i = 0; i < layers.length; i++) {
                if (
                  layers[i].layerType === '9' &&
                  Array.isArray(layers[i].children)
                ) {
                  setLayers(layers[i].children, _subLayers)
                } else {
                  layers[i].layer = self
                  _subLayers.push(new IGSSceneSubLayer(layers[i]))
                }
              }
            }
            const _subLayers = []
            setLayers(layers, _subLayers)
            sceneOptions.sublayers = _subLayers
            // 如果有场景,仅取第一个场景,获取其下子图层的extendOptions参数
            if (self.scenes.length >= 1) {
              const _sceneSubLayers = self.scenes[0].sublayers
              for (let i = 0; i < _sceneSubLayers.length; i++) {
                for (let j = 0; j < _subLayers.length; j++) {
                  if (
                    _sceneSubLayers[i].id === _subLayers[j].id &&
                    _sceneSubLayers[i].extendOptions
                  ) {
                    _subLayers[j].extendOptions = Object.assign(
                      _subLayers[j].extendOptions,
                      _sceneSubLayers[i].extendOptions
                    )
                  }
                }
              }
            }
            self.scenes = [new Scene(sceneOptions)]
            self.activeScene = self.scenes[0]
            return new Promise((resolve) => {
              self.loadStatus = LoadStatus.loaded
              self.loaded = true
              resolve(self)
            })
          })
        } else if (self.url.indexOf('/igs/rest/g3d/') > -1) {
          const sceneInfos = data.sceneInfos
          self.scenes = []
          for (let i = 0; i < sceneInfos.length; i++) {
            self.scenes.push(new Scene(sceneInfos[i]))
            const layers = sceneInfos[i].layers
            for (let j = 0; j < layers.length; j++) {
              layers[j].layer = self
              self.scenes[i].sublayers.push(new IGSSceneSubLayer(layers[j]))
            }
          }
          self.activeScene = self.scenes[0]
          self.sceneName = self.activeScene.sceneName
          self.documentInfo = data
          return new Promise((resolve) => {
            self.loadStatus = LoadStatus.loaded
            self.loaded = true
            resolve(self)
          })
        }
      })
      .catch((result) => {
        Log.info('SceneServer信息查询失败:', result)
      })
  }

  /**
   * @description 转换为json对象
   * @return {Object} json对象
   */
  toJSON() {
    const json = super.toJSON()
    json.url = this.url
    json.version = this.version
    json.boundingVolume = this.boundingVolume
    json.sceneName = this.sceneName
    json.fieldInfo = this.fieldInfo
    json.position = this.position
    json.documentInfo = this.documentInfo
    json.activeScene = toJSON(this.activeScene, Scene)
    json.boundingSphere = {
      radius: this.boundingSphere.radius,
      center: {
        x: this.boundingSphere.center.x,
        y: this.boundingSphere.center.y,
        z: this.boundingSphere.center.z
      }
    }

    const _scenes = []
    for (let i = 0; i < this.scenes.length; i++) {
      _scenes.push(toJSON(this.scenes[i], Scene))
    }
    json.scenes = _scenes

    return json
  }

  static fromJSON(json) {
    json = jsonClone(json)
    const _layer = new IGSSceneLayer(json)
    _layer._isFromJSON = true
    _layer.documentInfo = json.documentInfo
    _layer.boundingSphere = json.boundingSphere
    _layer.boundingSphere.center = new Cesium.Cartesian3(
      json.boundingSphere.center.x,
      json.boundingSphere.center.y,
      json.boundingSphere.center.z
    )
    const _scenes = []
    for (let i = 0; i < json.scenes.length; i++) {
      _scenes.push(new Scene(json.scenes[i]))
    }
    _layer.scenes = _scenes
    for (let i = 0; i < _layer.scenes.length; i++) {
      for (let j = 0; j < _layer.scenes[i].sublayers.length; j++) {
        _layer.scenes[i].sublayers[j] = new IGSSceneSubLayer(
          _layer.scenes[i].sublayers[j]
        )
      }
    }
    _layer.activeScene = _scenes[0]

    return _layer
  }

  /**
   * @description 克隆方法
   * @return {IGSSceneLayer} 图层
   */
  clone() {
    return new IGSSceneLayer(this.toJSON())
  }
}

Zondy.Layer.IGSSceneLayer = IGSSceneLayer
export default IGSSceneLayer
构造函数
成员变量
方法
事件