// 天地图影像服务
import { WebMapTileServiceImageryProvider } from 'cesium'
//地图服务枚举类型:_c为墨卡托投影,_w为经纬度投影
enum TDTLayerType {
  Vec = 'vec', //矢量底图
  Cva = 'cva', //矢量注记
  Img = 'img', //影像底图
  Cia = 'cia', //影像注记
  Ter = 'ter', //地形晕渲
  Cta = 'cta', //地形注记
  Ibo = 'ibo', //全球境界
}
enum TDTProjectionType {
  WebMercator = 'w',
  WGS84 = 'c',
}
//天地图token
const TDT_tk = '1c5b7cbf9da7d33b221f68c32b6a1791'
// 服务域名
const tdtUrl = 'https://t{s}.tianditu.gov.cn'
// 服务负载子域
const subdomains = ['0', '1', '2', '3', '4', '5', '6', '7']
/**
 * 获取天地图影像服务
 * @param layerType :影像类型
 * @param projectionType :投影类型,注WGS84下有问题
 * @param minimumLevel :最小缩放级别
 * @param maximumLevel :最大缩放级别
 * @returns :ImageryProvider
 */
export function getTDTProvider(
  layerType: string,
  projectionType: string,
  minimumLevel: number = 0,
  maximumLevel: number = 18,
) {
  // 切片方式
  const tilingScheme =
    projectionType == TDTProjectionType.WGS84
      ? new Cesium.GeographicTilingScheme()
      : new Cesium.WebMercatorTilingScheme()
  const tileMatrixLabels =
    projectionType == TDTProjectionType.WGS84
      ? new Array(19).fill(1).map((v, i) => `${i}`)
      : undefined
  const imageryProvider = new WebMapTileServiceImageryProvider({
    //影像底图
    url:
      `${tdtUrl}/DataServer?T=${layerType}_${projectionType}&x={TileCol}&y={TileRow}&l={TileMatrix}&tk=` +
      TDT_tk,
    subdomains: subdomains, //天地图8个服务器
    minimumLevel: minimumLevel, //定义最小缩放级别
    maximumLevel: maximumLevel, //定义最大缩放级别
    layer: layerType,
    style: 'default',
    format: 'tiles',
    tileMatrixSetID: projectionType, //'GoogleMapsCompatible', //使用谷歌的瓦片切片方式
    tilingScheme: tilingScheme,
    tileMatrixLabels: tileMatrixLabels,
  })
  return imageryProvider
}
/**
 * 获取天地图三维地形服务
 * @returns ImageryProvider
 */
export function getTDTTerrainProvider() {
  const terrainUrls: string[] = []

  for (let i = 0; i < subdomains.length; i++) {
    const url =
      tdtUrl.replace('{s}', subdomains[i]) +
      '/mapservice/swdx?T=elv_c&tk=' +
      TDT_tk
    terrainUrls.push(url)
  }

  const provider = new Cesium.GeoTerrainProvider({
    urls: terrainUrls,
  })
  return provider
}
export { TDTLayerType, TDTProjectionType }