类名 common/document/layer/baseLayer/MapImageLayer.js
import Layer from './Layer'
import { defaultValue, toJSON } from '../../../util'
import { Collection, Projection } from '../../../base'
import Extent from '../../../base/geometry/Extent'
import SubLayer from './SubLayer'
import { SpatialReference } from '../../../base/geometry'

/**
 * 影像图层基类
 * @class MapImageLayer
 * @moduleEX LayerModule
 * @classdesc 影像图层基类
 * @extends Layer
 * @param {Object} options 构造参数
 * @param {Number} [options.minScale = 0] 最小缩放级别
 * @param {Number} [options.maxScale = 20] 最大缩放级别
 * @param {String} [options.tokenKey = undefined] token名
 * @param {String} [options.tokenValue = undefined] token值
 */
class MapImageLayer extends Layer {
  constructor(options) {
    super(options)

    options = defaultValue(options, {})

    /**
     * 服务基地址
     * @readonly
     * @member {String} MapImageLayer.prototype.url
     */
    this.url = defaultValue(options.url, '')

    /**
     * 地图名称
     * @readonly
     * @member {String} MapImageLayer.prototype.mapName
     */
    this.mapName = defaultValue(options.mapName, undefined)

    /**
     * 地图文档信息
     * @readonly
     * @member {String} MapImageLayer.prototype.documentInfo
     */
    this.documentInfo = defaultValue(options.documentInfo, undefined)
    /**
     * 可提供的服务
     * @readonly
     * @member {String} MapImageLayer.prototype.capabilities
     */
    this.capabilities = []
    /**
     * 渲染模式,分为瓦片渲染'tile'和图像渲染'image'
     * @member {String} MapImageLayer.prototype.renderMode
     */
    this.renderMode = defaultValue(options.renderMode, 'tile')
    /**
     * 瓦片化显示时,瓦片宽度
     * @member {Number} MapImageLayer.prototype.imageWidth
     */
    this.imageWidth = defaultValue(options.imageWidth, 256)
    /**
     * 瓦片化显示时,瓦片高度
     * @member {Number} MapImageLayer.prototype.imageHeight
     */
    this.imageHeight = defaultValue(options.imageHeight, 256)
    /**
     * 图片格式
     * @member {String} MapImageLayer.prototype.imageFormat
     */
    this.imageFormat = defaultValue(options.imageFormat, 'png')
    /**
     * 图片中没有数据的地方是否透明
     * @member {Boolean} MapImageLayer.prototype.imageTransparency
     */
    this.imageTransparency = defaultValue(options.imageTransparency, true)
    /**
     * 所有子图层信息
     * @member {Collection} MapImageLayer.prototype.allSublayers
     */
    this.allSublayers = new Collection()

    /**
     * 是否开启动态投影
     * @member {Boolean} ArcGISMapImageLayer.prototype.dynamicProjectionEnabled
     */
    this.dynamicProjectionEnabled = defaultValue(
      options.dynamicProjectionEnabled,
      false
    )

    // 服务范围原始范围,记录着从服务元数据中获取的范围。
    this._extentSrc = options.extent
      ? Extent.fromJSON(options.extent)
      : undefined

    // 服务原始空间参照系,记录着从服务元数据中获取的空间参照系
    this._spatialReferenceSrc = defaultValue(
      options.spatialReference,
      undefined
    )

    // 子图层私有对象
    this._sublayers = defaultValue(options.sublayers, new Collection())
    // 透明度私有对象
    this._opacity = defaultValue(options.opacity, 1)
  }

  /**
   * @description 转换为json对象
   * @return {Object} json对象
   */
  toJSON() {
    const json = super.toJSON()
    json.url = this.url
    json.mapName = this.mapName
    json.documentInfo = this.documentInfo
    json.capabilities = this.capabilities
    json.imageWidth = this.imageWidth
    json.imageHeight = this.imageHeight
    json.imageFormat = this.imageFormat
    json.imageTransparency = this.imageTransparency
    json.dynamicProjectionEnabled = this.dynamicProjectionEnabled
    json.spatialReference = toJSON(this.spatialReference, SpatialReference)
    json.extent = toJSON(this.extent, Extent)

    const _sublayers = []
    this.sublayers.forEach(function (sublayer) {
      _sublayers.push(
        sublayer instanceof SubLayer ? sublayer.toJSON() : sublayer
      )
    })
    json.sublayers = _sublayers

    const _allSublayers = []
    this.allSublayers.forEach(function (sublayer) {
      _allSublayers.push(sublayer.toJSON())
    })
    json.allSublayers = _allSublayers

    return json
  }

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

Object.defineProperties(MapImageLayer.prototype, {
  /**
   * 图层范围,从服务中读取,仅会请求在该范围内的瓦片
   * @readonly
   * @member {String} MapImageLayer.prototype.extent
   */
  extent: {
    get() {
      if (!self.spatialReference) {
        return this._extentSrc
      }
      if (self.spatialReference.equals(self._spatialReferenceSrc)) {
        return this._extentSrc
      } else {
        return Projection.project(this._extentSrc, self.spatialReference)
      }
    }
  },

  /**
   * 图层坐标系对象
   * @member Layer.prototype.spatialReference
   * @type {SpatialReference}
   */
  spatialReference: {
    get() {
      return this._spatialReferenceSrc
    },
    set(value) {
      // dynamicProjectionEnabled参数暂不会影响MapImageLayer的空间参考系
      this._spatialReferenceSrc = value
    }
  }
})

export default MapImageLayer
构造函数
成员变量
方法
事件